use float_cmp::assert_approx_eq;
use test_log::test;
use super::*;
#[test]
fn invalidate_union() {
let id_child1 = WidgetId::next();
let id_child2 = WidgetId::next();
let id_parent = WidgetId::next();
let widget = Split::columns(
Button::new("hi").with_id(id_child1),
Button::new("there").with_id(id_child2),
)
.with_id(id_parent);
Harness::create_simple(true, widget, |harness| {
harness.send_initial_events();
harness.just_layout();
let child1_rect = harness.get_state(id_child1).layout_rect();
let child2_rect = harness.get_state(id_child2).layout_rect();
harness.event(Event::MouseMove(move_mouse((10., 10.))));
assert_eq!(harness.window().invalid().rects(), &[child1_rect]);
harness.paint_invalid();
assert!(harness.window().invalid().is_empty());
harness.event(Event::MouseMove(move_mouse((210., 10.))));
assert_eq!(
harness.window().invalid().rects(),
&[child1_rect, child2_rect]
);
});
}
#[test]
fn invalidate_scroll() {
const RECT: Rect = Rect {
x0: 30.,
y0: 40.,
x1: 40.,
y1: 50.,
};
struct Invalidator;
impl<T: Data> Widget<T> for Invalidator {
fn event(&mut self, ctx: &mut EventCtx, _: &Event, _: &mut T, _: &Env) {
ctx.request_paint_rect(RECT);
}
fn lifecycle(&mut self, _: &mut LifeCycleCtx, _: &LifeCycle, _: &T, _: &Env) {}
fn update(&mut self, _: &mut UpdateCtx, _: &T, _: &T, _: &Env) {}
fn layout(&mut self, _: &mut LayoutCtx, _: &BoxConstraints, _: &T, _: &Env) -> Size {
Size::new(1000., 1000.)
}
fn paint(&mut self, ctx: &mut PaintCtx, _: &T, _: &Env) {
assert_eq!(ctx.region().rects().len(), 1);
let rect = ctx.region().rects().first().unwrap();
assert_approx_eq!(f64, rect.x0, 30.);
assert_approx_eq!(f64, rect.y0, 40.);
assert_approx_eq!(f64, rect.x1, 40.);
assert_approx_eq!(f64, rect.y1, 50.);
}
}
let id = WidgetId::next();
let scroll_id = WidgetId::next();
let invalidator = IdentityWrapper::wrap(Invalidator, id);
let scroll = Scroll::new(invalidator).with_id(scroll_id);
Harness::create_simple(true, scroll, |harness| {
harness.send_initial_events();
harness.just_layout();
harness.event(Event::MouseMove(move_mouse((10., 10.))));
assert_eq!(harness.window().invalid().rects(), &[RECT]);
harness.paint_invalid();
assert!(harness.window().invalid().is_empty());
harness.event(Event::Wheel(scroll_mouse((10., 10.), (7.0, 9.0))));
assert_eq!(
harness.window().invalid().rects(),
&[Size::new(400., 400.).to_rect()]
);
harness.window_mut().invalid_mut().clear();
harness.event(Event::MouseMove(move_mouse((10., 10.))));
assert_eq!(
harness.window().invalid().rects(),
&[RECT - Vec2::new(7.0, 9.0)]
);
harness.paint_invalid();
});
}