use agg_gui::{DrawCtx, Event, EventResult, Rect, Size, Stack, Widget};
struct RaiseOnce {
bounds: Rect,
children: Vec<Box<dyn Widget>>,
pending: bool,
}
impl RaiseOnce {
fn new() -> Self {
Self {
bounds: Rect::default(),
children: Vec::new(),
pending: true,
}
}
}
impl Widget for RaiseOnce {
fn type_name(&self) -> &'static str {
"RaiseOnce"
}
fn bounds(&self) -> Rect {
self.bounds
}
fn set_bounds(&mut self, b: Rect) {
self.bounds = b;
}
fn children(&self) -> &[Box<dyn Widget>] {
&self.children
}
fn children_mut(&mut self) -> &mut Vec<Box<dyn Widget>> {
&mut self.children
}
fn layout(&mut self, available: Size) -> Size {
self.bounds = Rect::new(0.0, 0.0, available.width, available.height);
available
}
fn paint(&mut self, _ctx: &mut dyn DrawCtx) {}
fn on_event(&mut self, _e: &Event) -> EventResult {
EventResult::Ignored
}
fn take_raise_request(&mut self) -> bool {
std::mem::replace(&mut self.pending, false)
}
}
struct Filler {
bounds: Rect,
children: Vec<Box<dyn Widget>>,
}
impl Filler {
fn new() -> Self {
Self {
bounds: Rect::default(),
children: Vec::new(),
}
}
}
impl Widget for Filler {
fn type_name(&self) -> &'static str {
"Filler"
}
fn bounds(&self) -> Rect {
self.bounds
}
fn set_bounds(&mut self, b: Rect) {
self.bounds = b;
}
fn children(&self) -> &[Box<dyn Widget>] {
&self.children
}
fn children_mut(&mut self) -> &mut Vec<Box<dyn Widget>> {
&mut self.children
}
fn layout(&mut self, available: Size) -> Size {
self.bounds = Rect::new(0.0, 0.0, available.width, available.height);
available
}
fn paint(&mut self, _ctx: &mut dyn DrawCtx) {}
fn on_event(&mut self, _e: &Event) -> EventResult {
EventResult::Ignored
}
}
#[test]
fn raise_on_overhang_index_does_not_panic() {
let mut stack = Stack::new().add(Box::new(Filler::new())).add(Box::new(Filler::new()));
stack.children_mut().push(Box::new(RaiseOnce::new()));
stack.layout(Size::new(200.0, 100.0));
assert_eq!(stack.children().len(), 3);
assert_eq!(stack.children()[2].type_name(), "RaiseOnce");
}