mod align;
mod button;
mod checkbox;
mod container;
mod either;
mod env_scope;
mod flex;
mod label;
mod list;
mod padding;
mod parse;
mod progress_bar;
mod radio;
mod scroll;
mod sized_box;
mod slider;
mod split;
#[cfg(feature = "svg")]
#[cfg_attr(docsrs, doc(cfg(feature = "svg")))]
mod svg;
mod switch;
mod textbox;
mod widget_ext;
pub use align::Align;
pub use button::Button;
pub use checkbox::Checkbox;
pub use container::Container;
pub use either::Either;
pub use env_scope::EnvScope;
pub use flex::{Column, Flex, Row};
pub use label::{Label, LabelText};
pub use list::{List, ListIter};
pub use padding::Padding;
pub use parse::Parse;
pub use progress_bar::ProgressBar;
pub use radio::{Radio, RadioGroup};
pub use scroll::Scroll;
pub use sized_box::SizedBox;
pub use slider::Slider;
pub use split::Split;
#[cfg(feature = "svg")]
#[cfg_attr(docsrs, doc(cfg(feature = "svg")))]
pub use svg::{Svg, SvgData};
pub use switch::Switch;
pub use textbox::TextBox;
pub use widget_ext::WidgetExt;
use std::ops::DerefMut;
use crate::kurbo::Size;
use crate::{BoxConstraints, Env, Event, EventCtx, LayoutCtx, PaintCtx, UpdateCtx};
pub trait Widget<T> {
fn event(&mut self, ctx: &mut EventCtx, event: &Event, data: &mut T, env: &Env);
fn update(&mut self, ctx: &mut UpdateCtx, old_data: Option<&T>, data: &T, env: &Env);
fn layout(&mut self, ctx: &mut LayoutCtx, bc: &BoxConstraints, data: &T, env: &Env) -> Size;
fn paint(&mut self, paint_ctx: &mut PaintCtx, data: &T, env: &Env);
}
impl<T> Widget<T> for Box<dyn Widget<T>> {
fn event(&mut self, ctx: &mut EventCtx, event: &Event, data: &mut T, env: &Env) {
self.deref_mut().event(ctx, event, data, env)
}
fn update(&mut self, ctx: &mut UpdateCtx, old_data: Option<&T>, data: &T, env: &Env) {
self.deref_mut().update(ctx, old_data, data, env);
}
fn layout(&mut self, ctx: &mut LayoutCtx, bc: &BoxConstraints, data: &T, env: &Env) -> Size {
self.deref_mut().layout(ctx, bc, data, env)
}
fn paint(&mut self, paint_ctx: &mut PaintCtx, data: &T, env: &Env) {
self.deref_mut().paint(paint_ctx, data, env);
}
}