From bc214ce306eadab17547c6c1f80276266cfe257a Mon Sep 17 00:00:00 2001 From: Lucas Meurer Date: Thu, 6 Feb 2025 17:15:36 +0100 Subject: [PATCH] Fix modifiers not working in kittest --- RELEASES.md | 4 +++- crates/egui_kittest/src/event.rs | 16 +++++++++++++--- crates/egui_kittest/src/lib.rs | 7 ++----- crates/egui_kittest/tests/tests.rs | 30 ++++++++++++++++++++++++++---- 4 files changed, 44 insertions(+), 13 deletions(-) diff --git a/RELEASES.md b/RELEASES.md index a8e629a03405..34ef114636dd 100644 --- a/RELEASES.md +++ b/RELEASES.md @@ -74,13 +74,15 @@ I usually do this all on the `master` branch, but doing it in a release branch i (cd crates/egui && cargo publish --quiet) && echo "✅ egui" (cd crates/egui-winit && cargo publish --quiet) && echo "✅ egui-winit" (cd crates/egui-wgpu && cargo publish --quiet) && echo "✅ egui-wgpu" +(cd crates/eframe && cargo publish --quiet) && echo "✅ eframe" (cd crates/egui_kittest && cargo publish --quiet) && echo "✅ egui_kittest" (cd crates/egui_extras && cargo publish --quiet) && echo "✅ egui_extras" (cd crates/egui_demo_lib && cargo publish --quiet) && echo "✅ egui_demo_lib" (cd crates/egui_glow && cargo publish --quiet) && echo "✅ egui_glow" -(cd crates/eframe && cargo publish --quiet) && echo "✅ eframe" ``` +\ + ## Announcements * [ ] [Bluesky](https://bsky.app/profile/ernerfeldt.bsky.social) * [ ] egui discord diff --git a/crates/egui_kittest/src/event.rs b/crates/egui_kittest/src/event.rs index 5ac07488d0c2..3b1a79a10d7a 100644 --- a/crates/egui_kittest/src/event.rs +++ b/crates/egui_kittest/src/event.rs @@ -9,7 +9,17 @@ pub(crate) struct EventState { } impl EventState { - pub fn kittest_event_to_egui(&mut self, event: kittest::Event) -> Option { + /// Map the kittest events to egui events, add them to the input and update the modifiers. + pub fn update(&mut self, events: Vec, input: &mut egui::RawInput) { + for event in events { + if let Some(event) = self.kittest_event_to_egui(event) { + input.events.push(event); + } + } + input.modifiers = self.modifiers; + } + + fn kittest_event_to_egui(&mut self, event: kittest::Event) -> Option { match event { kittest::Event::ActionRequest(e) => Some(Event::AccessKitActionRequest(e)), kittest::Event::Simulated(e) => match e { @@ -58,7 +68,7 @@ impl EventState { } } -pub fn kittest_key_to_egui(value: kittest::Key) -> Option { +fn kittest_key_to_egui(value: kittest::Key) -> Option { use egui::Key as EKey; use kittest::Key; match value { @@ -170,7 +180,7 @@ pub fn kittest_key_to_egui(value: kittest::Key) -> Option { } } -pub fn pointer_button_to_egui(value: MouseButton) -> Option { +fn pointer_button_to_egui(value: MouseButton) -> Option { match value { MouseButton::Left => Some(egui::PointerButton::Primary), MouseButton::Right => Some(egui::PointerButton::Secondary), diff --git a/crates/egui_kittest/src/lib.rs b/crates/egui_kittest/src/lib.rs index 661cb92c3b23..152eab844f26 100644 --- a/crates/egui_kittest/src/lib.rs +++ b/crates/egui_kittest/src/lib.rs @@ -227,11 +227,8 @@ impl<'a, State> Harness<'a, State> { } fn _step(&mut self, sizing_pass: bool) { - for event in self.kittest.take_events() { - if let Some(event) = self.event_state.kittest_event_to_egui(event) { - self.input.events.push(event); - } - } + self.event_state + .update(self.kittest.take_events(), &mut self.input); self.input.predicted_dt = self.step_dt; diff --git a/crates/egui_kittest/tests/tests.rs b/crates/egui_kittest/tests/tests.rs index 29b4c7b114a6..95cda248e6ad 100644 --- a/crates/egui_kittest/tests/tests.rs +++ b/crates/egui_kittest/tests/tests.rs @@ -1,4 +1,5 @@ -use egui_kittest::{Harness, SnapshotResults}; +use egui_kittest::Harness; +use kittest::{Key, Queryable}; #[test] fn test_shrink() { @@ -10,8 +11,29 @@ fn test_shrink() { harness.fit_contents(); - let mut results = SnapshotResults::new(); - #[cfg(all(feature = "snapshot", feature = "wgpu"))] - results.add(harness.try_snapshot("test_shrink")); + harness.snapshot("test_shrink"); +} + +#[test] +fn test_modifiers() { + let mut harness = Harness::new_ui_state( + |ui, cmd_clicked| { + if ui.button("Click me").clicked() && ui.input(|i| i.modifiers.command) { + *cmd_clicked = true; + } + }, + false, + ); + + harness.get_by_label("Click me").key_down(Key::Command); + harness.get_by_label("Click me").click(); + // TODO(lucasmerlin): Right now the key_up needs to happen on a separate frame or it won't register. + // This should be more intuitive + harness.run(); + harness.get_by_label("Click me").key_up(Key::Command); + + harness.run(); + + assert!(harness.state(), "The button wasn't command-clicked"); }