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

Move Rc<RefCell<……>> outside of struct Viewports

This commit is contained in:
Emil Ernerfeldt
2023-11-02 09:05:19 +01:00
parent 76d3873b47
commit 9749e1ea6d

View File

@@ -1867,17 +1867,23 @@ mod wgpu_integration {
parent_id: ViewportId, parent_id: ViewportId,
} }
#[derive(Clone)] #[derive(Clone, Default)]
pub struct Viewports(Rc<RefCell<HashMap<ViewportId, Viewport>>>); pub struct Viewports(HashMap<ViewportId, Viewport>);
impl std::ops::Deref for Viewports { impl std::ops::Deref for Viewports {
type Target = Rc<RefCell<HashMap<ViewportId, Viewport>>>; type Target = HashMap<ViewportId, Viewport>;
fn deref(&self) -> &Self::Target { fn deref(&self) -> &Self::Target {
&self.0 &self.0
} }
} }
impl std::ops::DerefMut for Viewports {
fn deref_mut(&mut self) -> &mut Self::Target {
&mut self.0
}
}
/// State that is initialized when the application is first starts running via /// State that is initialized when the application is first starts running via
/// a Resumed event. On Android this ensures that any graphics state is only /// a Resumed event. On Android this ensures that any graphics state is only
/// initialized once the application has an associated `SurfaceView`. /// initialized once the application has an associated `SurfaceView`.
@@ -1885,7 +1891,7 @@ mod wgpu_integration {
painter: Rc<RefCell<egui_wgpu::winit::Painter>>, painter: Rc<RefCell<egui_wgpu::winit::Painter>>,
integration: Rc<RefCell<epi_integration::EpiIntegration>>, integration: Rc<RefCell<epi_integration::EpiIntegration>>,
app: Box<dyn epi::App>, app: Box<dyn epi::App>,
viewports: Viewports, viewports: Rc<RefCell<Viewports>>,
builders: Rc<RefCell<HashMap<ViewportId, ViewportBuilder>>>, builders: Rc<RefCell<HashMap<ViewportId, ViewportBuilder>>>,
viewport_maps: Rc<RefCell<HashMap<winit::window::WindowId, ViewportId>>>, viewport_maps: Rc<RefCell<HashMap<winit::window::WindowId, ViewportId>>>,
} }
@@ -2120,7 +2126,7 @@ mod wgpu_integration {
viewport_maps.insert(window.id(), ViewportId::MAIN); viewport_maps.insert(window.id(), ViewportId::MAIN);
let viewport_maps = Rc::new(RefCell::new(viewport_maps)); let viewport_maps = Rc::new(RefCell::new(viewport_maps));
let viewports = Viewports(Rc::new(RefCell::new(HashMap::default()))); let viewports = Rc::new(RefCell::new(Viewports::default()));
viewports.borrow_mut().insert( viewports.borrow_mut().insert(
ViewportId::MAIN, ViewportId::MAIN,
Viewport { Viewport {
@@ -2151,7 +2157,7 @@ mod wgpu_integration {
viewport_builder, viewport_builder,
pair, pair,
render, render,
&c_viewports, &mut c_viewports.borrow_mut(),
&c_builders, &c_builders,
c_time, c_time,
&c_painter, &c_painter,
@@ -2179,16 +2185,15 @@ mod wgpu_integration {
mut viewport_builder: ViewportBuilder, mut viewport_builder: ViewportBuilder,
pair: ViewportIdPair, pair: ViewportIdPair,
render: Box<dyn FnOnce(&egui::Context) + '_>, render: Box<dyn FnOnce(&egui::Context) + '_>,
viewports: &Viewports, viewports: &mut Viewports,
builders: &RefCell<HashMap<ViewportId, ViewportBuilder>>, builders: &RefCell<HashMap<ViewportId, ViewportBuilder>>,
time: Instant, time: Instant,
painter: &RefCell<egui_wgpu::winit::Painter>, painter: &RefCell<egui_wgpu::winit::Painter>,
viewport_maps: &RefCell<HashMap<winit::window::WindowId, ViewportId>>, viewport_maps: &RefCell<HashMap<winit::window::WindowId, ViewportId>>,
) { ) {
// Creating a new native window if is needed // Creating a new native window if is needed
if viewports.borrow().get(&pair).is_none() { if viewports.get(&pair).is_none() {
let mut builders = builders.borrow_mut(); let mut builders = builders.borrow_mut();
let mut viewports = viewports.borrow_mut();
{ {
if viewport_builder.icon.is_none() && builders.get(&pair).is_none() { if viewport_builder.icon.is_none() && builders.get(&pair).is_none() {
@@ -2230,7 +2235,7 @@ mod wgpu_integration {
// render sync viewport // render sync viewport
let window = viewports.borrow().get(&pair).cloned(); let window = viewports.get(&pair).cloned();
let Some(window) = window else { return }; let Some(window) = window else { return };
let output; let output;
let Some(winit_state) = &mut *window.state.borrow_mut() else { return }; let Some(winit_state) = &mut *window.state.borrow_mut() else { return };