1
0
mirror of https://github.com/emilk/egui.git synced 2026-08-31 22:00:03 -04:00

Reduce indentation by making some function non-members

This commit is contained in:
Emil Ernerfeldt
2023-11-12 15:35:13 +01:00
parent 93cb96e528
commit 6ddc22e122

View File

@@ -897,18 +897,22 @@ mod glow_integration {
let mut active_viewports_ids = ViewportIdSet::default(); let mut active_viewports_ids = ViewportIdSet::default();
active_viewports_ids.insert(ViewportId::ROOT); active_viewports_ids.insert(ViewportId::ROOT);
// Process existing viewpors:
viewports.retain_mut( viewports.retain_mut(
|ViewportOutput { |ViewportOutput {
builder: new_builder, builder: new_builder,
id_pair: ViewportIdPair { this: id, parent }, id_pair,
viewport_ui_cb, viewport_ui_cb,
}| { }| {
let builder = self.builders.entry(*id).or_insert(new_builder.clone()); let builder = self
.builders
.entry(id_pair.this)
.or_insert(new_builder.clone());
let (commands, recreate) = builder.patch(new_builder); let (commands, recreate) = builder.patch(new_builder);
if let Some(viewport) = self.viewports.get(id) { if let Some(viewport) = self.viewports.get(&id_pair.this) {
let mut viewport = viewport.borrow_mut(); let mut viewport = viewport.borrow_mut();
viewport.id_pair.parent = *parent; viewport.id_pair.parent = id_pair.parent;
viewport.viewport_ui_cb = viewport_ui_cb.clone(); // always update the latest callback viewport.viewport_ui_cb = viewport_ui_cb.clone(); // always update the latest callback
if recreate { if recreate {
@@ -922,7 +926,7 @@ mod glow_integration {
is_viewport_focused, is_viewport_focused,
); );
} }
active_viewports_ids.insert(*id); active_viewports_ids.insert(id_pair.this);
false false
} else { } else {
true true
@@ -930,6 +934,7 @@ mod glow_integration {
}, },
); );
// Process new viewports:
for ViewportOutput { for ViewportOutput {
mut builder, mut builder,
id_pair, id_pair,
@@ -959,6 +964,7 @@ mod glow_integration {
active_viewports_ids.insert(id_pair.this); active_viewports_ids.insert(id_pair.this);
} }
// GC old viewports
self.viewports self.viewports
.retain(|id, _| active_viewports_ids.contains(id)); .retain(|id, _| active_viewports_ids.contains(id));
self.builders self.builders
@@ -1190,7 +1196,7 @@ mod glow_integration {
#[allow(unsafe_code)] #[allow(unsafe_code)]
let event_loop = unsafe { event_loop.as_ref().unwrap() }; let event_loop = unsafe { event_loop.as_ref().unwrap() };
Self::render_immediate_viewport( render_immediate_viewport(
event_loop, event_loop,
egui_ctx, egui_ctx,
viewport_builder, viewport_builder,
@@ -1218,139 +1224,134 @@ mod glow_integration {
Ok(()) Ok(())
} }
}
/// This is called (via a callback) by user code to render immediate viewports, /// This is called (via a callback) by user code to render immediate viewports,
/// i.e. viewport that are directly nested inside a parent viewport. /// i.e. viewport that are directly nested inside a parent viewport.
#[inline(always)] #[inline(always)]
#[allow(clippy::too_many_arguments)] #[allow(clippy::too_many_arguments)]
fn render_immediate_viewport( fn render_immediate_viewport(
event_loop: &EventLoopWindowTarget<UserEvent>, event_loop: &EventLoopWindowTarget<UserEvent>,
egui_ctx: &egui::Context, egui_ctx: &egui::Context,
mut viewport_builder: ViewportBuilder, mut viewport_builder: ViewportBuilder,
id_pair: ViewportIdPair, id_pair: ViewportIdPair,
viewport_ui_cb: Box<dyn FnOnce(&egui::Context) + '_>, viewport_ui_cb: Box<dyn FnOnce(&egui::Context) + '_>,
glutin: &RefCell<GlutinWindowContext>, glutin: &RefCell<GlutinWindowContext>,
gl: &glow::Context, gl: &glow::Context,
painter: &RefCell<egui_glow::Painter>, painter: &RefCell<egui_glow::Painter>,
beginning: Instant, beginning: Instant,
) { ) {
crate::profile_function!(); crate::profile_function!();
if !glutin.borrow().viewports.contains_key(&id_pair.this) { if !glutin.borrow().viewports.contains_key(&id_pair.this) {
// A new viewport - create a window for it! // A new viewport - create a window for it!
let mut glutin = glutin.borrow_mut();
// Inherit parent icon if none
if viewport_builder.icon.is_none() && glutin.builders.get(&id_pair.this).is_none() {
viewport_builder.icon = glutin
.builders
.get(&id_pair.parent)
.and_then(|b| b.icon.clone());
}
glutin
.viewports
.entry(id_pair.this)
.or_insert(Rc::new(RefCell::new(Viewport::new(id_pair))));
glutin
.builders
.entry(id_pair.this)
.or_insert(viewport_builder);
glutin.init_viewport(id_pair.this, event_loop).expect(
"Failed to initialize window in egui::Context::show_viewport_immediate",
);
}
let viewport = glutin.borrow().viewports.get(&id_pair.this).cloned();
let Some(viewport) = viewport else { return };
let viewport = &mut *viewport.borrow_mut();
let Some(winit_state) = &mut viewport.egui_winit else {
return;
};
let Some(window) = &viewport.window else {
return;
};
let window = window.borrow();
let mut input = winit_state.take_egui_input(&window, id_pair);
input.time = Some(beginning.elapsed().as_secs_f64());
// ---------------------------------------------------
// Call the user ui-code, which could re-entrantly call this function again!
// No locks may be hold while calling this function.
let output = egui_ctx.run(input, |ctx| {
viewport_ui_cb(ctx);
});
// ---------------------------------------------------
let screen_size_in_pixels: [u32; 2] = window.inner_size().into();
let clipped_primitives = egui_ctx.tessellate(output.shapes);
let mut glutin = glutin.borrow_mut(); let mut glutin = glutin.borrow_mut();
let mut painter = painter.borrow_mut();
glutin.current_gl_context = Some( // Inherit parent icon if none
glutin if viewport_builder.icon.is_none() && glutin.builders.get(&id_pair.this).is_none() {
.current_gl_context viewport_builder.icon = glutin
.take() .builders
.unwrap() .get(&id_pair.parent)
.make_not_current() .and_then(|b| b.icon.clone());
.unwrap() }
.make_current(viewport.gl_surface.as_ref().unwrap())
.unwrap(),
);
if !viewport glutin
.viewports
.entry(id_pair.this)
.or_insert(Rc::new(RefCell::new(Viewport::new(id_pair))));
glutin
.builders
.entry(id_pair.this)
.or_insert(viewport_builder);
glutin
.init_viewport(id_pair.this, event_loop)
.expect("Failed to initialize window in egui::Context::show_viewport_immediate");
}
let viewport = glutin.borrow().viewports.get(&id_pair.this).cloned();
let Some(viewport) = viewport else { return };
let viewport = &mut *viewport.borrow_mut();
let Some(winit_state) = &mut viewport.egui_winit else {
return;
};
let Some(window) = &viewport.window else {
return;
};
let window = window.borrow();
let mut input = winit_state.take_egui_input(&window, id_pair);
input.time = Some(beginning.elapsed().as_secs_f64());
// ---------------------------------------------------
// Call the user ui-code, which could re-entrantly call this function again!
// No locks may be hold while calling this function.
let output = egui_ctx.run(input, |ctx| {
viewport_ui_cb(ctx);
});
// ---------------------------------------------------
let screen_size_in_pixels: [u32; 2] = window.inner_size().into();
let clipped_primitives = egui_ctx.tessellate(output.shapes);
let mut glutin = glutin.borrow_mut();
let mut painter = painter.borrow_mut();
glutin.current_gl_context = Some(
glutin
.current_gl_context
.take()
.unwrap()
.make_not_current()
.unwrap()
.make_current(viewport.gl_surface.as_ref().unwrap())
.unwrap(),
);
if !viewport
.gl_surface
.as_ref()
.unwrap()
.is_current(glutin.current_gl_context.as_ref().unwrap())
{
let builder = &glutin.builders[&viewport.id_pair.this];
log::error!("egui::show_viewport_immediate with title: `{:?}` is not created in main thread, try to use wgpu!", builder.title.clone().unwrap_or_default());
}
egui_glow::painter::clear(gl, screen_size_in_pixels, [0.0, 0.0, 0.0, 0.0]);
let pixels_per_point = egui_ctx.input_for(id_pair.this, |i| i.pixels_per_point());
painter.paint_and_update_textures(
screen_size_in_pixels,
pixels_per_point,
&clipped_primitives,
&output.textures_delta,
);
{
crate::profile_scope!("swap_buffers");
if let Err(err) = viewport
.gl_surface .gl_surface
.as_ref() .as_ref()
.unwrap() .expect("failed to get surface to swap buffers")
.is_current(glutin.current_gl_context.as_ref().unwrap()) .swap_buffers(
glutin
.current_gl_context
.as_ref()
.expect("failed to get current context to swap buffers"),
)
{ {
let builder = &glutin.builders[&viewport.id_pair.this]; log::error!("swap_buffers failed: {err}");
log::error!("egui::show_viewport_immediate with title: `{:?}` is not created in main thread, try to use wgpu!", builder.title.clone().unwrap_or_default());
} }
egui_glow::painter::clear(gl, screen_size_in_pixels, [0.0, 0.0, 0.0, 0.0]);
let pixels_per_point = egui_ctx.input_for(id_pair.this, |i| i.pixels_per_point());
painter.paint_and_update_textures(
screen_size_in_pixels,
pixels_per_point,
&clipped_primitives,
&output.textures_delta,
);
{
crate::profile_scope!("swap_buffers");
if let Err(err) = viewport
.gl_surface
.as_ref()
.expect("failed to get surface to swap buffers")
.swap_buffers(
glutin
.current_gl_context
.as_ref()
.expect("failed to get current context to swap buffers"),
)
{
log::error!("swap_buffers failed: {err}");
}
}
winit_state.handle_platform_output(
&window,
id_pair.this,
egui_ctx,
output.platform_output,
);
} }
winit_state.handle_platform_output(&window, id_pair.this, egui_ctx, output.platform_output);
} }
impl WinitApp for GlowWinitApp { impl WinitApp for GlowWinitApp {
@@ -1378,17 +1379,14 @@ mod glow_integration {
} }
fn window(&self, window_id: WindowId) -> Option<Rc<RefCell<winit::window::Window>>> { fn window(&self, window_id: WindowId) -> Option<Rc<RefCell<winit::window::Window>>> {
self.running.as_ref().and_then(|r| { let running = self.running.as_ref()?;
let glutin_ctx = r.glutin_ctx.borrow(); let glutin_ctx = running.glutin_ctx.borrow();
if let Some(viewport_id) = glutin_ctx.viewport_maps.get(&window_id) { let viewport_id = *glutin_ctx.viewport_maps.get(&window_id)?;
if let Some(viewport) = glutin_ctx.viewports.get(viewport_id) { if let Some(viewport) = glutin_ctx.viewports.get(&viewport_id) {
if let Some(window) = viewport.borrow().window.as_ref() { viewport.borrow().window.clone()
return Some(window.clone()); } else {
}
}
}
None None
}) }
} }
fn window_id_from_viewport_id(&self, id: ViewportId) -> Option<WindowId> { fn window_id_from_viewport_id(&self, id: ViewportId) -> Option<WindowId> {
@@ -1404,7 +1402,6 @@ mod glow_integration {
} }
fn save_and_destroy(&mut self) { fn save_and_destroy(&mut self) {
crate::profile_function!();
if let Some(mut running) = self.running.take() { if let Some(mut running) = self.running.take() {
crate::profile_function!(); crate::profile_function!();
@@ -1920,29 +1917,6 @@ mod wgpu_integration {
} }
} }
fn create_window(
event_loop: &EventLoopWindowTarget<UserEvent>,
storage: Option<&dyn epi::Storage>,
title: &str,
native_options: &mut NativeOptions,
) -> Result<(winit::window::Window, ViewportBuilder), winit::error::OsError> {
crate::profile_function!();
let window_settings = epi_integration::load_window_settings(storage);
let window_builder =
epi_integration::window_builder(event_loop, title, native_options, window_settings);
let window = {
crate::profile_scope!("WindowBuilder::build");
create_winit_window_builder(&window_builder).build(event_loop)?
};
epi_integration::apply_native_options_to_window(
&window,
native_options,
window_settings,
);
Ok((window, window_builder))
}
fn build_windows(&mut self, event_loop: &EventLoopWindowTarget<UserEvent>) { fn build_windows(&mut self, event_loop: &EventLoopWindowTarget<UserEvent>) {
let Some(running) = &mut self.running else { let Some(running) = &mut self.running else {
return; return;
@@ -1961,7 +1935,7 @@ mod wgpu_integration {
continue; continue;
} }
Self::init_window( init_window(
*id, *id,
builder, builder,
viewport_maps, viewport_maps,
@@ -1973,34 +1947,6 @@ mod wgpu_integration {
} }
} }
fn init_window(
id: ViewportId,
builder: &ViewportBuilder,
windows_id: &mut HashMap<winit::window::WindowId, ViewportId>,
painter: &mut egui_wgpu::winit::Painter,
window: &mut Option<Rc<RefCell<winit::window::Window>>>,
egui_winit: &mut Option<egui_winit::State>,
event_loop: &EventLoopWindowTarget<UserEvent>,
) {
crate::profile_function!();
if let Ok(new_window) = create_winit_window_builder(builder).build(event_loop) {
windows_id.insert(new_window.id(), id);
if let Err(err) = pollster::block_on(painter.set_window(id, Some(&new_window))) {
log::error!("on set_window: viewport_id {id:?} {err}");
}
*egui_winit = Some(egui_winit::State::new(
event_loop,
Some(new_window.scale_factor() as f32),
painter.max_texture_side(),
));
*window = Some(Rc::new(RefCell::new(new_window)));
}
}
fn set_window(&mut self, id: ViewportId) -> Result<(), egui_wgpu::WgpuError> { fn set_window(&mut self, id: ViewportId) -> Result<(), egui_wgpu::WgpuError> {
if let Some(running) = &mut self.running { if let Some(running) = &mut self.running {
crate::profile_function!(); crate::profile_function!();
@@ -2160,7 +2106,7 @@ mod wgpu_integration {
#[allow(unsafe_code)] #[allow(unsafe_code)]
let event_loop = unsafe { event_loop.as_ref().unwrap() }; let event_loop = unsafe { event_loop.as_ref().unwrap() };
Self::render_immediate_viewport( render_immediate_viewport(
event_loop, event_loop,
egui_ctx, egui_ctx,
viewport_builder, viewport_builder,
@@ -2184,128 +2130,169 @@ mod wgpu_integration {
Ok(()) Ok(())
} }
}
#[inline(always)] fn create_window(
#[allow(clippy::too_many_arguments)] event_loop: &EventLoopWindowTarget<UserEvent>,
fn render_immediate_viewport( storage: Option<&dyn epi::Storage>,
event_loop: &EventLoopWindowTarget<UserEvent>, title: &str,
egui_ctx: &egui::Context, native_options: &mut NativeOptions,
mut viewport_builder: ViewportBuilder, ) -> Result<(winit::window::Window, ViewportBuilder), winit::error::OsError> {
id_pair: ViewportIdPair, crate::profile_function!();
viewport_ui_cb: Box<dyn FnOnce(&egui::Context) + '_>,
beginning: Instant,
shared: &RefCell<SharedState>,
) {
crate::profile_function!();
let input = { let window_settings = epi_integration::load_window_settings(storage);
let mut shared = shared.borrow_mut(); let window_builder =
let SharedState { epi_integration::window_builder(event_loop, title, native_options, window_settings);
viewports, let window = {
builders, crate::profile_scope!("WindowBuilder::build");
painter, create_winit_window_builder(&window_builder).build(event_loop)?
viewport_maps, };
} = &mut *shared; epi_integration::apply_native_options_to_window(&window, native_options, window_settings);
Ok((window, window_builder))
}
// Creating a new native window if is needed fn init_window(
if !viewports.contains_key(&id_pair.this) { id: ViewportId,
{ builder: &ViewportBuilder,
if viewport_builder.icon.is_none() && builders.get(&id_pair.this).is_none() windows_id: &mut HashMap<winit::window::WindowId, ViewportId>,
{ painter: &mut egui_wgpu::winit::Painter,
viewport_builder.icon = window: &mut Option<Rc<RefCell<winit::window::Window>>>,
builders.get(&id_pair.parent).and_then(|b| b.icon.clone()); egui_winit: &mut Option<egui_winit::State>,
} event_loop: &EventLoopWindowTarget<UserEvent>,
} ) {
crate::profile_function!();
let Viewport { if let Ok(new_window) = create_winit_window_builder(builder).build(event_loop) {
window, windows_id.insert(new_window.id(), id);
egui_winit: state,
..
} = viewports.entry(id_pair.this).or_insert(Viewport {
window: None,
egui_winit: Rc::new(RefCell::new(None)),
viewport_ui_cb: None,
parent_id: id_pair.parent,
});
builders
.entry(id_pair.this)
.or_insert(viewport_builder.clone());
Self::init_window( if let Err(err) = pollster::block_on(painter.set_window(id, Some(&new_window))) {
id_pair.this, log::error!("on set_window: viewport_id {id:?} {err}");
&viewport_builder, }
viewport_maps,
painter,
window,
&mut state.borrow_mut(),
event_loop,
);
}
// Render sync viewport: *egui_winit = Some(egui_winit::State::new(
let viewport = viewports.get(&id_pair.this).cloned(); event_loop,
let Some(viewport) = viewport else { return }; Some(new_window.scale_factor() as f32),
let Some(winit_state) = &mut *viewport.egui_winit.borrow_mut() else { painter.max_texture_side(),
return; ));
};
let Some(window) = viewport.window else {
return;
};
let window = window.borrow();
let mut input = winit_state.take_egui_input(&window, id_pair);
input.time = Some(beginning.elapsed().as_secs_f64());
input
};
// ------------------------------------------ *window = Some(Rc::new(RefCell::new(new_window)));
}
}
// Run the user code, which could re-entrantly call this function again (!) #[inline(always)]
let output = egui_ctx.run(input, |ctx| { #[allow(clippy::too_many_arguments)]
viewport_ui_cb(ctx); fn render_immediate_viewport(
}); event_loop: &EventLoopWindowTarget<UserEvent>,
egui_ctx: &egui::Context,
// ------------------------------------------ mut viewport_builder: ViewportBuilder,
id_pair: ViewportIdPair,
viewport_ui_cb: Box<dyn FnOnce(&egui::Context) + '_>,
beginning: Instant,
shared: &RefCell<SharedState>,
) {
crate::profile_function!();
let input = {
let mut shared = shared.borrow_mut(); let mut shared = shared.borrow_mut();
let SharedState { let SharedState {
viewports, painter, .. viewports,
builders,
painter,
viewport_maps,
} = &mut *shared; } = &mut *shared;
let viewport = viewports.get(&id_pair.this).cloned(); // Creating a new native window if is needed
let Some(viewport) = viewport else { return }; if !viewports.contains_key(&id_pair.this) {
let Some(winit_state) = &mut *viewport.egui_winit.borrow_mut() else { {
return; if viewport_builder.icon.is_none() && builders.get(&id_pair.this).is_none() {
}; viewport_builder.icon =
let Some(window) = viewport.window else { builders.get(&id_pair.parent).and_then(|b| b.icon.clone());
return; }
}; }
let window = window.borrow();
if let Err(err) = pollster::block_on(painter.set_window(id_pair.this, Some(&window))) { let Viewport {
log::error!( window,
"when rendering viewport_id={:?}, set_window Error {err}", egui_winit: state,
id_pair.this ..
} = viewports.entry(id_pair.this).or_insert(Viewport {
window: None,
egui_winit: Rc::new(RefCell::new(None)),
viewport_ui_cb: None,
parent_id: id_pair.parent,
});
builders
.entry(id_pair.this)
.or_insert(viewport_builder.clone());
init_window(
id_pair.this,
&viewport_builder,
viewport_maps,
painter,
window,
&mut state.borrow_mut(),
event_loop,
); );
} }
let pixels_per_point = egui_ctx.input_for(id_pair.this, |i| i.pixels_per_point()); // Render sync viewport:
let clipped_primitives = egui_ctx.tessellate(output.shapes); let viewport = viewports.get(&id_pair.this).cloned();
painter.paint_and_update_textures( let Some(viewport) = viewport else { return };
id_pair.this, let Some(winit_state) = &mut *viewport.egui_winit.borrow_mut() else {
pixels_per_point, return;
[0.0, 0.0, 0.0, 0.0], };
&clipped_primitives, let Some(window) = viewport.window else {
&output.textures_delta, return;
false, };
); let window = window.borrow();
let mut input = winit_state.take_egui_input(&window, id_pair);
input.time = Some(beginning.elapsed().as_secs_f64());
input
};
winit_state.handle_platform_output( // ------------------------------------------
&window,
id_pair.this, // Run the user code, which could re-entrantly call this function again (!)
egui_ctx, let output = egui_ctx.run(input, |ctx| {
output.platform_output, viewport_ui_cb(ctx);
});
// ------------------------------------------
let mut shared = shared.borrow_mut();
let SharedState {
viewports, painter, ..
} = &mut *shared;
let viewport = viewports.get(&id_pair.this).cloned();
let Some(viewport) = viewport else { return };
let Some(winit_state) = &mut *viewport.egui_winit.borrow_mut() else {
return;
};
let Some(window) = viewport.window else {
return;
};
let window = window.borrow();
if let Err(err) = pollster::block_on(painter.set_window(id_pair.this, Some(&window))) {
log::error!(
"when rendering viewport_id={:?}, set_window Error {err}",
id_pair.this
); );
} }
let pixels_per_point = egui_ctx.input_for(id_pair.this, |i| i.pixels_per_point());
let clipped_primitives = egui_ctx.tessellate(output.shapes);
painter.paint_and_update_textures(
id_pair.this,
pixels_per_point,
[0.0, 0.0, 0.0, 0.0],
&clipped_primitives,
&output.textures_delta,
false,
);
winit_state.handle_platform_output(&window, id_pair.this, egui_ctx, output.platform_output);
} }
impl WinitApp for WgpuWinitApp { impl WinitApp for WgpuWinitApp {
@@ -2355,9 +2342,9 @@ mod wgpu_integration {
} }
fn save_and_destroy(&mut self) { fn save_and_destroy(&mut self) {
crate::profile_function!();
if let Some(mut running) = self.running.take() { if let Some(mut running) = self.running.take() {
crate::profile_function!();
let mut shared = running.shared.borrow_mut(); let mut shared = running.shared.borrow_mut();
if let Some(Viewport { window, .. }) = shared.viewports.get(&ViewportId::ROOT) { if let Some(Viewport { window, .. }) = shared.viewports.get(&ViewportId::ROOT) {
running.integration.save( running.integration.save(
@@ -2618,7 +2605,7 @@ mod wgpu_integration {
.viewports .viewports
.contains_key(&ViewportId::ROOT) .contains_key(&ViewportId::ROOT)
{ {
let _ = Self::create_window( let _ = create_window(
event_loop, event_loop,
running.integration.frame.storage(), running.integration.frame.storage(),
&self.app_name, &self.app_name,
@@ -2633,7 +2620,7 @@ mod wgpu_integration {
.as_ref() .as_ref()
.unwrap_or(&self.app_name), .unwrap_or(&self.app_name),
); );
let (window, builder) = Self::create_window( let (window, builder) = create_window(
event_loop, event_loop,
storage.as_deref(), storage.as_deref(),
&self.app_name, &self.app_name,