mirror of
https://github.com/emilk/egui.git
synced 2026-06-26 22:53:14 -04:00
Fix missing repaint after consume_key (#7134)
Usually input events automatically trigger a repaint. But since consume_key would remove the event egui would think there were no events and not trigger a repaint. This fixes it by setting a flag on InputState on consume_key. * related: https://github.com/rerun-io/rerun/issues/10165
This commit is contained in:
@@ -492,6 +492,7 @@ impl ContextImpl {
|
||||
pixels_per_point,
|
||||
self.memory.options.input_options,
|
||||
);
|
||||
let repaint_after = viewport.input.wants_repaint_after();
|
||||
|
||||
let screen_rect = viewport.input.screen_rect;
|
||||
|
||||
@@ -553,6 +554,10 @@ impl ContextImpl {
|
||||
}
|
||||
|
||||
self.update_fonts_mut();
|
||||
|
||||
if let Some(delay) = repaint_after {
|
||||
self.request_repaint_after(delay, viewport_id, RepaintCause::new());
|
||||
}
|
||||
}
|
||||
|
||||
/// Load fonts unless already loaded.
|
||||
@@ -2398,10 +2403,7 @@ impl ContextImpl {
|
||||
|
||||
if repaint_needed {
|
||||
self.request_repaint(ended_viewport_id, RepaintCause::new());
|
||||
} else if let Some(delay) = viewport.input.wants_repaint_after() {
|
||||
self.request_repaint_after(delay, ended_viewport_id, RepaintCause::new());
|
||||
}
|
||||
|
||||
// -------------------
|
||||
|
||||
let all_viewport_ids = self.all_viewport_ids();
|
||||
|
||||
@@ -597,10 +597,14 @@ impl InputState {
|
||||
(self.time - self.last_scroll_time) as f32
|
||||
}
|
||||
|
||||
/// The [`crate::Context`] will call this at the end of each frame to see if we need a repaint.
|
||||
/// The [`crate::Context`] will call this at the beginning of each frame to see if we need a repaint.
|
||||
///
|
||||
/// Returns how long to wait for a repaint.
|
||||
pub fn wants_repaint_after(&self) -> Option<Duration> {
|
||||
///
|
||||
/// NOTE: It's important to call this immediately after [`Self::begin_pass`] since calls to
|
||||
/// [`Self::consume_key`] will remove events from the vec, meaning those key presses wouldn't
|
||||
/// cause a repaint.
|
||||
pub(crate) fn wants_repaint_after(&self) -> Option<Duration> {
|
||||
if self.pointer.wants_repaint()
|
||||
|| self.unprocessed_scroll_delta.abs().max_elem() > 0.2
|
||||
|| self.unprocessed_scroll_delta_for_zoom.abs() > 0.2
|
||||
|
||||
Reference in New Issue
Block a user