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

Some better naming and cleanup of viewport.rs

This commit is contained in:
Emil Ernerfeldt
2023-11-07 19:17:24 +01:00
parent 96f1426c6f
commit a3b02002ea
4 changed files with 24 additions and 25 deletions

View File

@@ -1086,7 +1086,7 @@ mod glow_integration {
let painter = Rc::downgrade(&painter); let painter = Rc::downgrade(&painter);
let beginning = integration.beginning; let beginning = integration.beginning;
integration.egui_ctx.set_render_sync_callback( integration.egui_ctx.set_immediate_viewport_renderer(
move |egui_ctx, viewport_builder, id_pair, viewport_ui_cb| { move |egui_ctx, viewport_builder, id_pair, viewport_ui_cb| {
if let (Some(glutin), Some(gl), Some(painter)) = if let (Some(glutin), Some(gl), Some(painter)) =
(glutin.upgrade(), gl.upgrade(), painter.upgrade()) (glutin.upgrade(), gl.upgrade(), painter.upgrade())
@@ -2210,7 +2210,7 @@ mod wgpu_integration {
let viewport_maps = Rc::downgrade(&viewport_maps); let viewport_maps = Rc::downgrade(&viewport_maps);
let beginning = integration.beginning; let beginning = integration.beginning;
integration.egui_ctx.set_render_sync_callback( integration.egui_ctx.set_immediate_viewport_renderer(
move |egui_ctx, viewport_builder, id_pair, viewport_ui_cb| { move |egui_ctx, viewport_builder, id_pair, viewport_ui_cb| {
if let ( if let (
Some(viewports), Some(viewports),

View File

@@ -139,7 +139,7 @@ impl Repaint {
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
thread_local! { thread_local! {
static EGUI_RENDER_SYNC: RefCell<Option<Box<ViewportRenderSyncCallback>>> = Default::default(); static IMMEDIATE_VIEWPORT_RENDERER: RefCell<Option<Box<ImmediateViewportRendererCallback>>> = Default::default();
} }
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
@@ -170,7 +170,7 @@ struct ContextImpl {
repaint: Repaint, repaint: Repaint,
viewports: ViewportIdMap<Viewport>, viewports: ViewportIdMap<ViewportState>,
viewport_commands: Vec<(ViewportId, ViewportCommand)>, viewport_commands: Vec<(ViewportId, ViewportCommand)>,
embed_viewports: bool, embed_viewports: bool,
@@ -2508,15 +2508,15 @@ impl Context {
/// ///
/// When a viewport sync is created will be rendered by this function /// When a viewport sync is created will be rendered by this function
/// ///
/// Look in `crates/eframe/native/run.rs` and search for `set_render_sync_callback` to see for what is used. /// Look in `crates/eframe/native/run.rs` and search for `set_immediate_viewport_renderer` to see for what is used.
#[allow(clippy::unused_self)] #[allow(clippy::unused_self)]
pub fn set_render_sync_callback( pub fn set_immediate_viewport_renderer(
&self, &self,
callback: impl for<'a> Fn(&Context, ViewportBuilder, ViewportIdPair, Box<dyn FnOnce(&Context) + 'a>) callback: impl for<'a> Fn(&Context, ViewportBuilder, ViewportIdPair, Box<dyn FnOnce(&Context) + 'a>)
+ 'static, + 'static,
) { ) {
let callback = Box::new(callback); let callback = Box::new(callback);
EGUI_RENDER_SYNC.with(|render_sync| { IMMEDIATE_VIEWPORT_RENDERER.with(|render_sync| {
render_sync.replace(Some(callback)); render_sync.replace(Some(callback));
}); });
} }
@@ -2586,7 +2586,7 @@ impl Context {
} else { } else {
ctx.viewports.insert( ctx.viewports.insert(
viewport_builder.id, viewport_builder.id,
Viewport { ViewportState {
id_pair: ViewportIdPair { id_pair: ViewportIdPair {
this: viewport_builder.id, this: viewport_builder.id,
parent: viewport_id, parent: viewport_id,
@@ -2628,9 +2628,9 @@ impl Context {
return viewport_ui_cb(self); return viewport_ui_cb(self);
} }
EGUI_RENDER_SYNC.with(|render_sync_viewport_cb| { IMMEDIATE_VIEWPORT_RENDERER.with(|immediate_viewport_renderer| {
let render_sync_viewport_cb = render_sync_viewport_cb.borrow(); let immediate_viewport_renderer = immediate_viewport_renderer.borrow();
let Some(render_sync_viewport_cb) = render_sync_viewport_cb.as_ref() else { let Some(immediate_viewport_renderer) = immediate_viewport_renderer.as_ref() else {
// This egui backend does not support multiple viewports. // This egui backend does not support multiple viewports.
return viewport_ui_cb(self); return viewport_ui_cb(self);
}; };
@@ -2653,7 +2653,7 @@ impl Context {
}; };
ctx.viewports.insert( ctx.viewports.insert(
viewport_builder.id, viewport_builder.id,
Viewport { ViewportState {
builder: viewport_builder.clone(), builder: viewport_builder.clone(),
id_pair, id_pair,
used: true, used: true,
@@ -2668,7 +2668,7 @@ impl Context {
{ {
let out = &mut out; let out = &mut out;
render_sync_viewport_cb( immediate_viewport_renderer(
self, self,
viewport_builder, viewport_builder,
id_pair, id_pair,

View File

@@ -17,13 +17,12 @@ use crate::{Context, Id};
/// A unique identifier of a viewport. /// A unique identifier of a viewport.
/// ///
/// Generated by [`Context`].
///
/// This is returned by [`Context::viewport_id`] and [`Context::parent_viewport_id`]. /// This is returned by [`Context::viewport_id`] and [`Context::parent_viewport_id`].
#[derive(Clone, Copy, Hash, PartialEq, Eq)] #[derive(Clone, Copy, Hash, PartialEq, Eq)]
pub struct ViewportId(pub Id); pub struct ViewportId(pub Id);
impl Default for ViewportId { impl Default for ViewportId {
#[inline]
fn default() -> Self { fn default() -> Self {
Self::ROOT Self::ROOT
} }
@@ -39,6 +38,7 @@ impl ViewportId {
/// The `ViewportId` of the root viewport. /// The `ViewportId` of the root viewport.
pub const ROOT: Self = Self(Id::null()); pub const ROOT: Self = Self(Id::null());
#[inline]
pub fn from_hash_of(source: impl std::hash::Hash) -> Self { pub fn from_hash_of(source: impl std::hash::Hash) -> Self {
Self(Id::new(source)) Self(Id::new(source))
} }
@@ -61,7 +61,7 @@ pub type ViewportIdMap<T> = nohash_hasher::IntMap<ViewportId, T>;
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
/// This will deref to [`Self::this`]. /// A pair of [`ViewportId`], used to identify a viewport and its parent.
#[derive(Debug, Hash, Clone, Copy, PartialEq, Eq)] #[derive(Debug, Hash, Clone, Copy, PartialEq, Eq)]
pub struct ViewportIdPair { pub struct ViewportIdPair {
pub this: ViewportId, pub this: ViewportId,
@@ -69,11 +69,9 @@ pub struct ViewportIdPair {
} }
impl Default for ViewportIdPair { impl Default for ViewportIdPair {
#[inline]
fn default() -> Self { fn default() -> Self {
Self { Self::ROOT
this: ViewportId::ROOT,
parent: ViewportId::ROOT,
}
} }
} }
@@ -89,7 +87,7 @@ impl ViewportIdPair {
pub type ViewportUiCallback = dyn Fn(&Context) + Sync + Send; pub type ViewportUiCallback = dyn Fn(&Context) + Sync + Send;
/// Render the given viewport, calling the given ui callback. /// Render the given viewport, calling the given ui callback.
pub type ViewportRenderSyncCallback = pub type ImmediateViewportRendererCallback =
dyn for<'a> Fn(&Context, ViewportBuilder, ViewportIdPair, Box<dyn FnOnce(&Context) + 'a>); dyn for<'a> Fn(&Context, ViewportBuilder, ViewportIdPair, Box<dyn FnOnce(&Context) + 'a>);
/// Control the building of a new egui viewport (i.e. native window). /// Control the building of a new egui viewport (i.e. native window).
@@ -403,6 +401,8 @@ impl ViewportBuilder {
self self
} }
/// Update this `ViewportBuilder` with a delta,
/// returning a list of commands and a bool intdicating if the window needs to be recreated.
pub fn patch(&mut self, new: &ViewportBuilder) -> (Vec<ViewportCommand>, bool) { pub fn patch(&mut self, new: &ViewportBuilder) -> (Vec<ViewportCommand>, bool) {
let mut commands = Vec::new(); let mut commands = Vec::new();
@@ -648,7 +648,7 @@ pub enum ViewportCommand {
} }
#[derive(Clone)] #[derive(Clone)]
pub(crate) struct Viewport { pub(crate) struct ViewportState {
pub(crate) builder: ViewportBuilder, pub(crate) builder: ViewportBuilder,
/// Id of us and our parent. /// Id of us and our parent.
@@ -663,6 +663,7 @@ pub(crate) struct Viewport {
pub(crate) viewport_ui_cb: Option<Arc<Box<ViewportUiCallback>>>, pub(crate) viewport_ui_cb: Option<Arc<Box<ViewportUiCallback>>>,
} }
/// Describes a viewport, i.e. a native window.
#[derive(Clone)] #[derive(Clone)]
pub struct ViewportOutput { pub struct ViewportOutput {
pub builder: ViewportBuilder, pub builder: ViewportBuilder,
@@ -672,6 +673,6 @@ pub struct ViewportOutput {
/// The user-code that shows the GUI, used for deferred viewports. /// The user-code that shows the GUI, used for deferred viewports.
/// ///
/// `None` for immediate viewports. /// `None` for immediate viewports and the ROOT viewport.
pub viewport_ui_cb: Option<Arc<Box<ViewportUiCallback>>>, pub viewport_ui_cb: Option<Arc<Box<ViewportUiCallback>>>,
} }

View File

@@ -45,8 +45,6 @@ impl EguiGlow {
self.egui_winit.on_event(&self.egui_ctx, event) self.egui_winit.on_event(&self.egui_ctx, event)
} }
/// Returns the `Duration` of the timeout after which egui should be repainted even if there's no new events.
///
/// Call [`Self::paint`] later to paint. /// Call [`Self::paint`] later to paint.
pub fn run(&mut self, window: &winit::window::Window, run_ui: impl FnMut(&egui::Context)) { pub fn run(&mut self, window: &winit::window::Window, run_ui: impl FnMut(&egui::Context)) {
let raw_input = self.egui_winit.take_egui_input(window); let raw_input = self.egui_winit.take_egui_input(window);