diff --git a/crates/ui-egui/src/panels/properties.rs b/crates/ui-egui/src/panels/properties.rs index 36d3f24e8..84446d84f 100644 --- a/crates/ui-egui/src/panels/properties.rs +++ b/crates/ui-egui/src/panels/properties.rs @@ -579,7 +579,10 @@ pub fn transform_section(app: &mut VectorcraftApp, ui: &mut Ui) { match &**live { vectorcraft_doc::LiveShape::Rectangle { .. } => corner_radius_row(app, ui, &n, "radius"), vectorcraft_doc::LiveShape::Polygon { .. } => super::transform::polygon_rows(app, ui, &n, live, "props-polygon"), - vectorcraft_doc::LiveShape::Ellipse { pie, .. } => super::transform::pie_rows(app, ui, *pie, "props-pie"), + vectorcraft_doc::LiveShape::Ellipse { pie, .. } => { + widgets::subheader(ui, tl!("Ellipse Properties:")); + super::transform::pie_rows(app, ui, *pie, "props-pie"); + } _ => {} } } @@ -752,6 +755,22 @@ mod tests { assert_eq!(selected(&app), std::slice::from_ref(&mask), "Edit Clipping Path selects the clipping path"); } + /// #3451: the Properties panel Transform section shows ellipse pie angles and Invert Pie. + #[test] + fn transform_section_shows_ellipse_pie_properties() { + let mut app = VectorcraftApp::new(Session::new(), Default::default()); + app.run("file.new", json!({"width": 300, "height": 300})).unwrap(); + app.run("shape.ellipse", json!({"x": 50, "y": 50, "width": 120, "height": 80})).unwrap(); + let ctx = egui::Context::default(); + let labels: Vec = panel_frame(&mut app, &ctx, vec![], transform_section).into_iter().map(|(t, _)| t).collect(); + for t in ["Ellipse Properties:", "Pie Start Angle:", "0°", "Pie End Angle:", "360°", "Invert Pie"] { + assert!(labels.iter().any(|s| s == t), "{t} in {labels:?}"); + } + app.run("object.setLiveShape", json!({"pieStart": 30, "pieEnd": 120})).unwrap(); + let labels: Vec = panel_frame(&mut app, &ctx, vec![], transform_section).into_iter().map(|(t, _)| t).collect(); + assert!(labels.iter().any(|s| s == "30°") && labels.iter().any(|s| s == "120°"), "{labels:?}"); + } + /// The Snap Options and Scale Strokes & Effects checkboxes keep a visible box at rest in every /// theme, as the Preferences ones do (#1080), and toggle when clicked. #[test] diff --git a/crates/ui-egui/src/panels/transform.rs b/crates/ui-egui/src/panels/transform.rs index 67a407f02..92cedee07 100644 --- a/crates/ui-egui/src/panels/transform.rs +++ b/crates/ui-egui/src/panels/transform.rs @@ -505,6 +505,24 @@ mod tests { assert!(live(&app).polygon_sides_equal()); } + /// #3451: a live ellipse shows pie start/end angles and Invert Pie in the Transform panel and + /// the Properties panel's Transform section; typed angles update the shape. + #[test] + fn an_ellipse_shows_its_pie_properties() { + let mut app = VectorcraftApp::new(vectorcraft_engine::Session::new(), Default::default()); + app.run("file.new", json!({"width": 300, "height": 300})).unwrap(); + app.run("shape.ellipse", json!({"x": 50, "y": 50, "width": 120, "height": 80})).unwrap(); + for draw in [show as fn(&mut VectorcraftApp, &mut Ui), crate::panels::properties::transform_section] { + let shown = texts(&mut app, draw); + for t in ["Ellipse Properties:", "Pie Start Angle:", "0°", "Pie End Angle:", "360°", "Invert Pie"] { + assert!(shown.iter().any(|s| s == t), "{t} in {shown:?}"); + } + } + app.run("object.setLiveShape", json!({"pieStart": 30, "pieEnd": 120})).unwrap(); + let shown = texts(&mut app, show); + assert!(shown.iter().any(|s| s == "30°") && shown.iter().any(|s| s == "120°"), "{shown:?}"); + } + #[test] fn the_artboard_tool_shows_the_active_artboard() { let mut app = VectorcraftApp::new(vectorcraft_engine::Session::new(), Default::default());