1
0
mirror of https://github.com/emilk/egui.git synced 2026-06-27 15:13:12 -04:00

Add helper function for initializing/updating viewports

This commit is contained in:
Emil Ernerfeldt
2023-11-14 06:41:18 +01:00
parent 002110ee3d
commit 4be66c057f

View File

@@ -2415,6 +2415,7 @@ mod wgpu_integration {
shared.painter.destroy();
}
/// This is called both for the root viewport, and all deferred viewports
fn run_ui_and_paint(
&mut self,
window_id: WindowId,
@@ -2422,6 +2423,7 @@ mod wgpu_integration {
) -> EventResult {
#[cfg(feature = "puffin")]
puffin::GlobalProfiler::lock().new_frame();
crate::profile_scope!("frame");
let WgpuWinitRunning {
@@ -2587,53 +2589,19 @@ mod wgpu_integration {
// Add new viewports, and update existing ones:
for ViewportOutput {
ids,
mut builder,
builder,
viewport_ui_cb,
} in out_viewports
{
active_viewports_ids.insert(ids.this);
if builder.icon.is_none() {
// Inherit icon from parent
builder.icon = viewports
.get_mut(&ids.parent)
.and_then(|vp| vp.builder.icon.clone());
}
match viewports.entry(ids.this) {
std::collections::hash_map::Entry::Vacant(entry) => {
// New viewport:
entry.insert(Viewport {
ids,
builder,
viewport_ui_cb,
window: None,
egui_winit: None,
});
}
std::collections::hash_map::Entry::Occupied(mut entry) => {
// Patch an existing viewport:
let viewport = entry.get_mut();
viewport.ids.parent = ids.parent;
viewport.viewport_ui_cb = viewport_ui_cb;
let (commands, recreate) = viewport.builder.patch(&builder);
if recreate {
if let Some(viewport) = viewports.get_mut(&ids.this) {
viewport.window = None;
viewport.egui_winit = None;
}
} else if let Some(viewport) = viewports.get(&ids.this) {
if let Some(window) = &viewport.window {
let is_viewport_focused = focused_viewport == Some(viewport_id);
process_viewport_commands(commands, window, is_viewport_focused);
}
}
}
}
initialize_or_update_viewport(
viewports,
ids,
builder,
viewport_ui_cb,
focused_viewport,
);
}
for (viewport_id, command) in viewport_commands {
@@ -2771,6 +2739,54 @@ mod wgpu_integration {
}
}
fn initialize_or_update_viewport(
viewports: &mut Viewports,
ids: ViewportIdPair,
mut builder: ViewportBuilder,
viewport_ui_cb: Option<Arc<dyn Fn(&egui::Context) + Send + Sync>>,
focused_viewport: Option<ViewportId>,
) -> &mut Viewport {
if builder.icon.is_none() {
// Inherit icon from parent
builder.icon = viewports
.get_mut(&ids.parent)
.and_then(|vp| vp.builder.icon.clone());
}
match viewports.entry(ids.this) {
std::collections::hash_map::Entry::Vacant(entry) => {
// New viewport:
entry.insert(Viewport {
ids,
builder,
viewport_ui_cb,
window: None,
egui_winit: None,
})
}
std::collections::hash_map::Entry::Occupied(mut entry) => {
// Patch an existing viewport:
let viewport = entry.get_mut();
viewport.ids.parent = ids.parent;
viewport.viewport_ui_cb = viewport_ui_cb;
let (commands, recreate) = viewport.builder.patch(&builder);
if recreate {
viewport.window = None;
viewport.egui_winit = None;
} else if let Some(window) = &viewport.window {
let is_viewport_focused = focused_viewport == Some(ids.this);
process_viewport_commands(commands, window, is_viewport_focused);
}
entry.into_mut()
}
}
}
pub fn run_wgpu(
app_name: &str,
mut native_options: epi::NativeOptions,