mirror of
https://github.com/storytold/gridcraft.git
synced 2026-10-26 11:46:49 -06:00
UiState gains interfaceScale (percent, 100 = Auto, 75–200), saved in
ui.json and applied as egui's zoom factor on top of the desktop scale.
New UI command view.interfaceScale {percent | "auto"} clamps hostile
values; a malformed saved value reads as 100. View tab gets an
"Interface size" picker. egui's built-in keyboard zoom is turned off so the
preference owns the zoom.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
43 lines
1.9 KiB
Rust
43 lines
1.9 KiB
Rust
//! Interface size preference (#230): a persistent zoom for the whole window, clamped.
|
|
|
|
use gridcraft_engine::Session;
|
|
use gridcraft_ui_egui::{SheetApp, UiState};
|
|
use serde_json::json;
|
|
|
|
#[test]
|
|
fn interface_size_applies_persists_and_clamps() {
|
|
let mut session = Session::new();
|
|
session.new_workbook();
|
|
let mut h = egui_kittest::Harness::builder().with_size(egui::vec2(1200.0, 800.0)).build_ui_state(
|
|
|ui, app: &mut SheetApp| {
|
|
app.logic(ui.ctx());
|
|
app.ui(ui);
|
|
},
|
|
SheetApp::new(session, Default::default()),
|
|
);
|
|
h.run_steps(2);
|
|
assert_eq!(h.ctx.zoom_factor(), 1.0);
|
|
|
|
h.state_mut().run("view.interfaceScale", json!({"percent": 125})).unwrap();
|
|
h.run_steps(2);
|
|
assert_eq!(h.ctx.zoom_factor(), 1.25);
|
|
let saved: UiState = serde_json::from_str(&serde_json::to_string(&h.state().ui).unwrap()).unwrap();
|
|
assert_eq!(saved.interface_scale, 125);
|
|
|
|
// Hostile and missing values: clamped or refused, never applied raw.
|
|
assert_eq!(h.state_mut().run("view.interfaceScale", json!({"percent": 1e12})).unwrap()["percent"], 200);
|
|
assert_eq!(h.state_mut().run("view.interfaceScale", json!({"percent": -5})).unwrap()["percent"], 75);
|
|
assert!(h.state_mut().run("view.interfaceScale", json!({})).is_err(), "no value is an error, not a dialog");
|
|
assert!(h.state_mut().run("view.interfaceScale", json!({"percent": "huge"})).is_err());
|
|
h.state_mut().run("view.interfaceScale", json!({"percent": "auto"})).unwrap();
|
|
h.run_steps(2);
|
|
assert_eq!(h.ctx.zoom_factor(), 1.0);
|
|
|
|
// A malformed or out-of-range ui.json keeps the other preferences.
|
|
let ui: UiState = serde_json::from_str(r#"{"dark": true, "interfaceScale": "big"}"#).unwrap();
|
|
assert!(ui.dark);
|
|
assert_eq!(ui.interface_scale, 100);
|
|
let ui: UiState = serde_json::from_str(r#"{"interfaceScale": 900}"#).unwrap();
|
|
assert_eq!(ui.interface_scale, 200);
|
|
}
|