Persist window sizes as well

This commit is contained in:
Simon Gellis 2026-04-04 23:25:02 -04:00
parent e75bef634b
commit 3418664184
No known key found for this signature in database
GPG Key ID: DA576912FED9577B
1 changed files with 27 additions and 7 deletions

View File

@ -15,7 +15,7 @@ use crate::{
window::{ window::{
AboutWindow, BgMapWindow, CharacterDataWindow, FrameBufferWindow, GdbServerWindow, AboutWindow, BgMapWindow, CharacterDataWindow, FrameBufferWindow, GdbServerWindow,
HotkeysWindow, InitArgs, InputWindow, ObjectWindow, ProfileWindow, RegisterWindow, HotkeysWindow, InitArgs, InputWindow, ObjectWindow, ProfileWindow, RegisterWindow,
TerminalWindow, WorldWindow, TerminalWindow, WorldWindow, utils::UiData,
}, },
}; };
use anyhow::Context as _; use anyhow::Context as _;
@ -50,6 +50,8 @@ pub struct GameWindow {
images: Arc<ImageTextureLoader>, images: Arc<ImageTextureLoader>,
mappings: MappingProvider, mappings: MappingProvider,
children: ViewportIdMap<ChildWindowWrapper>, children: ViewportIdMap<ChildWindowWrapper>,
child_sizes: UiData<ViewportIdMap<Vec2>>,
queued_children: Vec<ChildWindow>,
} }
impl GameWindow { impl GameWindow {
@ -89,10 +91,23 @@ impl GameWindow {
images: images.clone(), images: images.clone(),
mappings: mappings.clone(), mappings: mappings.clone(),
children: ViewportIdMap::default(), children: ViewportIdMap::default(),
child_sizes: UiData::new(),
queued_children: vec![],
} }
} }
pub fn open(&mut self, window: ChildWindow) { 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); let viewport_id = window.viewport_id(self.sim_id);
if self.children.contains_key(&viewport_id) { if self.children.contains_key(&viewport_id) {
return; 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( self.children.insert(
viewport_id, viewport_id,
ChildWindowWrapper { 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) { pub fn handle_init(&mut self, viewport_id: ViewportId, args: InitArgs) {
self.handle_event(viewport_id, |window| window.on_init(args)) 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) { fn show(&mut self, ui: &mut Ui) {
self.child_sizes.load(ui);
let dimensions = { let dimensions = {
let bounds = ui.content_rect(); let bounds = ui.content_rect();
bounds.max - bounds.min bounds.max - bounds.min
@ -652,6 +666,9 @@ impl AppWindow for GameWindow {
} }
}); });
self.toasts.show(ui); self.toasts.show(ui);
for window in std::mem::take(&mut self.queued_children) {
self.do_open(window);
}
self.children.retain(|id, child| { self.children.retain(|id, child| {
if child if child
.close_requested .close_requested
@ -662,6 +679,8 @@ impl AppWindow for GameWindow {
let app = child.app.clone(); let app = child.app.clone();
let viewport_builder = child.updates.take().unwrap_or_default(); let viewport_builder = child.updates.take().unwrap_or_default();
let close_requested = child.close_requested.clone(); 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, _| { ui.show_viewport_deferred(*id, viewport_builder, move |ui, _| {
app.lock().unwrap().show(ui); app.lock().unwrap().show(ui);
if ui.input(|s| s.viewport().close_requested()) { if ui.input(|s| s.viewport().close_requested()) {
@ -670,6 +689,7 @@ impl AppWindow for GameWindow {
}); });
true true
}); });
self.child_sizes.save(ui);
ui.request_repaint_after(Duration::from_millis(10)); ui.request_repaint_after(Duration::from_millis(10));
} }