From 2b75c63431a0d6a2729a28361fb88a33a35d2e70 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Max=20Mittelst=C3=A4dt?= <62167861+TheGalitube@users.noreply.github.com> Date: Thu, 29 Oct 2026 11:03:58 +0000 Subject: [PATCH] Retain spacing when rearranging artboards Fixes #4558 Co-Authored-By: GPT-6-Luna --- .../src/dialogs/rearrange_artboards.rs | 25 ++++++++++++++++++- crates/ui-egui/src/menus/invoke.rs | 2 +- crates/ui-egui/src/state.rs | 4 +++ 3 files changed, 29 insertions(+), 2 deletions(-) diff --git a/crates/ui-egui/src/dialogs/rearrange_artboards.rs b/crates/ui-egui/src/dialogs/rearrange_artboards.rs index 7a619878c..56218b249 100644 --- a/crates/ui-egui/src/dialogs/rearrange_artboards.rs +++ b/crates/ui-egui/src/dialogs/rearrange_artboards.rs @@ -30,6 +30,15 @@ pub fn fields() -> Value { json!({"layout": "gridByRow", "order": "leftToRight", "columns": 2, "spacing": 20, "moveArtwork": true}) } +/// The fields the menu item opens with, retaining the spacing from its last confirmation. +pub fn open_fields(app: &VectorcraftApp) -> Value { + let mut fields = fields(); + if let Some(spacing) = app.ui.rearrange_artboards_spacing.as_f64() { + fields["spacing"] = json!(spacing); + } + fields +} + /// A layout's toggle: its tooltip and its artboards' cells (column, row) in their order, left to /// right. fn layout_glyph(l: ArtboardLayout) -> (&'static str, &'static [(u8, u8)]) { @@ -110,7 +119,9 @@ fn body(app: &mut VectorcraftApp, ui: &mut egui::Ui, d: &mut Dialog) -> bool { } fn confirm(app: &mut VectorcraftApp, d: &Dialog) -> Result { - run_and_close(app, CMD, params(d)) + let result = run_and_close(app, CMD, params(d))?; + app.ui.rearrange_artboards_spacing = json!(d.f64("spacing", 20.0)); + Ok(result) } #[cfg(test)] @@ -170,6 +181,18 @@ mod tests { } /// Clicking the layout and order toggles sets the fields (the toggles' rects from the frame). + #[test] + fn keeps_spacing_when_reopening_after_rearranging() { + let mut app = VectorcraftApp::new(Session::new(), Default::default()); + app.run("file.new", json!({"width": 100, "height": 50, "artboards": 3})).unwrap(); + app.run("ui.menuDialog", json!({"command": CMD})).unwrap(); + app.ui.dialog.as_mut().unwrap().fields.insert("spacing".into(), json!(37)); + crate::dialogs::confirm(&mut app).unwrap(); + + app.run("ui.menuDialog", json!({"command": CMD})).unwrap(); + assert_eq!(app.ui.dialog.as_ref().unwrap().f64("spacing", 20.0), 37.0); + } + #[test] fn the_toggles_set_layout_and_order() { let mut app = VectorcraftApp::new(Session::new(), Default::default()); diff --git a/crates/ui-egui/src/menus/invoke.rs b/crates/ui-egui/src/menus/invoke.rs index 4ab9315e5..30ef1693e 100644 --- a/crates/ui-egui/src/menus/invoke.rs +++ b/crates/ui-egui/src/menus/invoke.rs @@ -62,7 +62,7 @@ pub(super) fn menu_dialog(app: &VectorcraftApp, id: &str) -> Option<(&'static st ("splitIntoGrid", crate::dialogs::path_ops::split_fields(size.0, size.1)) } "object.vectorHalftone" => (crate::dialogs::halftone::KIND, crate::dialogs::halftone::fields()), - "artboard.rearrange" => (crate::dialogs::rearrange_artboards::KIND, crate::dialogs::rearrange_artboards::fields()), + "artboard.rearrange" => (crate::dialogs::rearrange_artboards::KIND, crate::dialogs::rearrange_artboards::open_fields(app)), _ => return None, }) } diff --git a/crates/ui-egui/src/state.rs b/crates/ui-egui/src/state.rs index bfe63c699..e7460b7e8 100644 --- a/crates/ui-egui/src/state.rs +++ b/crates/ui-egui/src/state.rs @@ -555,6 +555,9 @@ pub struct UiState { /// them (#1732). #[serde(default)] pub transform_each: Value, + /// The spacing used the last time Rearrange All Artboards was confirmed. + #[serde(default)] + pub rearrange_artboards_spacing: Value, /// The DXF Import Options chosen last (fit, scaleLineweights, center, mergeLayers; null: /// never used). #[serde(default)] @@ -878,6 +881,7 @@ impl Default for UiState { simplify: Value::Null, move_options: Value::Null, transform_each: Value::Null, + rearrange_artboards_spacing: Value::Null, dxf_import: Value::Null, home: None, trace_hold_source: None,