use super::*;
impl Container {
pub(crate) fn measure_widget_rect<W: Widget + ?Sized>(&mut self, state: &W) -> Recti {
let body = self.layout.current_body();
let avail = Dimensioni::new(body.width.max(0), body.height.max(0));
let preferred = state.measure(self.style.as_ref(), &self.atlas, avail);
self.layout.next_with_preferred(preferred)
}
pub(crate) fn layout_widget_dyn(&mut self, _results: &FrameResults, widget: &dyn WidgetStateHandleDyn) -> Recti {
self.measure_widget_rect_dyn(widget)
}
pub(crate) fn measure_widget_rect_dyn(&mut self, widget: &dyn WidgetStateHandleDyn) -> Recti {
let body = self.layout.current_body();
let avail = Dimensioni::new(body.width.max(0), body.height.max(0));
let preferred = widget.measure(self.style.as_ref(), &self.atlas, avail);
self.layout.next_with_preferred(preferred)
}
pub(crate) fn render_widget_dyn(
&mut self,
results: &mut FrameResults,
widget: &dyn WidgetStateHandleDyn,
rect: Recti,
input: Option<Rc<InputSnapshot>>,
opt: WidgetOption,
bopt: WidgetBehaviourOption,
dispatch_site: String,
) -> (ControlState, ResourceState) {
let widget_id = widget.widget_id();
let control = self.update_control_with_opts(widget_id, rect, opt, bopt);
let mut ctx = self.widget_ctx(widget_id, rect, input);
let res = widget.run(&mut ctx, &control);
results.record_with_context(widget_id, res, dispatch_site);
(control, res)
}
pub(crate) fn layout_widget_handle<W: Widget>(&mut self, _results: &FrameResults, handle: &WidgetHandle<W>) -> Recti {
self.measure_widget_rect_handle(handle)
}
pub(crate) fn measure_widget_rect_handle<W: Widget>(&mut self, handle: &WidgetHandle<W>) -> Recti {
let state = handle.borrow();
self.measure_widget_rect(&*state)
}
pub(crate) fn render_widget_handle<W: Widget>(
&mut self,
results: &mut FrameResults,
handle: &WidgetHandle<W>,
rect: Recti,
input: Option<Rc<InputSnapshot>>,
opt: WidgetOption,
bopt: WidgetBehaviourOption,
dispatch_site: String,
) -> (ControlState, ResourceState) {
let widget_id = {
let state = handle.borrow();
widget_id_of(&*state)
};
let control = self.update_control_with_opts(widget_id, rect, opt, bopt);
let mut ctx = self.widget_ctx(widget_id, rect, input);
let res = {
let mut state = handle.borrow_mut();
state.run(&mut ctx, &control)
};
results.record_with_context(widget_id, res, dispatch_site);
(control, res)
}
}