Persist window sizes as well
This commit is contained in:
parent
e75bef634b
commit
3418664184
|
|
@ -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));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue