1
0
mirror of https://github.com/emilk/egui.git synced 2026-09-01 06:10:06 -04:00

Clarify logic around how viewports are retained, and add ViewportIdSet

This commit is contained in:
Emil Ernerfeldt
2023-11-07 11:14:04 +01:00
parent 54c6d51b66
commit 645521bcee
5 changed files with 32 additions and 15 deletions

View File

@@ -459,8 +459,8 @@ fn run_and_exit(event_loop: EventLoop<UserEvent>, mut winit_app: impl WinitApp +
mod glow_integration { mod glow_integration {
use egui::{ use egui::{
epaint::ahash::HashMap, NumExt as _, ViewportIdMap, ViewportIdPair, ViewportOutput, epaint::ahash::HashMap, NumExt as _, ViewportIdMap, ViewportIdPair, ViewportIdSet,
ViewportUiCallback, ViewportOutput, ViewportUiCallback,
}; };
use egui_winit::{create_winit_window_builder, process_viewport_commands, EventResponse}; use egui_winit::{create_winit_window_builder, process_viewport_commands, EventResponse};
use glutin::{ use glutin::{
@@ -1256,7 +1256,8 @@ mod glow_integration {
glutin_ctx: &Rc<RefCell<GlutinWindowContext>>, glutin_ctx: &Rc<RefCell<GlutinWindowContext>>,
mut viewports: Vec<ViewportOutput>, mut viewports: Vec<ViewportOutput>,
) { ) {
let mut active_viewports_ids = vec![ViewportId::ROOT]; let mut active_viewports_ids = ViewportIdSet::default();
active_viewports_ids.insert(ViewportId::ROOT);
viewports.retain_mut( viewports.retain_mut(
|ViewportOutput { |ViewportOutput {
@@ -1280,7 +1281,7 @@ mod glow_integration {
} else if let Some(w) = viewport.window.clone() { } else if let Some(w) = viewport.window.clone() {
process_viewport_commands(commands, *id, None, &w.borrow()); process_viewport_commands(commands, *id, None, &w.borrow());
} }
active_viewports_ids.push(*id); active_viewports_ids.insert(*id);
false false
} else { } else {
true true
@@ -1316,7 +1317,7 @@ mod glow_integration {
); );
glutin.builders.insert(id_pair.this, builder); glutin.builders.insert(id_pair.this, builder);
} }
active_viewports_ids.push(id_pair.this); active_viewports_ids.insert(id_pair.this);
} }
let mut glutin = glutin_ctx.borrow_mut(); let mut glutin = glutin_ctx.borrow_mut();
@@ -1886,10 +1887,11 @@ pub use glow_integration::run_glow;
#[cfg(feature = "wgpu")] #[cfg(feature = "wgpu")]
mod wgpu_integration { mod wgpu_integration {
use egui::{ViewportIdMap, ViewportIdPair, ViewportOutput, ViewportUiCallback};
use egui_winit::{create_winit_window_builder, process_viewport_commands};
use parking_lot::Mutex; use parking_lot::Mutex;
use egui::{ViewportIdMap, ViewportIdPair, ViewportIdSet, ViewportOutput, ViewportUiCallback};
use egui_winit::{create_winit_window_builder, process_viewport_commands};
use super::*; use super::*;
#[derive(Clone)] #[derive(Clone)]
@@ -2510,7 +2512,8 @@ mod wgpu_integration {
integration.post_present(&window.borrow()); integration.post_present(&window.borrow());
} }
let mut active_viewports_ids = vec![ViewportId::ROOT]; let mut active_viewports_ids = ViewportIdSet::default();
active_viewports_ids.insert(ViewportId::ROOT);
out_viewports.retain_mut( out_viewports.retain_mut(
|ViewportOutput { |ViewportOutput {
@@ -2521,7 +2524,7 @@ mod wgpu_integration {
if let Some(viewport) = viewports.borrow_mut().get_mut(this) { if let Some(viewport) = viewports.borrow_mut().get_mut(this) {
viewport.viewport_ui_cb = viewport_ui_cb.clone(); viewport.viewport_ui_cb = viewport_ui_cb.clone();
viewport.parent_id = *parent; viewport.parent_id = *parent;
active_viewports_ids.push(*this); active_viewports_ids.insert(*this);
false false
} else { } else {
true true
@@ -2577,7 +2580,7 @@ mod wgpu_integration {
builders.insert(id_pair.this, new_builder); builders.insert(id_pair.this, new_builder);
} }
active_viewports_ids.push(id_pair.this); active_viewports_ids.insert(id_pair.this);
} }
for (viewport_id, command) in viewport_commands { for (viewport_id, command) in viewport_commands {

View File

@@ -1,6 +1,6 @@
use std::{num::NonZeroU32, sync::Arc}; use std::{num::NonZeroU32, sync::Arc};
use egui::{ViewportId, ViewportIdMap}; use egui::{ViewportId, ViewportIdMap, ViewportIdSet};
use crate::{renderer, RenderState, SurfaceErrorAction, WgpuConfiguration}; use crate::{renderer, RenderState, SurfaceErrorAction, WgpuConfiguration};
@@ -625,7 +625,7 @@ impl Painter {
screenshot screenshot
} }
pub fn clean_surfaces(&mut self, available_viewports: &[ViewportId]) { pub fn clean_surfaces(&mut self, available_viewports: &ViewportIdSet) {
self.surfaces self.surfaces
.retain(|id, _| available_viewports.contains(id)); .retain(|id, _| available_viewports.contains(id));
self.depth_texture_view self.depth_texture_view

View File

@@ -1551,7 +1551,7 @@ impl Context {
let was_used = viewport.used; let was_used = viewport.used;
if viewport_id == viewport.id_pair.parent { if viewport_id == viewport.id_pair.parent {
viewport.used = false; viewport.used = false; // reset so we can check again next frame
} }
viewports.push(ViewportOutput { viewports.push(ViewportOutput {
@@ -1560,8 +1560,19 @@ impl Context {
viewport_ui_cb: viewport.viewport_ui_cb.clone(), viewport_ui_cb: viewport.viewport_ui_cb.clone(),
}); });
(was_used || viewport_id != viewport.id_pair.parent) if !all_viewport_ids.contains(&viewport.id_pair.parent) {
&& all_viewport_ids.contains(&viewport.id_pair.parent) // Parent is gone - remove this viewport.
return false;
}
let is_child = viewport_id == viewport.id_pair.parent;
if is_child {
// Keep all children that have been updated this frame
was_used
} else {
// Somebody elses child - don't touch
true
}
}); });
}); });

View File

@@ -22,8 +22,10 @@ pub struct FullOutput {
/// You can use [`crate::Context::tessellate`] to turn this into triangles. /// You can use [`crate::Context::tessellate`] to turn this into triangles.
pub shapes: Vec<epaint::ClippedShape>, pub shapes: Vec<epaint::ClippedShape>,
/// All the active viewports, including the root.
pub viewports: Vec<ViewportOutput>, pub viewports: Vec<ViewportOutput>,
/// Commands sent to different viewports.
pub viewport_commands: Vec<(ViewportId, ViewportCommand)>, pub viewport_commands: Vec<(ViewportId, ViewportCommand)>,
} }

View File

@@ -641,6 +641,7 @@ pub(crate) struct Viewport {
/// Id of us and our parent. /// Id of us and our parent.
pub(crate) id_pair: ViewportIdPair, pub(crate) id_pair: ViewportIdPair,
/// Has this viewport been updated this frame?
pub(crate) used: bool, pub(crate) used: bool,
/// The user-code that shows the GUI, used for "async" viewports. /// The user-code that shows the GUI, used for "async" viewports.