use ribir_core::prelude::*;
#[derive(SingleChild, Declare)]
pub struct NoAffectedParentSize {}
impl Render for NoAffectedParentSize {
fn measure(&self, clamp: BoxClamp, ctx: &mut MeasureCtx) -> Size {
ctx
.perform_single_child_layout(clamp)
.unwrap_or(ZERO_SIZE)
}
fn size_affected_by_child(&self) -> bool { false }
fn hit_test(&self, _ctx: &mut HitTestCtx, _pos: Point) -> HitTest {
HitTest { hit: false, can_hit_child: true }
}
#[cfg(feature = "debug")]
fn debug_name(&self) -> std::borrow::Cow<'static, str> {
std::borrow::Cow::Borrowed("noAffectedParentSize")
}
}
#[cfg(test)]
mod tests {
use ribir_core::{prelude::*, reset_test_env, test_helper::*};
use crate::layout::NoAffectedParentSize;
#[test]
fn ignore_layout_changed() {
reset_test_env!();
let (parent_layout, parent_layout_writer) = split_value(0);
let (child1_layout, child1_layout_writer) = split_value(0);
let (child2_layout, child2_layout_writer) = split_value(0);
let (child1_size, child1_size_writer) = split_value(Size::new(100., 100.));
let (child2_size, child2_size_writer) = split_value(Size::new(100., 100.));
let w = fn_widget! {
let child1 = @MockBox {
size: pipe!(*$read(child1_size)),
on_performed_layout: move |_| {
*$write(child1_layout_writer) += 1;
},
};
let child2 = @NoAffectedParentSize {
@MockBox {
size: pipe!(*$read(child2_size)),
on_performed_layout: move |_| {
*$write(child2_layout_writer) += 1;
},
}
};
@MockMulti {
on_performed_layout: move |_| {
*$write(parent_layout_writer) += 1;
},
@ { child1 }
@ { child2 }
}
};
let wnd = TestWindow::new_with_size(w, Size::new(200., 200.));
wnd.draw_frame();
assert_eq!(*parent_layout.read(), 1);
assert_eq!(*child1_layout.read(), 1);
assert_eq!(*child2_layout.read(), 1);
{
child1_size_writer.write().width = 200.;
}
wnd.draw_frame();
assert_eq!(*parent_layout.read(), 2);
assert_eq!(*child1_layout.read(), 2);
assert_eq!(*child2_layout.read(), 1);
{
child2_size_writer.write().width = 200.;
}
wnd.draw_frame();
assert_eq!(*parent_layout.read(), 2);
assert_eq!(*child1_layout.read(), 2);
assert_eq!(*child2_layout.read(), 2);
}
}