One proxy, and a macro instead of a shared test module

`Proxy` is the task queue as well as the way an application sends its own
events, so `ProxyQueue` is gone. `schedule_redraw` becomes
`request_redraw_if_needed`, which says what the comment beside it was
saying.

`assert_corners!` replaces the region helper, so `tests/common` goes with
it, and the scroll test now states both corners rather than one number.
This commit is contained in:
iris committed 2026-09-13 21:29:38 -04:00
1 parent 3a74a04a5b
commit 7eb2b85425
5 files changed
+33 -37

No files matched your search

+5 -9
View File
@@ -49,9 +49,7 @@ pub enum DefaultEvent<State: DefaultAppState> {
Update(Box<dyn TaskUpdate<DefaultRsc<State>>>),
}
struct ProxyQueue<State: DefaultAppState>(EventLoopProxy<DefaultEvent<State>>);
impl<State: DefaultAppState> TaskQueue<DefaultRsc<State>> for ProxyQueue<State> {
impl<State: DefaultAppState> TaskQueue<DefaultRsc<State>> for Proxy<State> {
fn send(&self, update: Box<dyn TaskUpdate<DefaultRsc<State>>>) {
let _ = self.0.send_event(DefaultEvent::Update(update));
}
@@ -212,7 +210,7 @@ impl<State: DefaultAppState> AppState for DefaultApp<State> {
.create_window(State::window_attributes())
.unwrap();
let default_state = DefaultUiState::new(window);
let mut rsc = DefaultRsc::init(Arc::new(ProxyQueue(proxy.clone())));
let mut rsc = DefaultRsc::init(Arc::new(Proxy(proxy.clone())));
let state = State::new(default_state, &mut rsc, Proxy(proxy));
let render = UiRenderState::new();
Self { rsc, state, render }
@@ -223,9 +221,7 @@ impl<State: DefaultAppState> AppState for DefaultApp<State> {
DefaultEvent::User(event) => self.state.event(event, &mut self.rsc, &mut self.render),
DefaultEvent::Update(update) => update(&mut self.state, &mut self.rsc),
}
// An update is not a reason to draw; whether it made anything dirty
// is. That is why a task posts here rather than asking for a redraw.
self.schedule_redraw();
self.request_redraw_if_needed();
}
fn window_event(&mut self, event: WindowEvent, event_loop: &ActiveEventLoop) {
@@ -309,7 +305,7 @@ impl<State: DefaultAppState> AppState for DefaultApp<State> {
_ => (),
}
state.window_event(event, rsc, render);
self.schedule_redraw();
self.request_redraw_if_needed();
self.state.default_state_mut().input.end_frame();
}
@@ -319,7 +315,7 @@ impl<State: DefaultAppState> AppState for DefaultApp<State> {
}
impl<State: DefaultAppState> DefaultApp<State> {
fn schedule_redraw(&mut self) {
fn request_redraw_if_needed(&mut self) {
let ui_state = self.state.default_state_mut();
if self.render.needs_redraw(&ui_state.root, self.rsc.widgets()) {
ui_state.renderer.window().request_redraw();
+19
View File
@@ -22,6 +22,25 @@ impl TaskQueue<DefaultRsc<HarnessState>> for Queue {
}
}
/// `assert_eq!` for where a frame put a widget, which `PixelRegion` cannot do
/// for itself: it neither compares nor prints.
#[macro_export]
macro_rules! assert_corners {
($harness:expr, $id:expr, ($x0:expr, $y0:expr), ($x1:expr, $y1:expr)) => {{
let region = $harness.region(&$id).expect("widget drew nothing");
assert_eq!(
(
region.top_left.x,
region.top_left.y,
region.bot_right.x,
region.bot_right.y
),
($x0 as f32, $y0 as f32, $x1 as f32, $y1 as f32)
);
}};
}
pub use crate::assert_corners;
#[derive(Default)]
pub struct HarnessState {
pub root: Option<StrongWidget>,