From 34186641845ad4f1ba5285f83535470eb0dc763e Mon Sep 17 00:00:00 2001 From: Simon Gellis Date: Sat, 4 Apr 2026 23:25:02 -0400 Subject: [PATCH] Persist window sizes as well --- src/window/game.rs | 34 +++++++++++++++++++++++++++------- 1 file changed, 27 insertions(+), 7 deletions(-) diff --git a/src/window/game.rs b/src/window/game.rs index 6600393..48f140e 100644 --- a/src/window/game.rs +++ b/src/window/game.rs @@ -15,7 +15,7 @@ use crate::{ window::{ AboutWindow, BgMapWindow, CharacterDataWindow, FrameBufferWindow, GdbServerWindow, HotkeysWindow, InitArgs, InputWindow, ObjectWindow, ProfileWindow, RegisterWindow, - TerminalWindow, WorldWindow, + TerminalWindow, WorldWindow, utils::UiData, }, }; use anyhow::Context as _; @@ -50,6 +50,8 @@ pub struct GameWindow { images: Arc, mappings: MappingProvider, children: ViewportIdMap, + child_sizes: UiData>, + queued_children: Vec, } impl GameWindow { @@ -89,10 +91,23 @@ impl GameWindow { images: images.clone(), mappings: mappings.clone(), children: ViewportIdMap::default(), + child_sizes: UiData::new(), + queued_children: vec![], } } pub fn open(&mut self, window: ChildWindow) { + // queue opening this child until our next render call, + // so that we get a chance to look up its size + self.queued_children.push(window); + } + + pub fn close(&mut self, window: ChildWindow) { + let id = window.viewport_id(self.sim_id); + self.children.remove(&id); + } + + fn do_open(&mut self, window: ChildWindow) { let viewport_id = window.viewport_id(self.sim_id); if self.children.contains_key(&viewport_id) { return; @@ -159,7 +174,10 @@ impl GameWindow { } }; - let viewport = child.initial_viewport(); + let mut viewport = child.initial_viewport(); + if let Some(size) = self.child_sizes.get(&viewport_id) { + viewport.inner_size = Some(*size); + } self.children.insert( viewport_id, ChildWindowWrapper { @@ -170,11 +188,6 @@ impl GameWindow { ); } - pub fn close(&mut self, window: ChildWindow) { - let id = window.viewport_id(self.sim_id); - self.children.remove(&id); - } - pub fn handle_init(&mut self, viewport_id: ViewportId, args: InitArgs) { self.handle_event(viewport_id, |window| window.on_init(args)) } @@ -619,6 +632,7 @@ impl AppWindow for GameWindow { } fn show(&mut self, ui: &mut Ui) { + self.child_sizes.load(ui); let dimensions = { let bounds = ui.content_rect(); bounds.max - bounds.min @@ -652,6 +666,9 @@ impl AppWindow for GameWindow { } }); self.toasts.show(ui); + for window in std::mem::take(&mut self.queued_children) { + self.do_open(window); + } self.children.retain(|id, child| { if child .close_requested @@ -662,6 +679,8 @@ impl AppWindow for GameWindow { let app = child.app.clone(); let viewport_builder = child.updates.take().unwrap_or_default(); let close_requested = child.close_requested.clone(); + let size = ui.input_for(*id, |v| v.viewport_rect().size()); + self.child_sizes.insert(*id, size); ui.show_viewport_deferred(*id, viewport_builder, move |ui, _| { app.lock().unwrap().show(ui); if ui.input(|s| s.viewport().close_requested()) { @@ -670,6 +689,7 @@ impl AppWindow for GameWindow { }); true }); + self.child_sizes.save(ui); ui.request_repaint_after(Duration::from_millis(10)); }