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:
@@ -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),
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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>>>,
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user