From fa2186656841d5aaee01b4b5d367574884d86982 Mon Sep 17 00:00:00 2001 From: dotCooCoo Date: Sun, 1 Nov 2026 04:53:50 +0700 Subject: [PATCH 1/2] Properties: an Objects on Path group shows Objects on Path Options with Pivot and Rotate Squashed from #4985 onto main. --- crates/ui-egui/src/i18n/bg.tsv | 2 + crates/ui-egui/src/i18n/bs.tsv | 2 + crates/ui-egui/src/i18n/ca.tsv | 2 + crates/ui-egui/src/i18n/cs.tsv | 2 + crates/ui-egui/src/i18n/da.tsv | 2 + crates/ui-egui/src/i18n/de.tsv | 2 + crates/ui-egui/src/i18n/el.tsv | 2 + crates/ui-egui/src/i18n/es.tsv | 2 + crates/ui-egui/src/i18n/fi.tsv | 2 + crates/ui-egui/src/i18n/fr.tsv | 2 + crates/ui-egui/src/i18n/hu.tsv | 2 + crates/ui-egui/src/i18n/id.tsv | 2 + crates/ui-egui/src/i18n/it.tsv | 2 + crates/ui-egui/src/i18n/ja.tsv | 2 + crates/ui-egui/src/i18n/ka.tsv | 2 + crates/ui-egui/src/i18n/ko.tsv | 2 + crates/ui-egui/src/i18n/nl.tsv | 2 + crates/ui-egui/src/i18n/pl.tsv | 2 + crates/ui-egui/src/i18n/pt-br.tsv | 2 + crates/ui-egui/src/i18n/ru.tsv | 2 + crates/ui-egui/src/i18n/sv.tsv | 2 + crates/ui-egui/src/i18n/tr.tsv | 2 + crates/ui-egui/src/i18n/uk.tsv | 2 + crates/ui-egui/src/i18n/vi.tsv | 2 + crates/ui-egui/src/i18n/zh-hans.tsv | 2 + crates/ui-egui/src/i18n/zh-hant.tsv | 2 + crates/ui-egui/src/panels/properties.rs | 69 +++++++++++++++++ crates/ui-egui/src/panels/properties/tests.rs | 74 +++++++++++++++++++ docs/target-app-parity.md | 1 + 29 files changed, 196 insertions(+) diff --git a/crates/ui-egui/src/i18n/bg.tsv b/crates/ui-egui/src/i18n/bg.tsv index 7f98dbf00..59f1b3090 100644 --- a/crates/ui-egui/src/i18n/bg.tsv +++ b/crates/ui-egui/src/i18n/bg.tsv @@ -1425,6 +1425,8 @@ font-technology Variable Променливи Objects on Path Обекти по пътя Attach Прикрепяне Objects on Path Options Опции за обекти по пътя + Pivot: Опорна точка: + Rotate: Завъртане: Objects on Path Tool Инструмент „Обекти по пътя“ Pivot: Опорна точка: Rotate: Завъртане: diff --git a/crates/ui-egui/src/i18n/bs.tsv b/crates/ui-egui/src/i18n/bs.tsv index 7184e1b27..9229cafa1 100644 --- a/crates/ui-egui/src/i18n/bs.tsv +++ b/crates/ui-egui/src/i18n/bs.tsv @@ -1609,6 +1609,8 @@ digits Malayalam Malajalam Objects on Path Objekti na putanji Attach Priloži Objects on Path Options Opcije objekata na putanji + Pivot: Tačka oslonca: + Rotate: Rotacija: Objects on Path Tool Alat objekti na putanji Pivot: Tačka okretanja: Rotate: Rotacija: diff --git a/crates/ui-egui/src/i18n/ca.tsv b/crates/ui-egui/src/i18n/ca.tsv index 6e05cf66c..08d224589 100644 --- a/crates/ui-egui/src/i18n/ca.tsv +++ b/crates/ui-egui/src/i18n/ca.tsv @@ -2639,6 +2639,8 @@ digits Malayalam Malaiàlam Objects Objectes Objects on Path Objectes sobre el traçat Objects on Path Options Opcions dels objectes sobre el traçat + Pivot: Punt de pivot: + Rotate: Rotació: Objects on Path Tool Eina d’objectes sobre el traçat Pivot: Punt de pivot: Rotate: Rotació: diff --git a/crates/ui-egui/src/i18n/cs.tsv b/crates/ui-egui/src/i18n/cs.tsv index 07f5c2374..44d15943e 100644 --- a/crates/ui-egui/src/i18n/cs.tsv +++ b/crates/ui-egui/src/i18n/cs.tsv @@ -1635,6 +1635,8 @@ digits Malayalam Malajálamské Objects on Path Objekty na cestě Attach Připojit Objects on Path Options Možnosti objektů na cestě + Pivot: Otočný bod: + Rotate: Otočení: Objects on Path Tool Nástroj Objekty na cestě Pivot: Otočný bod: Rotate: Otočení: diff --git a/crates/ui-egui/src/i18n/da.tsv b/crates/ui-egui/src/i18n/da.tsv index c8919058c..988a2a2c3 100644 --- a/crates/ui-egui/src/i18n/da.tsv +++ b/crates/ui-egui/src/i18n/da.tsv @@ -5395,6 +5395,8 @@ swatch Bright Violet Kraftig violet Objects on Path Objekter på kurve Attach Tilknyt Objects on Path Options Indstillinger for objekter på kurve + Pivot: Omdrejningspunkt: + Rotate: Rotation: Objects on Path Tool Objekter på kurve-værktøj Pivot: Omdrejningspunkt: Rotate: Rotation: diff --git a/crates/ui-egui/src/i18n/de.tsv b/crates/ui-egui/src/i18n/de.tsv index 6b8505113..7db08925d 100644 --- a/crates/ui-egui/src/i18n/de.tsv +++ b/crates/ui-egui/src/i18n/de.tsv @@ -1459,6 +1459,8 @@ file-filter Templates Vorlagen Objects on Path Objekte auf Pfad Attach Anhängen Objects on Path Options Optionen für Objekte auf Pfad + Pivot: Drehpunkt: + Rotate: Drehung: Objects on Path Tool Objekte-auf-Pfad-Werkzeug Pivot: Drehpunkt: Rotate: Drehung: diff --git a/crates/ui-egui/src/i18n/el.tsv b/crates/ui-egui/src/i18n/el.tsv index b465d8a65..58bc668b2 100644 --- a/crates/ui-egui/src/i18n/el.tsv +++ b/crates/ui-egui/src/i18n/el.tsv @@ -1389,6 +1389,8 @@ font-technology Variable Μεταβλητές Objects on Path Αντικείμενα σε διαδρομή Attach Προσάρτηση Objects on Path Options Επιλογές αντικειμένων σε διαδρομή + Pivot: Σημείο περιστροφής: + Rotate: Περιστροφή: Objects on Path Tool Αντικείμενα σε διαδρομή (Objects on Path Tool) Pivot: Σημείο περιστροφής: Rotate: Περιστροφή: diff --git a/crates/ui-egui/src/i18n/es.tsv b/crates/ui-egui/src/i18n/es.tsv index 413277af4..cbf7839c4 100644 --- a/crates/ui-egui/src/i18n/es.tsv +++ b/crates/ui-egui/src/i18n/es.tsv @@ -1463,6 +1463,8 @@ font-technology Variable Variables Objects on Path Objetos en trazado Attach Adjuntar Objects on Path Options Opciones de objetos en trazado + Pivot: Pivote: + Rotate: Rotación: Objects on Path Tool Herramienta Objetos en trazado Pivot: Pivote: Rotate: Rotación: diff --git a/crates/ui-egui/src/i18n/fi.tsv b/crates/ui-egui/src/i18n/fi.tsv index 3011e5973..84b2dbe9e 100644 --- a/crates/ui-egui/src/i18n/fi.tsv +++ b/crates/ui-egui/src/i18n/fi.tsv @@ -1608,6 +1608,8 @@ digits Malayalam Malajalam Objects on Path Objektit polulla Attach Kiinnitä Objects on Path Options Objektit polulla -asetukset + Pivot: Kiintopiste: + Rotate: Kierto: Objects on Path Tool Objektit polulla -työkalu Pivot: Kiertopiste: Rotate: Kierto: diff --git a/crates/ui-egui/src/i18n/fr.tsv b/crates/ui-egui/src/i18n/fr.tsv index 6f42e2d4d..362457830 100644 --- a/crates/ui-egui/src/i18n/fr.tsv +++ b/crates/ui-egui/src/i18n/fr.tsv @@ -1463,6 +1463,8 @@ font-technology Variable Variables Objects on Path Objets sur tracé Attach Attacher Objects on Path Options Options d’objets sur tracé + Pivot: Pivot : + Rotate: Rotation : Objects on Path Tool Outil Objets sur tracé Pivot: Pivot : Rotate: Rotation : diff --git a/crates/ui-egui/src/i18n/hu.tsv b/crates/ui-egui/src/i18n/hu.tsv index deef0995f..3bed2740f 100644 --- a/crates/ui-egui/src/i18n/hu.tsv +++ b/crates/ui-egui/src/i18n/hu.tsv @@ -1860,6 +1860,8 @@ file-filter Templates Sablonok Objects on Path Objektumok útvonalon Attach Csatolás Objects on Path Options Objektumok útvonalon beállításai + Pivot: Forgáspont: + Rotate: Elforgatás: Objects on Path Tool Objektumok útvonalon Pivot: Forgáspont: Rotate: Elforgatás: diff --git a/crates/ui-egui/src/i18n/id.tsv b/crates/ui-egui/src/i18n/id.tsv index 9aef8450b..92790c89b 100644 --- a/crates/ui-egui/src/i18n/id.tsv +++ b/crates/ui-egui/src/i18n/id.tsv @@ -5395,6 +5395,8 @@ swatch Bright Violet Violet cerah Objects on Path Objek pada jalur Attach Tempelkan Objects on Path Options Opsi objek pada jalur + Pivot: Titik pivot: + Rotate: Rotasi: Objects on Path Tool Alat objek pada jalur Pivot: Titik poros: Rotate: Rotasi: diff --git a/crates/ui-egui/src/i18n/it.tsv b/crates/ui-egui/src/i18n/it.tsv index 304c48f4b..2cd2b1d3f 100644 --- a/crates/ui-egui/src/i18n/it.tsv +++ b/crates/ui-egui/src/i18n/it.tsv @@ -1483,6 +1483,8 @@ file-filter Templates Modelli Objects on Path Oggetti su tracciato Attach Aggancia Objects on Path Options Opzioni oggetti su tracciato + Pivot: Perno: + Rotate: Rotazione: Objects on Path Tool Strumento Oggetti su tracciato Pivot: Perno: Rotate: Rotazione: diff --git a/crates/ui-egui/src/i18n/ja.tsv b/crates/ui-egui/src/i18n/ja.tsv index 4ae7d6fd8..da19a5f6d 100644 --- a/crates/ui-egui/src/i18n/ja.tsv +++ b/crates/ui-egui/src/i18n/ja.tsv @@ -1773,6 +1773,8 @@ digits Malayalam マラヤーラム数字 Objects on Path パス上のオブジェクト Attach アタッチ Objects on Path Options パス上のオブジェクトオプション + Pivot: ピボット: + Rotate: 回転: Objects on Path Tool パス上のオブジェクトツール Pivot: ピボット: Rotate: 回転: diff --git a/crates/ui-egui/src/i18n/ka.tsv b/crates/ui-egui/src/i18n/ka.tsv index 261074cff..9a71c03fa 100644 --- a/crates/ui-egui/src/i18n/ka.tsv +++ b/crates/ui-egui/src/i18n/ka.tsv @@ -5301,6 +5301,8 @@ imageTrace Outline კონტური Objects on Path ობიექტები ტრაექტორიაზე Attach მიმაგრება Objects on Path Options ტრაექტორიაზე ობიექტების პარამეტრები + Pivot: საყრდენი წერტილი: + Rotate: შემობრუნება: Objects on Path Tool ტრაექტორიაზე ობიექტების ხელსაწყო Pivot: საყრდენი წერტილი: Rotate: შემობრუნება: diff --git a/crates/ui-egui/src/i18n/ko.tsv b/crates/ui-egui/src/i18n/ko.tsv index 05f3c3860..72ee2e656 100644 --- a/crates/ui-egui/src/i18n/ko.tsv +++ b/crates/ui-egui/src/i18n/ko.tsv @@ -1763,6 +1763,8 @@ digits Malayalam 말라얄람어 Objects on Path 패스 위 개체 Attach 부착 Objects on Path Options 패스 위 개체 옵션 + Pivot: 피벗: + Rotate: 회전: Objects on Path Tool 패스 위 개체 도구 Pivot: 피벗: Rotate: 회전: diff --git a/crates/ui-egui/src/i18n/nl.tsv b/crates/ui-egui/src/i18n/nl.tsv index 579a6458e..050c2cb43 100644 --- a/crates/ui-egui/src/i18n/nl.tsv +++ b/crates/ui-egui/src/i18n/nl.tsv @@ -5406,6 +5406,8 @@ swatch Bright Violet Felviolet Objects on Path Objecten op pad Attach Koppelen Objects on Path Options Opties voor objecten op pad + Pivot: Draaipunt: + Rotate: Rotatie: Objects on Path Tool Objecten-op-pad-gereedschap Pivot: Draaipunt: Rotate: Rotatie: diff --git a/crates/ui-egui/src/i18n/pl.tsv b/crates/ui-egui/src/i18n/pl.tsv index 3ec4a22e2..ee7f18fd2 100644 --- a/crates/ui-egui/src/i18n/pl.tsv +++ b/crates/ui-egui/src/i18n/pl.tsv @@ -1553,6 +1553,8 @@ digits Malayalam Malajalam Objects on Path Obiekty na ścieżce Attach Dołącz Objects on Path Options Opcje obiektów na ścieżce + Pivot: Punkt obrotu: + Rotate: Obrót: Objects on Path Tool Narzędzie Obiekty na ścieżce Pivot: Punkt obrotu: Rotate: Obrót: diff --git a/crates/ui-egui/src/i18n/pt-br.tsv b/crates/ui-egui/src/i18n/pt-br.tsv index 01a472f10..43a673e24 100644 --- a/crates/ui-egui/src/i18n/pt-br.tsv +++ b/crates/ui-egui/src/i18n/pt-br.tsv @@ -1269,6 +1269,8 @@ Objects on Path Objetos no Caminho Attach Anexar Objects on Path Options Opções de Objetos no Caminho + Pivot: Pivô: + Rotate: Rotação: Objects on Path Tool Ferramenta Objetos no Caminho Pivot: Pivô: Rotate: Rotação: diff --git a/crates/ui-egui/src/i18n/ru.tsv b/crates/ui-egui/src/i18n/ru.tsv index f54d63b6b..7edf206e7 100644 --- a/crates/ui-egui/src/i18n/ru.tsv +++ b/crates/ui-egui/src/i18n/ru.tsv @@ -1481,6 +1481,8 @@ file-filter Templates Шаблоны Objects on Path Объекты на контуре Attach Прикрепить Objects on Path Options Параметры объектов на контуре + Pivot: Точка опоры: + Rotate: Поворот: Objects on Path Tool Инструмент «Объекты на контуре» Pivot: Опорная точка: Rotate: Поворот: diff --git a/crates/ui-egui/src/i18n/sv.tsv b/crates/ui-egui/src/i18n/sv.tsv index 295726ef6..477e0c9c2 100644 --- a/crates/ui-egui/src/i18n/sv.tsv +++ b/crates/ui-egui/src/i18n/sv.tsv @@ -1427,6 +1427,8 @@ font-technology Variable Variabla Objects on Path Objekt på bana Attach Fäst Objects on Path Options Alternativ för objekt på bana + Pivot: Pivotpunkt: + Rotate: Rotation: Objects on Path Tool Verktyg för objekt på bana Pivot: Pivotpunkt: Rotate: Rotation: diff --git a/crates/ui-egui/src/i18n/tr.tsv b/crates/ui-egui/src/i18n/tr.tsv index a360aa1fd..83e290613 100644 --- a/crates/ui-egui/src/i18n/tr.tsv +++ b/crates/ui-egui/src/i18n/tr.tsv @@ -5374,6 +5374,8 @@ theme Appearance Görünüm Note Paper… Not Kâğıdı… Objects on Path Yol Üzerindeki Nesneler Objects on Path Options Yol Üzerindeki Nesneler Seçenekleri + Pivot: Pivot noktası: + Rotate: Rotasyon: Objects on Path Tool Yol Üzerindeki Nesneler Aracı Pivot: Pivot noktası: Rotate: Döndürme: diff --git a/crates/ui-egui/src/i18n/uk.tsv b/crates/ui-egui/src/i18n/uk.tsv index 298eb966c..ffee17a12 100644 --- a/crates/ui-egui/src/i18n/uk.tsv +++ b/crates/ui-egui/src/i18n/uk.tsv @@ -1477,6 +1477,8 @@ file-filter Templates Шаблони Objects on Path Об’єкти на контурі Attach Прикріпити Objects on Path Options Параметри об’єктів на контурі + Pivot: Точка опори: + Rotate: Поворот: Objects on Path Tool Інструмент «Об’єкти на контурі» Pivot: Опорна точка: Rotate: Поворот: diff --git a/crates/ui-egui/src/i18n/vi.tsv b/crates/ui-egui/src/i18n/vi.tsv index 498096869..154f3f866 100644 --- a/crates/ui-egui/src/i18n/vi.tsv +++ b/crates/ui-egui/src/i18n/vi.tsv @@ -1700,6 +1700,8 @@ digits Hindi Hindi Objects on Path Đối tượng trên đường dẫn Attach Gắn Objects on Path Options Tùy chọn đối tượng trên đường dẫn + Pivot: Điểm xoay: + Rotate: Xoay: Objects on Path Tool Công cụ Đối tượng trên đường dẫn Pivot: Điểm trục: Rotate: Xoay: diff --git a/crates/ui-egui/src/i18n/zh-hans.tsv b/crates/ui-egui/src/i18n/zh-hans.tsv index 061e6bf07..fabb541c4 100644 --- a/crates/ui-egui/src/i18n/zh-hans.tsv +++ b/crates/ui-egui/src/i18n/zh-hans.tsv @@ -1411,6 +1411,8 @@ file-filter Templates 模板 Objects on Path 路径上的对象 Attach 附加 Objects on Path Options 路径上的对象选项 + Pivot: 枢轴: + Rotate: 旋转: Objects on Path Tool 路径上的对象工具 Pivot: 枢轴: Rotate: 旋转: diff --git a/crates/ui-egui/src/i18n/zh-hant.tsv b/crates/ui-egui/src/i18n/zh-hant.tsv index 79d62390d..b6b48a2ae 100644 --- a/crates/ui-egui/src/i18n/zh-hant.tsv +++ b/crates/ui-egui/src/i18n/zh-hant.tsv @@ -1448,6 +1448,8 @@ file-filter Templates 範本 Objects on Path 路徑上的物件 Attach 附加 Objects on Path Options 路徑上的物件選項 + Pivot: 樞軸: + Rotate: 旋轉: Objects on Path Tool 路徑上的物件工具 Pivot: 樞軸: Rotate: 旋轉: diff --git a/crates/ui-egui/src/panels/properties.rs b/crates/ui-egui/src/panels/properties.rs index f6f6724e5..a8f736e5a 100644 --- a/crates/ui-egui/src/panels/properties.rs +++ b/crates/ui-egui/src/panels/properties.rs @@ -65,6 +65,10 @@ pub fn show(app: &mut VectorcraftApp, ui: &mut Ui) { trace_section(app, ui, &preset, view); divider(ui); } + if let Some(oop) = selected_objects_on_path(app) { + objects_on_path_section(app, ui, &oop); + divider(ui); + } if matches!(first.as_ref().map(|n| &n.kind), Some(NodeKind::Text(_))) { type_sections(app, ui); divider(ui); @@ -359,6 +363,71 @@ fn trace_section(app: &mut VectorcraftApp, ui: &mut Ui, preset: &str, view: vect }); } +/// The Objects on Path groups selected with nothing else: their ids, and the Pivot and Rotate they +/// share (`None` where they differ). +struct ObjectsOnPathSelection { + ids: Vec, + pivot: Option, + rotate: Option, +} + +/// The selection as Objects on Path groups ([`ObjectsOnPathSelection`]), when every selected +/// object is one. +fn selected_objects_on_path(app: &VectorcraftApp) -> Option { + let st = app.session.active()?; + let mut out: Option = None; + for id in &st.selection.objects { + let rec = st.doc.node(*id)?.extras().objects_on_path.as_deref()?; + match &mut out { + None => out = Some(ObjectsOnPathSelection { ids: vec![id.0], pivot: Some(rec.pivot), rotate: Some(rec.rotate) }), + Some(s) => { + s.ids.push(id.0); + if s.pivot != Some(rec.pivot) { + s.pivot = None; + } + if s.rotate != Some(rec.rotate) { + s.rotate = None; + } + } + } + } + out +} + +/// The Objects on Path Options of the selected Objects on Path groups: Pivot, the point of each +/// object that attaches to the path, and Rotate, the angle each object tilts by from upright on the +/// path, as the help page places them in the Properties panel +/// (). A change goes to every +/// selected group in one undo step (`object.objectsOnPath.options`). Where the groups differ, no +/// Pivot square is chosen and Rotate is blank. +fn objects_on_path_section(app: &mut VectorcraftApp, ui: &mut Ui, oop: &ObjectsOnPathSelection) { + section_header(ui, tl!("Objects on Path Options")); + let fw = super::field_width(ui); + let set = |app: &mut VectorcraftApp, mut p: serde_json::Value| { + p["ids"] = json!(oop.ids); + if let Err(e) = app.run("object.objectsOnPath.options", p) { + app.status(e); + } + }; + egui::Grid::new("props-objects-on-path").num_columns(2).spacing([6.0, 6.0]).show(ui, |ui| { + dim_label(ui, tl!("Pivot:")); + // 9 is no square: the groups' pivots differ. + if let Some(i) = widgets::reference_point(ui, oop.pivot.map_or(9, usize::from)) + && oop.pivot.is_none_or(|p| usize::from(p) != i) + { + set(app, json!({ "pivot": i })); + } + ui.end_row(); + dim_label(ui, tl!("Rotate:")); + if let Some(a) = widgets::spin_plain(ui, "props-oop-rotate", oop.rotate, "°", 2, fw, 15.0, -360.0, &super::transform::ANGLE_PRESETS) + && oop.rotate != Some(a) + { + set(app, json!({ "rotate": a })); + } + ui.end_row(); + }); +} + /// Whether the selection uses more than one colour (`recolor.colors`), which offers the Recolor /// quick action; cached per document revision. fn multi_color(app: &mut VectorcraftApp, ctx: &egui::Context) -> bool { diff --git a/crates/ui-egui/src/panels/properties/tests.rs b/crates/ui-egui/src/panels/properties/tests.rs index c4059b8d5..4dd7d4f22 100644 --- a/crates/ui-egui/src/panels/properties/tests.rs +++ b/crates/ui-egui/src/panels/properties/tests.rs @@ -1684,3 +1684,77 @@ fn reset_is_a_quick_action_for_a_changed_dynamic_instance() { assert!(app.session.doc().unwrap().doc.node(id).unwrap().extras().symbol_overrides.is_empty()); assert!(!shows(&tall(&mut app, &ctx, vec![]), "Reset")); } + +/// Two 20 pt squares attached to a horizontal line in an Objects on Path group (`rotate` degrees), +/// with the group selected → the group. +fn objects_on_path(app: &mut VectorcraftApp, y: f64, rotate: f64) -> Value { + let line = app.run("shape.line", json!({"x1": 20, "y1": y, "x2": 380, "y2": y})).unwrap()["id"].clone(); + let a = rect(app, 40.0, y - 60.0, 20.0, 20.0); + let b = rect(app, 80.0, y - 60.0, 20.0, 20.0); + app.run("select.set", json!({"ids": [a, b]})).unwrap(); + let group = app.run("object.objectsOnPath.attach", json!({"path": line, "rotate": rotate})).unwrap()["id"].clone(); + app.run("select.set", json!({"ids": [group]})).unwrap(); + group +} + +/// The Pivot and Rotate of the Objects on Path group `id`. +fn pivot_rotate(app: &VectorcraftApp, id: &Value) -> (u8, f64) { + let d = &app.session.active().unwrap().doc; + let rec = d.node(vectorcraft_doc::NodeId(id.as_u64().unwrap())).unwrap().extras().objects_on_path.as_deref().unwrap(); + (rec.pivot, rec.rotate) +} + +/// The Objects on Path Options section alone. +fn objects_on_path_options(app: &mut VectorcraftApp, ui: &mut Ui) { + if let Some(oop) = selected_objects_on_path(app) { + objects_on_path_section(app, ui, &oop); + } +} + +/// The help page's Objects on Path Options section of the Properties panel shows for an Objects on +/// Path group selected on its own or with other such groups, and not for a plain group, an object +/// or an Objects on Path group selected with another object. +#[test] +fn objects_on_path_groups_show_objects_on_path_options() { + let mut app = new_app(); + let ctx = egui::Context::default(); + let group = objects_on_path(&mut app, 150.0, 0.0); + let texts = tall(&mut app, &ctx, vec![]); + assert!(shows(&texts, "Objects on Path Options") && shows(&texts, "Pivot:") && shows(&texts, "Rotate:"), "one group: {texts:?}"); + let other = objects_on_path(&mut app, 250.0, 0.0); + app.run("select.set", json!({"ids": [group, other]})).unwrap(); + assert!(shows(&tall(&mut app, &ctx, vec![]), "Objects on Path Options"), "two groups"); + let r = rect(&mut app, 300.0, 20.0, 40.0, 40.0); + app.run("select.set", json!({"ids": [group, r]})).unwrap(); + assert!(!shows(&tall(&mut app, &ctx, vec![]), "Objects on Path Options"), "a group and a rectangle"); + app.run("select.set", json!({"ids": [r]})).unwrap(); + assert!(!shows(&tall(&mut app, &ctx, vec![]), "Objects on Path Options"), "a rectangle"); + let s = rect(&mut app, 340.0, 20.0, 20.0, 20.0); + app.run("select.set", json!({"ids": [r, s]})).unwrap(); + app.run("object.group", json!({})).unwrap(); + assert!(!shows(&tall(&mut app, &ctx, vec![]), "Objects on Path Options"), "a plain group"); +} + +/// A click on a Pivot square and a typed Rotate each set the selected groups' Objects on Path +/// Options in one undo step: one group's, and two groups' at once, where Rotate starts blank as +/// the groups' angles differ. +#[test] +fn objects_on_path_options_set_pivot_and_rotate_in_one_undo_step() { + let (mut app, ctx) = reference_setup(&[]); + let group = objects_on_path(&mut app, 150.0, 0.0); + let depth = undo_depth(&app); + click_named(&mut app, &ctx, objects_on_path_options, "Top Left"); + assert_eq!(pivot_rotate(&app, &group), (0, 0.0), "Pivot: top left"); + assert_eq!(undo_depth(&app), depth + 1, "one undo step"); + type_over(&mut app, &ctx, objects_on_path_options, "0°", "30"); + assert_eq!(pivot_rotate(&app, &group), (0, 30.0), "Rotate: 30°"); + assert_eq!(undo_depth(&app), depth + 2, "one undo step"); + let other = objects_on_path(&mut app, 250.0, 45.0); + app.run("select.set", json!({"ids": [group, other]})).unwrap(); + let texts = panel_frame(&mut app, &ctx, vec![], objects_on_path_options); + assert!(!shows(&texts, "30°") && !shows(&texts, "45°"), "Rotate is blank: {texts:?}"); + let depth = undo_depth(&app); + click_named(&mut app, &ctx, objects_on_path_options, "Bottom Right"); + 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"); +} diff --git a/docs/target-app-parity.md b/docs/target-app-parity.md index d1d72271c..89b2ae946 100644 --- a/docs/target-app-parity.md +++ b/docs/target-app-parity.md @@ -930,6 +930,7 @@ Moved from the ROADMAP's "Shipped so far" on 2026-10-10. Update it when a featur When the object the Blend tool picked first is deleted or undone away before the second click, the next click on an object picks that object first instead of doing nothing. Regression tests: `blend_tool_picks_again_when_its_first_pick_is_gone` in `meshblend.rs` and `the_blend_tool_picks_again_when_its_first_pick_is_deleted` in `tests/blendopts.rs`. Window › Blend opens the Blend panel: Make, the selected blend's Spacing and Orientation (with no blend selected, the options new blends start with), Reverse Front to Back, Reverse Spine, Replace Spine, Expand and Release, each running its Object › Blend command. Make is dimmed until two or more objects are selected. Spacing and Orientation are dimmed until a blend or two or more objects are selected, and the other buttons are dimmed until a blend is selected. With the Blend tool, Escape drops the object clicked first and stops the next click adding to the blend just made, so the next click picks a new first object; the document and the selection stay as they are. Regression tests: `escape_drops_the_blend_tools_first_pick` in `meshblend.rs` and `tests/blendopts.rs`. + Objects on Path (#2545): a click with the Objects on Path tool (in Edit Toolbar's Modify section and the Blend tool's flyout; Object › Objects on Path › Attach and the context menu with two or more objects selected choose it) attaches the selected objects to the path clicked, open or closed, in an Objects on Path group with the path at its bottom. The objects go along the path column by column from left to right, spread evenly from its first anchor (the last one sits on the end of an open path), each turned to the path at its attachment point; Pivot and Rotate set where each one attaches and how far it tilts (`object.objectsOnPath.attach`, `object.objectsOnPath.options`), and with Objects on Path groups selected the Properties panel's Objects on Path Options section shows them as a nine-point Pivot grid and a Rotate field with common angles, each change one undo step for every selected group. Editing the path moves the objects, an object moved on its own goes back, objects moved into or out of the group in the Layers panel join or leave the path, and Object › Objects on Path › Expand leaves a plain group. The group saves and reopens live and exports as plain art. The Space, Move All, Rotate All and Select/Move widgets, Detach and the tool's options dialog are missing. Objects on Path (#2545): a click with the Objects on Path tool (in Edit Toolbar's Modify section and the Blend tool's flyout; Object › Objects on Path › Attach and the context menu with two or more objects selected choose it) attaches the selected objects to the path clicked, open or closed, in an Objects on Path group with the path at its bottom. The objects go along the path column by column from left to right, spread evenly from its first anchor (the last one sits on the end of an open path), each turned to the path at its attachment point; Pivot and Rotate set where each one attaches and how far it tilts (`object.objectsOnPath.attach`, `object.objectsOnPath.options`). Editing the path moves the objects, an object moved on its own goes back, objects moved into or out of the group in the Layers panel join or leave the path, and Object › Objects on Path › Expand leaves a plain group. The group saves and reopens live and exports as plain art. The Space, Move All, Rotate All and Select/Move widgets, Detach and the Properties panel section are missing. Double-clicking the Objects on Path tool opens Objects on Path Tool Options ([Objects on Path](https://helpx.adobe.com/illustrator/using/objects-on-path.html)): the nine-point Pivot grid and the Rotate field set the attachment point and angle of the objects attached next, and groups already attached keep theirs; Reset puts the center and 0° back. Save keeps the options across tool switches and saves them with the preferences (`tool.setOption {tool: "objectsOnPath"}`). - **Paint and appearance (M3):** From cdc3a03a1ddda2c7b663583356f8afaff2c0916d Mon Sep 17 00:00:00 2001 From: bflatastic Date: Sun, 1 Nov 2026 04:55:09 +0700 Subject: [PATCH 2/2] Objects on Path: one catalog row each for Pivot and Rotate, one Objects on Path parity entry --- crates/ui-egui/src/i18n/bg.tsv | 2 -- crates/ui-egui/src/i18n/bs.tsv | 2 -- crates/ui-egui/src/i18n/ca.tsv | 2 -- crates/ui-egui/src/i18n/cs.tsv | 2 -- crates/ui-egui/src/i18n/da.tsv | 2 -- crates/ui-egui/src/i18n/de.tsv | 2 -- crates/ui-egui/src/i18n/el.tsv | 2 -- crates/ui-egui/src/i18n/es.tsv | 2 -- crates/ui-egui/src/i18n/fi.tsv | 2 -- crates/ui-egui/src/i18n/fr.tsv | 2 -- crates/ui-egui/src/i18n/hu.tsv | 2 -- crates/ui-egui/src/i18n/id.tsv | 2 -- crates/ui-egui/src/i18n/it.tsv | 2 -- crates/ui-egui/src/i18n/ja.tsv | 2 -- crates/ui-egui/src/i18n/ka.tsv | 2 -- crates/ui-egui/src/i18n/ko.tsv | 2 -- crates/ui-egui/src/i18n/nl.tsv | 2 -- crates/ui-egui/src/i18n/pl.tsv | 2 -- crates/ui-egui/src/i18n/pt-br.tsv | 2 -- crates/ui-egui/src/i18n/ru.tsv | 2 -- crates/ui-egui/src/i18n/sv.tsv | 2 -- crates/ui-egui/src/i18n/tr.tsv | 2 -- crates/ui-egui/src/i18n/uk.tsv | 2 -- crates/ui-egui/src/i18n/vi.tsv | 2 -- crates/ui-egui/src/i18n/zh-hans.tsv | 2 -- crates/ui-egui/src/i18n/zh-hant.tsv | 2 -- docs/target-app-parity.md | 3 +-- 27 files changed, 1 insertion(+), 54 deletions(-) diff --git a/crates/ui-egui/src/i18n/bg.tsv b/crates/ui-egui/src/i18n/bg.tsv index 59f1b3090..96df01e21 100644 --- a/crates/ui-egui/src/i18n/bg.tsv +++ b/crates/ui-egui/src/i18n/bg.tsv @@ -1428,8 +1428,6 @@ font-technology Variable Променливи Pivot: Опорна точка: Rotate: Завъртане: Objects on Path Tool Инструмент „Обекти по пътя“ - Pivot: Опорна точка: - Rotate: Завъртане: Attach Objects on Path Прикрепяне на обекти към пътя Expand Objects on Path Разширяване на обекти по пътя Release Live Paint Освобождаване на динамично оцветяване diff --git a/crates/ui-egui/src/i18n/bs.tsv b/crates/ui-egui/src/i18n/bs.tsv index 9229cafa1..2d3acc7d3 100644 --- a/crates/ui-egui/src/i18n/bs.tsv +++ b/crates/ui-egui/src/i18n/bs.tsv @@ -1612,8 +1612,6 @@ digits Malayalam Malajalam Pivot: Tačka oslonca: Rotate: Rotacija: Objects on Path Tool Alat objekti na putanji - Pivot: Tačka okretanja: - Rotate: Rotacija: Attach Objects on Path Priloži objekte na putanju Expand Objects on Path Proširi objekte na putanji Release Live Paint Oslobodi živo bojenje diff --git a/crates/ui-egui/src/i18n/ca.tsv b/crates/ui-egui/src/i18n/ca.tsv index 08d224589..f9648d21a 100644 --- a/crates/ui-egui/src/i18n/ca.tsv +++ b/crates/ui-egui/src/i18n/ca.tsv @@ -2642,8 +2642,6 @@ digits Malayalam Malaiàlam Pivot: Punt de pivot: Rotate: Rotació: Objects on Path Tool Eina d’objectes sobre el traçat - Pivot: Punt de pivot: - Rotate: Rotació: Objects using them keep their look but are no longer linked. Els objectes que les utilitzen conserven l’aspecte, però ja no estan enllaçats. Ocean Ripple Onada oceànica Ocean Ripple… Onada oceànica… diff --git a/crates/ui-egui/src/i18n/cs.tsv b/crates/ui-egui/src/i18n/cs.tsv index 44d15943e..e5a6bc1da 100644 --- a/crates/ui-egui/src/i18n/cs.tsv +++ b/crates/ui-egui/src/i18n/cs.tsv @@ -1638,8 +1638,6 @@ digits Malayalam Malajálamské Pivot: Otočný bod: Rotate: Otočení: Objects on Path Tool Nástroj Objekty na cestě - Pivot: Otočný bod: - Rotate: Otočení: Attach Objects on Path Připojit objekty na cestu Expand Objects on Path Rozložit objekty na cestě Release Live Paint Uvolnit živou malbu diff --git a/crates/ui-egui/src/i18n/da.tsv b/crates/ui-egui/src/i18n/da.tsv index 988a2a2c3..e6c0987ed 100644 --- a/crates/ui-egui/src/i18n/da.tsv +++ b/crates/ui-egui/src/i18n/da.tsv @@ -5398,8 +5398,6 @@ swatch Bright Violet Kraftig violet Pivot: Omdrejningspunkt: Rotate: Rotation: Objects on Path Tool Objekter på kurve-værktøj - Pivot: Omdrejningspunkt: - Rotate: Rotation: Attach Objects on Path Tilknyt objekter til kurve Expand Objects on Path Udvid objekter på kurve Release Live Paint Frigør live-maling diff --git a/crates/ui-egui/src/i18n/de.tsv b/crates/ui-egui/src/i18n/de.tsv index 7db08925d..8abc9ca13 100644 --- a/crates/ui-egui/src/i18n/de.tsv +++ b/crates/ui-egui/src/i18n/de.tsv @@ -1462,8 +1462,6 @@ file-filter Templates Vorlagen Pivot: Drehpunkt: Rotate: Drehung: Objects on Path Tool Objekte-auf-Pfad-Werkzeug - Pivot: Drehpunkt: - Rotate: Drehung: Attach Objects on Path Objekte an Pfad anhängen Expand Objects on Path Objekte auf Pfad umwandeln Release Live Paint „Interaktiv malen“ zurückwandeln diff --git a/crates/ui-egui/src/i18n/el.tsv b/crates/ui-egui/src/i18n/el.tsv index 58bc668b2..f8be1cf38 100644 --- a/crates/ui-egui/src/i18n/el.tsv +++ b/crates/ui-egui/src/i18n/el.tsv @@ -1392,8 +1392,6 @@ font-technology Variable Μεταβλητές Pivot: Σημείο περιστροφής: Rotate: Περιστροφή: Objects on Path Tool Αντικείμενα σε διαδρομή (Objects on Path Tool) - Pivot: Σημείο περιστροφής: - Rotate: Περιστροφή: Attach Objects on Path Προσάρτηση αντικειμένων σε διαδρομή Expand Objects on Path Επέκταση αντικειμένων σε διαδρομή Release Live Paint Αποδέσμευση δυναμικής βαφής diff --git a/crates/ui-egui/src/i18n/es.tsv b/crates/ui-egui/src/i18n/es.tsv index cbf7839c4..a73a9155a 100644 --- a/crates/ui-egui/src/i18n/es.tsv +++ b/crates/ui-egui/src/i18n/es.tsv @@ -1466,8 +1466,6 @@ font-technology Variable Variables Pivot: Pivote: Rotate: Rotación: Objects on Path Tool Herramienta Objetos en trazado - Pivot: Pivote: - Rotate: Rotación: Attach Objects on Path Adjuntar objetos al trazado Expand Objects on Path Expandir objetos en trazado Release Live Paint Soltar pintura interactiva diff --git a/crates/ui-egui/src/i18n/fi.tsv b/crates/ui-egui/src/i18n/fi.tsv index 84b2dbe9e..ba97335bf 100644 --- a/crates/ui-egui/src/i18n/fi.tsv +++ b/crates/ui-egui/src/i18n/fi.tsv @@ -1611,8 +1611,6 @@ digits Malayalam Malajalam Pivot: Kiintopiste: Rotate: Kierto: Objects on Path Tool Objektit polulla -työkalu - Pivot: Kiertopiste: - Rotate: Kierto: Attach Objects on Path Kiinnitä objektit polulle Expand Objects on Path Laajenna objektit polulla Release Live Paint Vapauta elävä maalaus diff --git a/crates/ui-egui/src/i18n/fr.tsv b/crates/ui-egui/src/i18n/fr.tsv index 362457830..c3892ba3d 100644 --- a/crates/ui-egui/src/i18n/fr.tsv +++ b/crates/ui-egui/src/i18n/fr.tsv @@ -1466,8 +1466,6 @@ font-technology Variable Variables Pivot: Pivot : Rotate: Rotation : Objects on Path Tool Outil Objets sur tracé - Pivot: Pivot : - Rotate: Rotation : Attach Objects on Path Attacher des objets au tracé Expand Objects on Path Décomposer les objets sur tracé Release Live Paint Annuler la peinture dynamique diff --git a/crates/ui-egui/src/i18n/hu.tsv b/crates/ui-egui/src/i18n/hu.tsv index 3bed2740f..e701b93aa 100644 --- a/crates/ui-egui/src/i18n/hu.tsv +++ b/crates/ui-egui/src/i18n/hu.tsv @@ -1863,8 +1863,6 @@ file-filter Templates Sablonok Pivot: Forgáspont: Rotate: Elforgatás: Objects on Path Tool Objektumok útvonalon - Pivot: Forgáspont: - Rotate: Elforgatás: Attach Objects on Path Objektumok csatolása útvonalhoz Expand Objects on Path Objektumok útvonalon kibontása Release Live Paint Élő festés megszüntetése diff --git a/crates/ui-egui/src/i18n/id.tsv b/crates/ui-egui/src/i18n/id.tsv index 92790c89b..493618378 100644 --- a/crates/ui-egui/src/i18n/id.tsv +++ b/crates/ui-egui/src/i18n/id.tsv @@ -5398,8 +5398,6 @@ swatch Bright Violet Violet cerah Pivot: Titik pivot: Rotate: Rotasi: Objects on Path Tool Alat objek pada jalur - Pivot: Titik poros: - Rotate: Rotasi: Attach Objects on Path Tempelkan objek pada jalur Expand Objects on Path Perluas objek pada jalur Release Live Paint Lepaskan Live Paint diff --git a/crates/ui-egui/src/i18n/it.tsv b/crates/ui-egui/src/i18n/it.tsv index 2cd2b1d3f..9d8d581fa 100644 --- a/crates/ui-egui/src/i18n/it.tsv +++ b/crates/ui-egui/src/i18n/it.tsv @@ -1486,8 +1486,6 @@ file-filter Templates Modelli Pivot: Perno: Rotate: Rotazione: Objects on Path Tool Strumento Oggetti su tracciato - Pivot: Perno: - Rotate: Rotazione: Attach Objects on Path Aggancia oggetti al tracciato Expand Objects on Path Espandi oggetti su tracciato Release Live Paint Rilascia pittura dinamica diff --git a/crates/ui-egui/src/i18n/ja.tsv b/crates/ui-egui/src/i18n/ja.tsv index da19a5f6d..b8f6cdd5a 100644 --- a/crates/ui-egui/src/i18n/ja.tsv +++ b/crates/ui-egui/src/i18n/ja.tsv @@ -1776,8 +1776,6 @@ digits Malayalam マラヤーラム数字 Pivot: ピボット: Rotate: 回転: Objects on Path Tool パス上のオブジェクトツール - Pivot: ピボット: - Rotate: 回転: Attach Objects on Path パス上のオブジェクトをアタッチ Expand Objects on Path パス上のオブジェクトを拡張 Release Live Paint ライブペイントを解除 diff --git a/crates/ui-egui/src/i18n/ka.tsv b/crates/ui-egui/src/i18n/ka.tsv index 9a71c03fa..d5046acac 100644 --- a/crates/ui-egui/src/i18n/ka.tsv +++ b/crates/ui-egui/src/i18n/ka.tsv @@ -5304,8 +5304,6 @@ imageTrace Outline კონტური Pivot: საყრდენი წერტილი: Rotate: შემობრუნება: Objects on Path Tool ტრაექტორიაზე ობიექტების ხელსაწყო - Pivot: საყრდენი წერტილი: - Rotate: შემობრუნება: Attach Objects on Path ობიექტების ტრაექტორიაზე მიმაგრება Expand Objects on Path ტრაექტორიაზე ობიექტების გაშლა Release Live Paint ცოცხალი შეღებვის მოხსნა diff --git a/crates/ui-egui/src/i18n/ko.tsv b/crates/ui-egui/src/i18n/ko.tsv index 72ee2e656..8c8d194c9 100644 --- a/crates/ui-egui/src/i18n/ko.tsv +++ b/crates/ui-egui/src/i18n/ko.tsv @@ -1766,8 +1766,6 @@ digits Malayalam 말라얄람어 Pivot: 피벗: Rotate: 회전: Objects on Path Tool 패스 위 개체 도구 - Pivot: 피벗: - Rotate: 회전: Attach Objects on Path 패스 위 개체 부착 Expand Objects on Path 패스 위 개체 확장 Release Live Paint 라이브 페인트 해제 diff --git a/crates/ui-egui/src/i18n/nl.tsv b/crates/ui-egui/src/i18n/nl.tsv index 050c2cb43..b2b799c9a 100644 --- a/crates/ui-egui/src/i18n/nl.tsv +++ b/crates/ui-egui/src/i18n/nl.tsv @@ -5409,8 +5409,6 @@ swatch Bright Violet Felviolet Pivot: Draaipunt: Rotate: Rotatie: Objects on Path Tool Objecten-op-pad-gereedschap - Pivot: Draaipunt: - Rotate: Rotatie: Attach Objects on Path Objecten aan pad koppelen Expand Objects on Path Objecten op pad uitbreiden Release Live Paint Live Paint vrijgeven diff --git a/crates/ui-egui/src/i18n/pl.tsv b/crates/ui-egui/src/i18n/pl.tsv index ee7f18fd2..79d3ca69f 100644 --- a/crates/ui-egui/src/i18n/pl.tsv +++ b/crates/ui-egui/src/i18n/pl.tsv @@ -1556,8 +1556,6 @@ digits Malayalam Malajalam Pivot: Punkt obrotu: Rotate: Obrót: Objects on Path Tool Narzędzie Obiekty na ścieżce - Pivot: Punkt obrotu: - Rotate: Obrót: Attach Objects on Path Dołącz obiekty do ścieżki Expand Objects on Path Rozszerz obiekty na ścieżce Release Live Paint Uwolnij aktywne malowanie diff --git a/crates/ui-egui/src/i18n/pt-br.tsv b/crates/ui-egui/src/i18n/pt-br.tsv index 43a673e24..c4d69d018 100644 --- a/crates/ui-egui/src/i18n/pt-br.tsv +++ b/crates/ui-egui/src/i18n/pt-br.tsv @@ -1272,8 +1272,6 @@ Pivot: Pivô: Rotate: Rotação: Objects on Path Tool Ferramenta Objetos no Caminho - Pivot: Pivô: - Rotate: Rotação: Attach Objects on Path Anexar Objetos ao Caminho Expand Objects on Path Expandir Objetos no Caminho Release Live Paint Liberar Pintura ao Vivo diff --git a/crates/ui-egui/src/i18n/ru.tsv b/crates/ui-egui/src/i18n/ru.tsv index 7edf206e7..3f328f94d 100644 --- a/crates/ui-egui/src/i18n/ru.tsv +++ b/crates/ui-egui/src/i18n/ru.tsv @@ -1484,8 +1484,6 @@ file-filter Templates Шаблоны Pivot: Точка опоры: Rotate: Поворот: Objects on Path Tool Инструмент «Объекты на контуре» - Pivot: Опорная точка: - Rotate: Поворот: Attach Objects on Path Прикрепить объекты к контуру Expand Objects on Path Разобрать объекты на контуре Release Live Paint Освободить быструю заливку diff --git a/crates/ui-egui/src/i18n/sv.tsv b/crates/ui-egui/src/i18n/sv.tsv index 477e0c9c2..eee2ef885 100644 --- a/crates/ui-egui/src/i18n/sv.tsv +++ b/crates/ui-egui/src/i18n/sv.tsv @@ -1430,8 +1430,6 @@ font-technology Variable Variabla Pivot: Pivotpunkt: Rotate: Rotation: Objects on Path Tool Verktyg för objekt på bana - Pivot: Pivotpunkt: - Rotate: Rotation: Attach Objects on Path Fäst objekt på bana Expand Objects on Path Expandera objekt på bana Release Live Paint Släpp direktmålning diff --git a/crates/ui-egui/src/i18n/tr.tsv b/crates/ui-egui/src/i18n/tr.tsv index 83e290613..324ab77e0 100644 --- a/crates/ui-egui/src/i18n/tr.tsv +++ b/crates/ui-egui/src/i18n/tr.tsv @@ -5377,8 +5377,6 @@ theme Appearance Görünüm Pivot: Pivot noktası: Rotate: Rotasyon: Objects on Path Tool Yol Üzerindeki Nesneler Aracı - Pivot: Pivot noktası: - Rotate: Döndürme: Photocopy Fotokopi Photocopy… Fotokopi… Plaster Alçı diff --git a/crates/ui-egui/src/i18n/uk.tsv b/crates/ui-egui/src/i18n/uk.tsv index ffee17a12..6ada758d8 100644 --- a/crates/ui-egui/src/i18n/uk.tsv +++ b/crates/ui-egui/src/i18n/uk.tsv @@ -1480,8 +1480,6 @@ file-filter Templates Шаблони Pivot: Точка опори: Rotate: Поворот: Objects on Path Tool Інструмент «Об’єкти на контурі» - Pivot: Опорна точка: - Rotate: Поворот: Attach Objects on Path Прикріпити об’єкти до контуру Expand Objects on Path Розібрати об’єкти на контурі Release Live Paint Звільнити швидку заливку diff --git a/crates/ui-egui/src/i18n/vi.tsv b/crates/ui-egui/src/i18n/vi.tsv index 154f3f866..1aa0e91c6 100644 --- a/crates/ui-egui/src/i18n/vi.tsv +++ b/crates/ui-egui/src/i18n/vi.tsv @@ -1703,8 +1703,6 @@ digits Hindi Hindi Pivot: Điểm xoay: Rotate: Xoay: Objects on Path Tool Công cụ Đối tượng trên đường dẫn - Pivot: Điểm trục: - Rotate: Xoay: Attach Objects on Path Gắn đối tượng lên đường dẫn Expand Objects on Path Mở rộng đối tượng trên đường dẫn Release Live Paint Giải phóng tô trực tiếp diff --git a/crates/ui-egui/src/i18n/zh-hans.tsv b/crates/ui-egui/src/i18n/zh-hans.tsv index fabb541c4..f0e7b021c 100644 --- a/crates/ui-egui/src/i18n/zh-hans.tsv +++ b/crates/ui-egui/src/i18n/zh-hans.tsv @@ -1414,8 +1414,6 @@ file-filter Templates 模板 Pivot: 枢轴: Rotate: 旋转: Objects on Path Tool 路径上的对象工具 - Pivot: 枢轴: - Rotate: 旋转: Attach Objects on Path 附加路径上的对象 Expand Objects on Path 扩展路径上的对象 Release Live Paint 释放实时上色 diff --git a/crates/ui-egui/src/i18n/zh-hant.tsv b/crates/ui-egui/src/i18n/zh-hant.tsv index b6b48a2ae..d6b7bc23e 100644 --- a/crates/ui-egui/src/i18n/zh-hant.tsv +++ b/crates/ui-egui/src/i18n/zh-hant.tsv @@ -1451,8 +1451,6 @@ file-filter Templates 範本 Pivot: 樞軸: Rotate: 旋轉: Objects on Path Tool 路徑上的物件工具 - Pivot: 樞軸: - Rotate: 旋轉: Attach Objects on Path 附加路徑上的物件 Expand Objects on Path 展開路徑上的物件 Release Live Paint 釋放即時上色 diff --git a/docs/target-app-parity.md b/docs/target-app-parity.md index 89b2ae946..4a1743805 100644 --- a/docs/target-app-parity.md +++ b/docs/target-app-parity.md @@ -930,8 +930,7 @@ Moved from the ROADMAP's "Shipped so far" on 2026-10-10. Update it when a featur When the object the Blend tool picked first is deleted or undone away before the second click, the next click on an object picks that object first instead of doing nothing. Regression tests: `blend_tool_picks_again_when_its_first_pick_is_gone` in `meshblend.rs` and `the_blend_tool_picks_again_when_its_first_pick_is_deleted` in `tests/blendopts.rs`. Window › Blend opens the Blend panel: Make, the selected blend's Spacing and Orientation (with no blend selected, the options new blends start with), Reverse Front to Back, Reverse Spine, Replace Spine, Expand and Release, each running its Object › Blend command. Make is dimmed until two or more objects are selected. Spacing and Orientation are dimmed until a blend or two or more objects are selected, and the other buttons are dimmed until a blend is selected. With the Blend tool, Escape drops the object clicked first and stops the next click adding to the blend just made, so the next click picks a new first object; the document and the selection stay as they are. Regression tests: `escape_drops_the_blend_tools_first_pick` in `meshblend.rs` and `tests/blendopts.rs`. - Objects on Path (#2545): a click with the Objects on Path tool (in Edit Toolbar's Modify section and the Blend tool's flyout; Object › Objects on Path › Attach and the context menu with two or more objects selected choose it) attaches the selected objects to the path clicked, open or closed, in an Objects on Path group with the path at its bottom. The objects go along the path column by column from left to right, spread evenly from its first anchor (the last one sits on the end of an open path), each turned to the path at its attachment point; Pivot and Rotate set where each one attaches and how far it tilts (`object.objectsOnPath.attach`, `object.objectsOnPath.options`), and with Objects on Path groups selected the Properties panel's Objects on Path Options section shows them as a nine-point Pivot grid and a Rotate field with common angles, each change one undo step for every selected group. Editing the path moves the objects, an object moved on its own goes back, objects moved into or out of the group in the Layers panel join or leave the path, and Object › Objects on Path › Expand leaves a plain group. The group saves and reopens live and exports as plain art. The Space, Move All, Rotate All and Select/Move widgets, Detach and the tool's options dialog are missing. - Objects on Path (#2545): a click with the Objects on Path tool (in Edit Toolbar's Modify section and the Blend tool's flyout; Object › Objects on Path › Attach and the context menu with two or more objects selected choose it) attaches the selected objects to the path clicked, open or closed, in an Objects on Path group with the path at its bottom. The objects go along the path column by column from left to right, spread evenly from its first anchor (the last one sits on the end of an open path), each turned to the path at its attachment point; Pivot and Rotate set where each one attaches and how far it tilts (`object.objectsOnPath.attach`, `object.objectsOnPath.options`). Editing the path moves the objects, an object moved on its own goes back, objects moved into or out of the group in the Layers panel join or leave the path, and Object › Objects on Path › Expand leaves a plain group. The group saves and reopens live and exports as plain art. The Space, Move All, Rotate All and Select/Move widgets, Detach and the Properties panel section are missing. + Objects on Path (#2545): a click with the Objects on Path tool (in Edit Toolbar's Modify section and the Blend tool's flyout; Object › Objects on Path › Attach and the context menu with two or more objects selected choose it) attaches the selected objects to the path clicked, open or closed, in an Objects on Path group with the path at its bottom. The objects go along the path column by column from left to right, spread evenly from its first anchor (the last one sits on the end of an open path), each turned to the path at its attachment point; Pivot and Rotate set where each one attaches and how far it tilts (`object.objectsOnPath.attach`, `object.objectsOnPath.options`), and with Objects on Path groups selected the Properties panel's Objects on Path Options section shows them as a nine-point Pivot grid and a Rotate field with common angles, each change one undo step for every selected group. Editing the path moves the objects, an object moved on its own goes back, objects moved into or out of the group in the Layers panel join or leave the path, and Object › Objects on Path › Expand leaves a plain group. The group saves and reopens live and exports as plain art. The Space, Move All, Rotate All and Select/Move widgets and Detach are missing. Double-clicking the Objects on Path tool opens Objects on Path Tool Options ([Objects on Path](https://helpx.adobe.com/illustrator/using/objects-on-path.html)): the nine-point Pivot grid and the Rotate field set the attachment point and angle of the objects attached next, and groups already attached keep theirs; Reset puts the center and 0° back. Save keeps the options across tool switches and saves them with the preferences (`tool.setOption {tool: "objectsOnPath"}`). - **Paint and appearance (M3):** - **CSS swatch libraries:** fractional linear and radial gradient stop positions are preserved, so nearby stops such as 12.5% and 12.890625% remain distinct instead of collapsing to 13%. Reference: [CSS Images 3 color stops](https://www.w3.org/TR/css-images-3/#color-stop-syntax). The original synthetic regression is `palette_io::tests::css_preserves_fractional_gradient_stop_positions` in `crates/color/src/palette_io.rs`. Scores and hours are unchanged.