Conversation
|
This looks very promising! Can you please add a working example too? 🙏 |
31caf84 to
2385348
Compare
|
Added a working example and fixed the CI issues (was on a Windows machine before, so I couldn't run the |
|
Btw, I went and changed one of my projects to this approach, and I noticed that although it does work, communication between the 'outer' code and the 'detached eframe app' is kinda clunky, since there's no way to access or modify the app data from the returned reference. The way I'm doing this at the moment is by leaking a struct SharedState {
flag: bool
}
struct MyApp {
shared: &'static RefCell<SharedState>
}
let shared_state = Box::leak(Box::new(RefCell::new(SharedState { flag: true }))) as &_;
let detached_app = eframe::run_detached_native(
...,
Box::new(|_cc| Box::new(MyApp { shared: shared_state }))
)
// 'shared_state' can be accessed and modifiedHow would you feel about exposing a |
|
not sure I follow entirely but would this pr allow you to open a completely detached eframe, meaning you would have two separate event loops? |
|
What's the status of this PR? This would be very useful for Ruffle |
Is the problem that we need to give away ownership of the Btw, if there's anyway I can contribute, I would be happy to help. |
emilk
left a comment
There was a problem hiding this comment.
Needs a merging in of master and testing with multi-viewports, otherwise its looking good
| @@ -0,0 +1,7 @@ | |||
| Example showing some UI controls like `Label`, `TextEdit`, `Slider`, `Button`. | |||
There was a problem hiding this comment.
And the screenshot is not very useful either
| ); | ||
| // Winit window managed by the application | ||
| let winit_window = winit::window::WindowBuilder::new() | ||
| .build(&event_loop) |
There was a problem hiding this comment.
Giving this a title of e.g. "winit window" would help explain to the user what is going on
| ui.heading("My egui Application"); | ||
| ui.horizontal(|ui| { | ||
| let name_label = ui.label("Your name: "); | ||
| ui.text_edit_singleline(&mut self.name) | ||
| .labelled_by(name_label.id); | ||
| }); | ||
| ui.add(egui::Slider::new(&mut self.age, 0..=120).text("age")); | ||
| if ui.button("Click each year").clicked() { | ||
| self.age += 1; | ||
| } | ||
| ui.label(format!("Hello '{}', age {}", self.name, self.age)); |
There was a problem hiding this comment.
Instead of showing the generic egui application, it would be better to show some text about what is going on in this example
| /// An eframe app detached from the event loop. | ||
| /// | ||
| /// This is useful to run `eframe` apps while still having control over the event loop. | ||
| /// For example, when you need to have a window managed by `egui` and another managed |
There was a problem hiding this comment.
| /// For example, when you need to have a window managed by `egui` and another managed | |
| /// For example, when you need to have a window managed by `eframe` and another managed |
| /// Execute an app in a detached state. | ||
| /// | ||
| /// This allows you to control the event loop itself, which is necessary in a few | ||
| /// occasions, like when you need a screen not managed by `egui`. |
There was a problem hiding this comment.
| /// occasions, like when you need a screen not managed by `egui`. | |
| /// occasions, like when you need a screen not managed by `eframe`. |
| // Ignore window events for other windows | ||
| if let Some(window) = self.winit_app.window() { |
There was a problem hiding this comment.
I think you need to merge in master and handle the case of multi-viewports
|
This seems dead. I would be interested in reviving and finishing off the PR. Would that be OK? I am not sure how much has changed here do you think it might be better to restart? |
|
Yes this is quite divergent at this point. I have a new approach off master here that could use some review. #6750 |
<!-- Please read the "Making a PR" section of [`CONTRIBUTING.md`](https://github.com/emilk/egui/blob/master/CONTRIBUTING.md) before opening a Pull Request! * Keep your PR:s small and focused. * The PR title is what ends up in the changelog, so make it descriptive! * If applicable, add a screenshot or gif. * If it is a non-trivial addition, consider adding a demo for it to `egui_demo_lib`, or a new example. * Do NOT open PR:s from your `master` branch, as that makes it hard for maintainers to test and add commits to your PR. * Remember to run `cargo fmt` and `cargo clippy`. * Open the PR as a draft until you have self-reviewed it and run `./scripts/check.sh`. * When you have addressed a PR comment, mark it as resolved. Please be patient! I will review your PR, but my time is limited! --> * Closes emilk#2875 * Closes emilk#3340 * [x] I have followed the instructions in the PR template Adds `create_native`. Similiar to `run_native` but it returns an `EframeWinitApplication` which is a `winit::ApplicationHandler`. This can be run on your own event loop. A helper fn `pump_eframe_app` is provided to pump the event loop and get the control flow state back. I have been using this approach for a few months. --------- Co-authored-by: Will Brown <opensource@rebeagle.com>
eframeto run on an existing event loop #2875.One choice that I'm not really sure which I prefer is whether we should check for
window.id() == window_idonWindowEventevents inside theon_eventmethod or not. Since we're already exposing thewindow, the user could easily check that outside. However, when writing some example code, it ended up looking really bad and confusing. At the same time, people who will use this are probably people who have a good understanding ofwinitand GUI development in general, so maybe that's not an issue.This gist shows how the 2 approaches would look like:
https://gist.github.com/rockisch/c672345661dd5411f5611b7ab14faea0
This initial version of the PR has the check inside, but I could remove it if wanted.