`Harness`: Add `remove_cursor`, `event` and `event_modifiers` (#7607)

* Closes https://github.com/emilk/egui/issues/7591
This commit is contained in:
Lucas Meurer 2025-10-08 13:47:00 +02:00 committed by GitHub
parent 4d4f90eb31
commit 718a82b013
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 49 additions and 2 deletions

View File

@ -460,11 +460,15 @@ impl<'a, State> Harness<'a, State> {
&mut self.state
}
fn event(&self, event: egui::Event) {
/// Queue an event to be processed in the next frame.
pub fn event(&self, event: egui::Event) {
self.queued_events.lock().push(EventType::Event(event));
}
fn event_modifiers(&self, event: egui::Event, modifiers: Modifiers) {
/// Queue an event with modifiers.
///
/// Queues the modifiers to be pressed, then the event, then the modifiers to be released.
pub fn event_modifiers(&self, event: egui::Event, modifiers: Modifiers) {
let mut queue = self.queued_events.lock();
queue.push(EventType::Modifiers(modifiers));
queue.push(EventType::Event(event));
@ -584,6 +588,16 @@ impl<'a, State> Harness<'a, State> {
self.key_combination_modifiers(modifiers, &[key]);
}
/// Remove the cursor from the screen.
///
/// Will fire a [`egui::Event::PointerGone`] event.
///
/// If you click a button and then take a snapshot, the button will be shown as hovered.
/// If you don't want that, you can call this method after clicking.
pub fn remove_cursor(&self) {
self.event(egui::Event::PointerGone);
}
/// Mask something. Useful for snapshot tests.
///
/// Call this _after_ [`Self::run`] and before [`Self::snapshot`].

View File

@ -181,3 +181,36 @@ fn test_masking() {
harness.snapshot("test_masking");
}
#[test]
fn test_remove_cursor() {
let hovered = false;
let mut harness = Harness::new_ui_state(
|ui, state| {
let response = ui.button("Click me");
*state = response.hovered();
},
hovered,
);
harness.fit_contents();
harness.get_by_label("Click me").click();
harness.run();
assert!(harness.state(), "The button should be hovered");
let hovered_button_snapshot = harness.render().expect("Failed to render");
harness.remove_cursor();
harness.run();
assert!(
!harness.state(),
"The button should not be hovered after removing cursor"
);
let non_hovered_button_snapshot = harness.render().expect("Failed to render");
assert_ne!(
hovered_button_snapshot, non_hovered_button_snapshot,
"The button appearance should change"
);
}