Persist window sizes as well
This commit is contained in:
parent
e75bef634b
commit
3418664184
|
|
@ -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<ImageTextureLoader>,
|
||||
mappings: MappingProvider,
|
||||
children: ViewportIdMap<ChildWindowWrapper>,
|
||||
child_sizes: UiData<ViewportIdMap<Vec2>>,
|
||||
queued_children: Vec<ChildWindow>,
|
||||
}
|
||||
|
||||
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));
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue