use std::cell::RefCell;
use std::rc::Rc;
use fui_core::*;
use typed_builder::TypedBuilder;
#[derive(TypedBuilder)]
pub struct DataHolder<T> {
pub data: T,
}
impl<T: 'static> DataHolder<T> {
pub fn to_view(
self,
style: Option<Box<dyn Style<Self>>>,
context: ViewContext,
) -> Rc<RefCell<dyn ControlObject>> {
StyledControl::new(
self,
style.unwrap_or_else(|| {
Box::new(DefaultDataHolderStyle::new(
DefaultDataHolderStyleParams::builder().build(),
))
}),
context,
)
}
}
#[derive(TypedBuilder)]
pub struct DefaultDataHolderStyleParams {}
pub struct DefaultDataHolderStyle;
impl DefaultDataHolderStyle {
pub fn new(_params: DefaultDataHolderStyleParams) -> Self {
DefaultDataHolderStyle {}
}
}
impl<T: 'static> Style<DataHolder<T>> for DefaultDataHolderStyle {
fn setup(&mut self, _data: &mut DataHolder<T>, _control_context: &mut ControlContext) {}
fn handle_event(
&mut self,
_data: &mut DataHolder<T>,
_control_context: &mut ControlContext,
_drawing_context: &mut FuiDrawingContext,
_event_context: &mut dyn EventContext,
_event: ControlEvent,
) {
}
fn measure(
&mut self,
_data: &mut DataHolder<T>,
control_context: &mut ControlContext,
drawing_context: &mut FuiDrawingContext,
size: Size,
) -> Size {
let children = control_context.get_children();
let content_size = match children.into_iter().next() {
Some(ref content) => {
content.borrow_mut().measure(drawing_context, size);
let rect = content.borrow().get_rect();
Size::new(rect.width, rect.height)
}
_ => Size::empty(),
};
content_size
}
fn set_rect(
&mut self,
_data: &mut DataHolder<T>,
control_context: &mut ControlContext,
drawing_context: &mut FuiDrawingContext,
rect: Rect,
) {
let children = control_context.get_children();
if let Some(child) = children.into_iter().next() {
child.borrow_mut().set_rect(drawing_context, rect);
}
}
fn hit_test(
&self,
_data: &DataHolder<T>,
control_context: &ControlContext,
point: Point,
) -> Option<Rc<RefCell<dyn ControlObject>>> {
let children = control_context.get_children();
match children.into_iter().next() {
Some(child) => child.borrow_mut().hit_test(point),
_ => None,
}
}
fn draw(
&mut self,
_data: &DataHolder<T>,
control_context: &ControlContext,
drawing_context: &mut FuiDrawingContext,
) {
let children = control_context.get_children();
match children.into_iter().next() {
Some(child) => child.borrow_mut().draw(drawing_context),
_ => (),
}
}
}