diff --git a/crates/engine/src/cmd/extra.rs b/crates/engine/src/cmd/extra.rs index a08f080..69789a3 100644 --- a/crates/engine/src/cmd/extra.rs +++ b/crates/engine/src/cmd/extra.rs @@ -743,6 +743,17 @@ fn custom_views(s: &mut Session, p: &Json) -> Result { if let Some(z) = v["zoom"].as_u64() { s.execute("view.zoom", json!({"percent": z}))?; } + if let Some(f) = v.get("freeze") { + let freeze = match (f[0].as_u64(), f[1].as_u64()) { + (Some(r), Some(c)) => u32::try_from(r).ok().zip(u32::try_from(c).ok()), + _ => None, + }; + edit(s, |cx| { + let si = cx.sheet_index(); + cx.sheet_mut(si)?.freeze = freeze; + Ok(()) + })?; + } } else if let Some(name) = str_param(p, "delete") { if let Some(o) = views.as_object_mut() { o.remove(name); diff --git a/crates/engine/tests/custom_view_freeze.rs b/crates/engine/tests/custom_view_freeze.rs new file mode 100644 index 0000000..e0d6a2d --- /dev/null +++ b/crates/engine/tests/custom_view_freeze.rs @@ -0,0 +1,28 @@ +use gridcraft_engine::Session; +use serde_json::json; + +fn freeze(s: &Session) -> Option<(u32, u32)> { + s.doc().unwrap().wb.active().unwrap().freeze +} + +#[test] +fn showing_a_custom_view_restores_its_frozen_panes() { + let mut s = Session::new(); + s.new_workbook(); + s.execute("view.freezePanes", json!({"cell": "B2"})).unwrap(); + s.execute("view.customViews", json!({"save": "Frozen"})).unwrap(); + s.execute("view.unfreezePanes", json!({})).unwrap(); + assert_eq!(freeze(&s), None); + s.execute("view.customViews", json!({"show": "Frozen"})).unwrap(); + assert_eq!(freeze(&s), Some((1, 1))); +} + +#[test] +fn showing_an_unfrozen_custom_view_clears_current_panes() { + let mut s = Session::new(); + s.new_workbook(); + s.execute("view.customViews", json!({"save": "Plain"})).unwrap(); + s.execute("view.freezePanes", json!({"cell": "B2"})).unwrap(); + s.execute("view.customViews", json!({"show": "Plain"})).unwrap(); + assert_eq!(freeze(&s), None); +}