Update viewports to stop overloading root
This commit is contained in:
parent
0d2d6bf863
commit
615b0ab9a1
38
src/app.rs
38
src/app.rs
|
|
@ -240,13 +240,17 @@ impl ApplicationHandler<UserEvent> for Application {
|
|||
}
|
||||
self.viewports
|
||||
.retain(|k, _| !inactive_viewports.contains(k));
|
||||
match self.viewports.get(&ViewportId::ROOT) {
|
||||
match self.viewports.get(&viewport_id) {
|
||||
Some(viewport) => {
|
||||
if queue_redraw {
|
||||
viewport.window.request_redraw();
|
||||
}
|
||||
}
|
||||
None => event_loop.exit(),
|
||||
None => {
|
||||
if viewport_id == ViewportId::ROOT {
|
||||
event_loop.exit();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -480,7 +484,9 @@ impl Viewport {
|
|||
if let Some(icon) = icon {
|
||||
builder = builder.with_icon(icon);
|
||||
}
|
||||
let (window, state) = create_window_and_state(&ctx, event_loop, &builder, &mut painter);
|
||||
let viewport_id = app.viewport_id();
|
||||
let (window, state) =
|
||||
create_window_and_state(&ctx, viewport_id, event_loop, &builder, &mut painter);
|
||||
egui_winit::update_viewport_info(&mut info, &ctx, &window, true);
|
||||
|
||||
let render_state = painter.render_state();
|
||||
|
|
@ -522,7 +528,7 @@ impl Viewport {
|
|||
(NonZero::new(size.width), NonZero::new(size.height))
|
||||
{
|
||||
self.painter
|
||||
.on_window_resized(ViewportId::ROOT, width, height);
|
||||
.on_window_resized(self.app.viewport_id(), width, height);
|
||||
}
|
||||
None
|
||||
}
|
||||
|
|
@ -533,14 +539,16 @@ impl Viewport {
|
|||
}
|
||||
|
||||
fn redraw(&mut self, event_loop: &ActiveEventLoop) -> Option<Action> {
|
||||
let viewport_id = self.app.viewport_id();
|
||||
let mut input = self.state.take_egui_input(&self.window);
|
||||
input.viewports = std::iter::once((ViewportId::ROOT, self.info.clone())).collect();
|
||||
input.viewports = std::iter::once((viewport_id, self.info.clone())).collect();
|
||||
input.viewport_id = viewport_id;
|
||||
let mut output = self.ctx.run_ui(input, |ui| {
|
||||
self.app.show(ui);
|
||||
});
|
||||
let clipped_primitives = self.ctx.tessellate(output.shapes, output.pixels_per_point);
|
||||
self.painter.paint_and_update_textures(
|
||||
ViewportId::ROOT,
|
||||
viewport_id,
|
||||
output.pixels_per_point,
|
||||
[0.0, 0.0, 0.0, 0.0],
|
||||
&clipped_primitives,
|
||||
|
|
@ -551,14 +559,19 @@ impl Viewport {
|
|||
self.state
|
||||
.handle_platform_output(&self.window, output.platform_output);
|
||||
|
||||
let Some(mut viewport_output) = output.viewport_output.remove(&ViewportId::ROOT) else {
|
||||
let Some(mut viewport_output) = output.viewport_output.remove(&viewport_id) else {
|
||||
return Some(Action::Close);
|
||||
};
|
||||
|
||||
let (mut deferred_commands, recreate) = self.builder.patch(viewport_output.builder);
|
||||
if recreate {
|
||||
let (window, state) =
|
||||
create_window_and_state(&self.ctx, event_loop, &self.builder, &mut self.painter);
|
||||
let (window, state) = create_window_and_state(
|
||||
&self.ctx,
|
||||
viewport_id,
|
||||
event_loop,
|
||||
&self.builder,
|
||||
&mut self.painter,
|
||||
);
|
||||
egui_winit::update_viewport_info(&mut self.info, &self.ctx, &window, true);
|
||||
self.window = window;
|
||||
self.state = state;
|
||||
|
|
@ -613,16 +626,17 @@ pub enum Action {
|
|||
|
||||
fn create_window_and_state(
|
||||
ctx: &Context,
|
||||
viewport_id: ViewportId,
|
||||
event_loop: &ActiveEventLoop,
|
||||
builder: &ViewportBuilder,
|
||||
painter: &mut egui_wgpu::winit::Painter,
|
||||
) -> (Arc<Window>, egui_winit::State) {
|
||||
pollster::block_on(painter.set_window(ViewportId::ROOT, None)).unwrap();
|
||||
pollster::block_on(painter.set_window(viewport_id, None)).unwrap();
|
||||
let window = Arc::new(egui_winit::create_window(ctx, event_loop, builder).unwrap());
|
||||
pollster::block_on(painter.set_window(ViewportId::ROOT, Some(window.clone()))).unwrap();
|
||||
pollster::block_on(painter.set_window(viewport_id, Some(window.clone()))).unwrap();
|
||||
let state = egui_winit::State::new(
|
||||
ctx.clone(),
|
||||
ViewportId::ROOT,
|
||||
viewport_id,
|
||||
event_loop,
|
||||
Some(window.scale_factor() as f32),
|
||||
event_loop.system_theme(),
|
||||
|
|
|
|||
Loading…
Reference in New Issue