1
0
mirror of https://github.com/emilk/egui.git synced 2026-09-02 06:40:06 -04:00

Now when creating a async viewport, if we not spefify the icon will have his parent icon

This commit is contained in:
Konkitoman
2023-09-06 15:58:41 +03:00
parent 83f82601e8
commit b1189c14ae

View File

@@ -492,7 +492,7 @@ mod glow_integration {
builder: ViewportBuilder, 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>>>,
window_id: ViewportId, viewport_id: ViewportId,
parent_id: ViewportId, parent_id: ViewportId,
render: Option<Arc<Box<ViewportRender>>>, render: Option<Arc<Box<ViewportRender>>>,
pub egui_winit: Option<egui_winit::State>, pub egui_winit: Option<egui_winit::State>,
@@ -642,7 +642,7 @@ mod glow_integration {
builder: window_builder, 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))),
window_id: ViewportId::MAIN, viewport_id: ViewportId::MAIN,
egui_winit: None, egui_winit: None,
render: None, render: None,
parent_id: ViewportId::MAIN, parent_id: ViewportId::MAIN,
@@ -759,7 +759,7 @@ mod glow_integration {
win.gl_surface = Some(gl_surface); win.gl_surface = Some(gl_surface);
self.current_gl_context = Some(current_gl_context); self.current_gl_context = Some(current_gl_context);
self.window_maps.insert(window.id(), win.window_id); self.window_maps.insert(window.id(), win.viewport_id);
} }
win.window = Some(window); win.window = Some(window);
Ok(()) Ok(())
@@ -1032,12 +1032,14 @@ mod glow_integration {
let focused = self.is_focused.clone(); let focused = self.is_focused.clone();
// Sync Rendering // ## Sync Rendering
integration.egui_ctx.set_render_sync_callback( integration.egui_ctx.set_render_sync_callback(
move |viewport_builder, viewport_id, parent_viewport_id, render| { move |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
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, window_id: viewport_id, parent_id: parent_viewport_id, render: None, egui_winit: None }))); 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 win = glutin.read().windows.get(&viewport_id).cloned().unwrap();
let event_loop; let event_loop;
#[allow(unsafe_code)] #[allow(unsafe_code)]
@@ -1061,7 +1063,7 @@ mod glow_integration {
output = egui_ctx.run( output = egui_ctx.run(
input, input,
viewport_id, viewport_id,
parent_viewport_id, parent_id,
|ctx| { |ctx| {
render(ctx); render(ctx);
}, },
@@ -1186,17 +1188,27 @@ mod glow_integration {
} }
}); });
for (id, parent, builder, render) in viewports { for (id, parent_id, mut builder, render) in viewports {
let default_icon = glutin_ctx
.read()
.windows
.get(&parent_id)
.map(|w| w.read().builder.icon.clone())
.flatten();
if builder.icon.is_none() {
builder.icon = default_icon;
}
glutin_ctx.write().windows.insert( glutin_ctx.write().windows.insert(
id, id,
Arc::new(RwLock::new(Window { Arc::new(RwLock::new(Window {
builder, builder,
gl_surface: None, gl_surface: None,
window: None, window: None,
window_id: id, viewport_id: id,
egui_winit: None, egui_winit: None,
render: render.clone(), render,
parent_id: parent, parent_id,
})), })),
); );
active_viewports_ids.push(id); active_viewports_ids.push(id);
@@ -1359,7 +1371,7 @@ mod glow_integration {
&win.window.as_ref().unwrap().read(), &win.window.as_ref().unwrap().read(),
win.egui_winit.as_mut().unwrap(), win.egui_winit.as_mut().unwrap(),
&win.render.clone(), &win.render.clone(),
win.window_id, win.viewport_id,
win.parent_id, win.parent_id,
); );
@@ -1641,7 +1653,7 @@ mod glow_integration {
if let Some(win) = window.read().window.as_ref() { if let Some(win) = window.read().window.as_ref() {
let win = win.read(); let win = win.read();
if win.id() == *window_id { if win.id() == *window_id {
Some(window.read().window_id) Some(window.read().viewport_id)
} else { } else {
None None
} }
@@ -1680,7 +1692,7 @@ mod glow_integration {
running.app.write().as_mut(), running.app.write().as_mut(),
event, event,
viewport.egui_winit.as_mut().unwrap(), viewport.egui_winit.as_mut().unwrap(),
viewport.window_id, viewport.viewport_id,
); );
} }
} }
@@ -2048,8 +2060,11 @@ mod wgpu_integration {
let _painter = painter.clone(); let _painter = painter.clone();
let _windows_id = windows_id.clone(); let _windows_id = windows_id.clone();
// ## Sync Rendering
integration.egui_ctx.set_render_sync_callback( integration.egui_ctx.set_render_sync_callback(
move |viewport_builder, viewport_id, parent_viewport_id, render| { move |viewport_builder, viewport_id, parent_viewport_id, render| {
// TODO: If the `viewport_builder` do not have a icon set the icon to be the icon of the parent viewport
if _windows.read().get(&viewport_id).is_none(){ if _windows.read().get(&viewport_id).is_none(){
let mut _windows = _windows.write(); let mut _windows = _windows.write();
let Window{window, state, ..} = _windows.entry(viewport_id).or_insert(Window{window: None, state: Arc::new(RwLock::new(None)), render: None, parent_id: viewport_id, builder: viewport_builder.clone()}); let Window{window, state, ..} = _windows.entry(viewport_id).or_insert(Window{window: None, state: Arc::new(RwLock::new(None)), render: None, parent_id: viewport_id, builder: viewport_builder.clone()});
@@ -2110,33 +2125,10 @@ mod wgpu_integration {
} }
} }
let mut viewports = output.viewports;
let mut active_viewports_ids = vec![ViewportId::MAIN];
viewports.retain_mut(|(id, parent, _builder, render)| {
if let Some(w) = _windows.write().get_mut(id) {
w.render = render.clone();
w.parent_id = *parent;
active_viewports_ids.push(*id);
false
} else {
true
}
});
for (id, parent, builder, render) in viewports {
_windows.write().insert(
id,
Window{window: None, state: Arc::new(RwLock::new(None)), render, parent_id: parent, builder},
);
active_viewports_ids.push(id);
}
egui_winit::process_viewports_commands( egui_winit::process_viewports_commands(
output.viewport_commands, output.viewport_commands,
*focused.read(), *focused.read(),
|id| _windows.read().get(&id).and_then(|w| w.window.clone()) |id| _windows.read().get(&id).and_then(|w| w.window.clone()),
,
); );
} }
} }
@@ -2315,14 +2307,22 @@ mod wgpu_integration {
} }
}); });
for (id, parent, builder, render) in viewports { for (id, parent_id, mut builder, render) in viewports {
if builder.icon.is_none() {
builder.icon = windows
.read()
.get(&parent_id)
.map(|w| w.builder.icon.clone())
.flatten();
}
windows.write().insert( windows.write().insert(
id, id,
Window { Window {
window: None, window: None,
state: Arc::new(RwLock::new(None)), state: Arc::new(RwLock::new(None)),
render, render,
parent_id: parent, parent_id,
builder, builder,
}, },
); );