mirror of
https://github.com/emilk/egui.git
synced 2026-08-31 05:40:03 -04:00
Let app logic see the window state, and test it
`Context::run_logic` now takes the new `RawInput`, and copies only `RawInput::viewports` into the `InputState`, so that `App::logic` can tell that the window is minimized/occluded. The ui input (events, time) is left for the next pass. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -331,17 +331,17 @@ impl EpiIntegration {
|
||||
|
||||
let close_requested = raw_input.viewport().close_requested();
|
||||
|
||||
// No pass will consume the input, so save it for the next one:
|
||||
let logic_output = self.egui_ctx.run_logic(&raw_input, |ctx| {
|
||||
profiling::scope!("App::logic");
|
||||
app.logic(ctx, &mut self.frame);
|
||||
});
|
||||
|
||||
// No pass consumed the input, so save it for the next one:
|
||||
match &mut self.pending_raw_input {
|
||||
Some(pending) => pending.append(raw_input),
|
||||
None => self.pending_raw_input = Some(raw_input),
|
||||
}
|
||||
|
||||
let logic_output = self.egui_ctx.run_logic(|ctx| {
|
||||
profiling::scope!("App::logic");
|
||||
app.logic(ctx, &mut self.frame);
|
||||
});
|
||||
|
||||
if close_requested {
|
||||
let canceled = logic_output
|
||||
.viewport_commands
|
||||
|
||||
@@ -285,16 +285,16 @@ impl AppRunner {
|
||||
// That way all ui state is left untouched, and is still there
|
||||
// when the tab is shown again.
|
||||
|
||||
// No pass will consume the input, so save it for the next one:
|
||||
self.input.raw.append(raw_input);
|
||||
|
||||
let egui::LogicOutput {
|
||||
platform_output,
|
||||
viewport_commands,
|
||||
} = self.egui_ctx.run_logic(|ctx| {
|
||||
} = self.egui_ctx.run_logic(&raw_input, |ctx| {
|
||||
self.app.logic(ctx, &mut self.frame);
|
||||
});
|
||||
|
||||
// No pass consumed the input, so save it for the next one:
|
||||
self.input.raw.append(raw_input);
|
||||
|
||||
self.handle_viewport_commands(viewport_commands.into_values().flatten());
|
||||
self.handle_platform_output(platform_output);
|
||||
return;
|
||||
|
||||
@@ -898,21 +898,32 @@ impl Context {
|
||||
/// No pass is run, so `f` must not show any ui.
|
||||
/// This means everything egui knows about the ui is left untouched:
|
||||
/// no widget state is garbage-collected, no animation advances,
|
||||
/// nothing loses focus, and [`Self::input`] still refers to the last pass.
|
||||
/// and nothing loses focus.
|
||||
///
|
||||
/// Of `new_input`, only [`RawInput::viewports`] is used: `f` can learn about the state of
|
||||
/// the windows with [`InputState::viewport`], but the ui input (events, time, …)
|
||||
/// is left as it was, and should be given to the next call to [`Self::run_ui`].
|
||||
///
|
||||
/// The returned [`LogicOutput`] is what [`FullOutput`] would have carried:
|
||||
/// anything `f` asked the integration to do.
|
||||
/// There is nothing to paint.
|
||||
#[must_use]
|
||||
pub fn run_logic(&self, f: impl FnOnce(&Self)) -> LogicOutput {
|
||||
pub fn run_logic(&self, new_input: &RawInput, f: impl FnOnce(&Self)) -> LogicOutput {
|
||||
profiling::function_scope!();
|
||||
|
||||
// Outside of a pass this is the root viewport:
|
||||
let viewport_id = self.viewport_id();
|
||||
let viewport_id = new_input.viewport_id;
|
||||
|
||||
// Consume any outstanding repaint request, so that a new request from `f`
|
||||
// reaches the integration instead of being considered already served:
|
||||
self.write(|ctx| ctx.begin_pass_repaint_logic(viewport_id));
|
||||
self.write(|ctx| {
|
||||
// Consume any outstanding repaint request, so that a new request from `f`
|
||||
// reaches the integration instead of being considered already served:
|
||||
ctx.begin_pass_repaint_logic(viewport_id);
|
||||
|
||||
// Tell the app about the windows, but leave the ui input alone:
|
||||
let raw = &mut ctx.viewport_for(viewport_id).input.raw;
|
||||
raw.viewport_id = viewport_id;
|
||||
raw.viewports = new_input.viewports.clone();
|
||||
raw.focused = new_input.focused;
|
||||
});
|
||||
|
||||
f(self);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user