mirror of
https://github.com/emilk/egui.git
synced 2026-09-02 14:50:03 -04:00
Now eframe glow supports viewport sync icon
This commit is contained in:
@@ -489,7 +489,6 @@ mod glow_integration {
|
|||||||
}
|
}
|
||||||
|
|
||||||
struct Window {
|
struct Window {
|
||||||
builder: ViewportBuilder,
|
|
||||||
gl_surface: Option<glutin::surface::Surface<glutin::surface::WindowSurface>>,
|
gl_surface: Option<glutin::surface::Surface<glutin::surface::WindowSurface>>,
|
||||||
window: Option<Arc<RwLock<winit::window::Window>>>,
|
window: Option<Arc<RwLock<winit::window::Window>>>,
|
||||||
viewport_id: ViewportId,
|
viewport_id: ViewportId,
|
||||||
@@ -520,6 +519,7 @@ mod glow_integration {
|
|||||||
|
|
||||||
windows: HashMap<ViewportId, Arc<RwLock<Window>>>,
|
windows: HashMap<ViewportId, Arc<RwLock<Window>>>,
|
||||||
window_maps: HashMap<winit::window::WindowId, ViewportId>,
|
window_maps: HashMap<winit::window::WindowId, ViewportId>,
|
||||||
|
builders: HashMap<ViewportId, ViewportBuilder>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[allow(unsafe_code)]
|
#[allow(unsafe_code)]
|
||||||
@@ -639,7 +639,6 @@ mod glow_integration {
|
|||||||
windows.insert(
|
windows.insert(
|
||||||
ViewportId::MAIN,
|
ViewportId::MAIN,
|
||||||
Arc::new(RwLock::new(Window {
|
Arc::new(RwLock::new(Window {
|
||||||
builder: window_builder,
|
|
||||||
gl_surface: None,
|
gl_surface: None,
|
||||||
window: window.map(|w| Arc::new(RwLock::new(w))),
|
window: window.map(|w| Arc::new(RwLock::new(w))),
|
||||||
viewport_id: ViewportId::MAIN,
|
viewport_id: ViewportId::MAIN,
|
||||||
@@ -649,6 +648,9 @@ mod glow_integration {
|
|||||||
})),
|
})),
|
||||||
);
|
);
|
||||||
|
|
||||||
|
let mut builders = HashMap::default();
|
||||||
|
builders.insert(ViewportId::MAIN, window_builder);
|
||||||
|
|
||||||
// the fun part with opengl gl is that we never know whether there is an error. the context creation might have failed, but
|
// the fun part with opengl gl is that we never know whether there is an error. the context creation might have failed, but
|
||||||
// it could keep working until we try to make surface current or swap buffers or something else. future glutin improvements might
|
// it could keep working until we try to make surface current or swap buffers or something else. future glutin improvements might
|
||||||
// help us start from scratch again if we fail context creation and go back to preferEgl or try with different config etc..
|
// help us start from scratch again if we fail context creation and go back to preferEgl or try with different config etc..
|
||||||
@@ -659,6 +661,7 @@ mod glow_integration {
|
|||||||
current_gl_context: None,
|
current_gl_context: None,
|
||||||
not_current_gl_context,
|
not_current_gl_context,
|
||||||
windows,
|
windows,
|
||||||
|
builders,
|
||||||
window_maps,
|
window_maps,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@@ -692,6 +695,7 @@ mod glow_integration {
|
|||||||
win: &Arc<RwLock<Window>>,
|
win: &Arc<RwLock<Window>>,
|
||||||
event_loop: &EventLoopWindowTarget<UserEvent>,
|
event_loop: &EventLoopWindowTarget<UserEvent>,
|
||||||
) -> Result<()> {
|
) -> Result<()> {
|
||||||
|
let builder = &self.builders[&win.read().viewport_id];
|
||||||
let mut win = win.write();
|
let mut win = win.write();
|
||||||
// make sure we have a window or create one.
|
// make sure we have a window or create one.
|
||||||
let window = win.window.take().unwrap_or_else(|| {
|
let window = win.window.take().unwrap_or_else(|| {
|
||||||
@@ -699,7 +703,7 @@ mod glow_integration {
|
|||||||
Arc::new(RwLock::new(
|
Arc::new(RwLock::new(
|
||||||
glutin_winit::finalize_window(
|
glutin_winit::finalize_window(
|
||||||
event_loop,
|
event_loop,
|
||||||
create_winit_window_builder(&win.builder),
|
create_winit_window_builder(builder),
|
||||||
&self.gl_config,
|
&self.gl_config,
|
||||||
)
|
)
|
||||||
.expect("failed to finalize glutin window"),
|
.expect("failed to finalize glutin window"),
|
||||||
@@ -1032,13 +1036,20 @@ mod glow_integration {
|
|||||||
|
|
||||||
// ## Sync Rendering
|
// ## Sync Rendering
|
||||||
integration.egui_ctx.set_render_sync_callback(
|
integration.egui_ctx.set_render_sync_callback(
|
||||||
move |viewport_builder, viewport_id, parent_id, render| {
|
move |mut viewport_builder, viewport_id, parent_id, render| {
|
||||||
// TODO: If the `viewport_builder` do not have a icon set the icon to be the icon of the parent viewport
|
if viewport_builder.icon.is_none(){
|
||||||
|
viewport_builder.icon = glutin.read().builders.get(&parent_id).and_then(|b|b.icon.clone());
|
||||||
|
}
|
||||||
|
|
||||||
let has_window = glutin.read().windows.get(&viewport_id).is_some();
|
let has_window = glutin.read().windows.get(&viewport_id).is_some();
|
||||||
if !has_window{
|
if !has_window{
|
||||||
glutin.write().windows.entry(viewport_id).or_insert(Arc::new(RwLock::new(Window{ builder: viewport_builder, gl_surface: None, window: None, viewport_id, parent_id, render: None, egui_winit: None })));
|
{
|
||||||
let win = glutin.read().windows.get(&viewport_id).cloned().unwrap();
|
let mut glutin = glutin.write();
|
||||||
|
glutin.windows.entry(viewport_id).or_insert(Arc::new(RwLock::new(Window{ gl_surface: None, window: None, viewport_id, parent_id, render: None, egui_winit: None })));
|
||||||
|
glutin.builders.entry(viewport_id).or_insert(viewport_builder);
|
||||||
|
}
|
||||||
|
|
||||||
|
let win = glutin.read().windows[&viewport_id].clone();
|
||||||
let event_loop;
|
let event_loop;
|
||||||
#[allow(unsafe_code)]
|
#[allow(unsafe_code)]
|
||||||
unsafe{
|
unsafe{
|
||||||
@@ -1090,7 +1101,8 @@ mod glow_integration {
|
|||||||
.unwrap()
|
.unwrap()
|
||||||
.is_current(glutin.current_gl_context.as_ref().unwrap())
|
.is_current(glutin.current_gl_context.as_ref().unwrap())
|
||||||
{
|
{
|
||||||
log::error!("egui::create_viewport_sync with title: `{}` is not created in main thread, try to use wgpu!", window.builder.title);
|
let builder = &&glutin.builders[&window.viewport_id];
|
||||||
|
log::error!("egui::create_viewport_sync with title: `{}` is not created in main thread, try to use wgpu!", builder.title);
|
||||||
}
|
}
|
||||||
|
|
||||||
egui_glow::painter::clear(
|
egui_glow::painter::clear(
|
||||||
@@ -1155,14 +1167,16 @@ mod glow_integration {
|
|||||||
let mut active_viewports_ids = vec![ViewportId::MAIN];
|
let mut active_viewports_ids = vec![ViewportId::MAIN];
|
||||||
|
|
||||||
viewports.retain_mut(|(id, _, builder, render)| {
|
viewports.retain_mut(|(id, _, builder, render)| {
|
||||||
|
let mut glutin = glutin_ctx.write();
|
||||||
|
let last_builder = glutin.builders.entry(*id).or_insert(builder.clone());
|
||||||
|
let (commands, recreate) = changes_between_builders(builder, last_builder);
|
||||||
|
drop(glutin);
|
||||||
if let Some(w) = glutin_ctx.read().windows.get(id) {
|
if let Some(w) = glutin_ctx.read().windows.get(id) {
|
||||||
let mut w = w.write();
|
let mut w = w.write();
|
||||||
let (commands, recreate) = changes_between_builders(builder, &mut w.builder);
|
|
||||||
if recreate {
|
if recreate {
|
||||||
w.window = None;
|
w.window = None;
|
||||||
w.gl_surface = None;
|
w.gl_surface = None;
|
||||||
w.render = render.clone();
|
w.render = render.clone();
|
||||||
w.builder = builder.clone();
|
|
||||||
w.parent_id = *id;
|
w.parent_id = *id;
|
||||||
}
|
}
|
||||||
if let Some(w) = w.window.clone() {
|
if let Some(w) = w.window.clone() {
|
||||||
@@ -1178,18 +1192,18 @@ mod glow_integration {
|
|||||||
for (id, parent_id, mut builder, render) in viewports {
|
for (id, parent_id, mut builder, render) in viewports {
|
||||||
let default_icon = glutin_ctx
|
let default_icon = glutin_ctx
|
||||||
.read()
|
.read()
|
||||||
.windows
|
.builders
|
||||||
.get(&parent_id)
|
.get(&parent_id)
|
||||||
.map(|w| w.read().builder.icon.clone())
|
.and_then(|b| b.icon.clone());
|
||||||
.flatten();
|
|
||||||
|
|
||||||
if builder.icon.is_none() {
|
if builder.icon.is_none() {
|
||||||
builder.icon = default_icon;
|
builder.icon = default_icon;
|
||||||
}
|
}
|
||||||
glutin_ctx.write().windows.insert(
|
{
|
||||||
|
let mut glutin = glutin_ctx.write();
|
||||||
|
glutin.windows.insert(
|
||||||
id,
|
id,
|
||||||
Arc::new(RwLock::new(Window {
|
Arc::new(RwLock::new(Window {
|
||||||
builder,
|
|
||||||
gl_surface: None,
|
gl_surface: None,
|
||||||
window: None,
|
window: None,
|
||||||
viewport_id: id,
|
viewport_id: id,
|
||||||
@@ -1198,6 +1212,8 @@ mod glow_integration {
|
|||||||
parent_id,
|
parent_id,
|
||||||
})),
|
})),
|
||||||
);
|
);
|
||||||
|
glutin.builders.insert(id, builder);
|
||||||
|
}
|
||||||
active_viewports_ids.push(id);
|
active_viewports_ids.push(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1205,6 +1221,9 @@ mod glow_integration {
|
|||||||
gl_window
|
gl_window
|
||||||
.windows
|
.windows
|
||||||
.retain(|id, _| active_viewports_ids.contains(id));
|
.retain(|id, _| active_viewports_ids.contains(id));
|
||||||
|
gl_window
|
||||||
|
.builders
|
||||||
|
.retain(|id, _| active_viewports_ids.contains(id));
|
||||||
gl_window
|
gl_window
|
||||||
.window_maps
|
.window_maps
|
||||||
.retain(|_, id| active_viewports_ids.contains(id));
|
.retain(|_, id| active_viewports_ids.contains(id));
|
||||||
@@ -2041,7 +2060,6 @@ mod wgpu_integration {
|
|||||||
|
|
||||||
let _windows = windows.clone();
|
let _windows = windows.clone();
|
||||||
let egui_ctx = integration.egui_ctx.clone();
|
let egui_ctx = integration.egui_ctx.clone();
|
||||||
let focused = self.is_focused.clone();
|
|
||||||
let time = integration.beginning;
|
let time = integration.beginning;
|
||||||
let painter = Arc::new(RwLock::new(painter));
|
let painter = Arc::new(RwLock::new(painter));
|
||||||
let _painter = painter.clone();
|
let _painter = painter.clone();
|
||||||
@@ -2293,8 +2311,7 @@ mod wgpu_integration {
|
|||||||
builder.icon = windows
|
builder.icon = windows
|
||||||
.read()
|
.read()
|
||||||
.get(&parent_id)
|
.get(&parent_id)
|
||||||
.map(|w| w.builder.icon.clone())
|
.and_then(|w| w.builder.icon.clone());
|
||||||
.flatten();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
windows.write().insert(
|
windows.write().insert(
|
||||||
|
|||||||
Reference in New Issue
Block a user