Is your feature request related to a problem? Please describe.
Immediate mode UI is not very flexible when it comes to code flow structure. Different parts of the application can't just register their widgets - they have to add their code as part of the main loop. With Rust borrow checking this gets tricky, because you need to use a &mut Ui which has a lifetime so you can't just pass it around - not unless the application flow framework explicitly supports it.
egui already has way around this - Frame::begin. It returns a Prepared struct which stores a self owned Ui object with no strings attached.
The problem is that Prepared is not exposed. It's pub, but the module that owns it - frame - is private, and the only thing the parent module containers exposes from it is Frame.
Describe the solution you'd like
Either add frame::Prepared to the pub use block in src/egui/containers/mod.rs - or pub use the entire frame module.
Describe alternatives you've considered
I've managed to hack around this: https://github.com/idanarye/bevy-yoleck/blob/d39936ce990821eb91daeb978f30b18ea98da131/src/dynamic_source_handling.rs#L143-L154. I've created a dummy Ui and used mem::replace so switch it with the one inside the Prepared, Indiana Jones style. Then I send the Ui I took from the Prepared around the get filled - something that I can do because Ui is exposed - and finish by placing that Ui back inside the Prepared.
This is a hack, and I'd rather have a proper way to do this. Theoretically I could have just used child_ui to create a real Ui, but then I'd have to calculate max_rect myself instead of having the Frame do it for me.
Is your feature request related to a problem? Please describe.
Immediate mode UI is not very flexible when it comes to code flow structure. Different parts of the application can't just register their widgets - they have to add their code as part of the main loop. With Rust borrow checking this gets tricky, because you need to use a
&mut Uiwhich has a lifetime so you can't just pass it around - not unless the application flow framework explicitly supports it.egui already has way around this -
Frame::begin. It returns aPreparedstruct which stores a self ownedUiobject with no strings attached.The problem is that
Preparedis not exposed. It'spub, but the module that owns it -frame- is private, and the only thing the parent modulecontainersexposes from it isFrame.Describe the solution you'd like
Either add
frame::Preparedto thepub useblock insrc/egui/containers/mod.rs- orpub usethe entireframemodule.Describe alternatives you've considered
I've managed to hack around this: https://github.com/idanarye/bevy-yoleck/blob/d39936ce990821eb91daeb978f30b18ea98da131/src/dynamic_source_handling.rs#L143-L154. I've created a dummy
Uiand usedmem::replaceso switch it with the one inside thePrepared, Indiana Jones style. Then I send theUiI took from thePreparedaround the get filled - something that I can do becauseUiis exposed - and finish by placing thatUiback inside thePrepared.This is a hack, and I'd rather have a proper way to do this. Theoretically I could have just used
child_uito create a realUi, but then I'd have to calculatemax_rectmyself instead of having theFramedo it for me.