mod data; mod handle; mod like; mod tag; mod widgets; pub use data::*; pub use handle::*; pub use like::*; pub use tag::*; pub use widgets::*; use crate::layout::{Len, Painter, SizeCtx, Ui}; pub trait Widget: 'static + Send + Sync { fn draw(&mut self, painter: &mut Painter); fn desired_width(&mut self, ctx: &mut SizeCtx) -> Len; fn desired_height(&mut self, ctx: &mut SizeCtx) -> Len; } impl Widget for () { fn draw(&mut self, _: &mut Painter) {} fn desired_width(&mut self, _: &mut SizeCtx) -> Len { Len::ZERO } fn desired_height(&mut self, _: &mut SizeCtx) -> Len { Len::ZERO } } /// A function that returns a widget given a UI. /// Useful for defining trait functions on widgets that create a parent widget so that the children /// don't need to be IDs yet pub trait WidgetFn: FnOnce(&mut Ui) -> W {} impl W> WidgetFn for F {} impl W> WidgetLike for F { type Widget = W; fn add(self, ui: &mut Ui) -> WidgetHandle { self(ui).add(ui) } } impl WidgetLike for W { type Widget = W; fn add(self, _: &mut Ui) -> WidgetHandle { WIDGETS.insert(self) } } pub trait WidgetOption { fn get(self, ui: &mut Ui) -> Option; } impl WidgetOption for () { fn get(self, _: &mut Ui) -> Option { None } } impl Option> WidgetOption for F { fn get(self, ui: &mut Ui) -> Option { self(ui) } }