use std::any::Any;
use crate::buffer::ScreenBuffer;
use crate::event::Event;
use crate::geometry::Rect;
use crate::tcss::ComputedStyle;
use crate::widget::EventResult;
pub trait NodeWidget {
fn render(&mut self, area: Rect, buf: &mut ScreenBuffer);
fn on_mount(&mut self) {}
fn on_unmount(&mut self) {}
fn handle_event(&mut self, _event: &Event) -> EventResult {
EventResult::Ignored
}
fn apply_computed_style(&mut self, _computed: &ComputedStyle) {}
fn as_any(&self) -> &dyn Any;
fn as_any_mut(&mut self) -> &mut dyn Any;
}
pub struct Leaf<T>(pub T);
impl<T> Leaf<T> {
pub fn new(inner: T) -> Self {
Self(inner)
}
}
impl<T> NodeWidget for Leaf<T>
where
T: crate::widget::Widget + Any,
{
fn render(&mut self, area: Rect, buf: &mut ScreenBuffer) {
self.0.render(area, buf);
}
fn as_any(&self) -> &dyn Any {
&self.0
}
fn as_any_mut(&mut self) -> &mut dyn Any {
&mut self.0
}
}
pub struct Interactive<T>(pub T);
impl<T> Interactive<T> {
pub fn new(inner: T) -> Self {
Self(inner)
}
}
impl<T> NodeWidget for Interactive<T>
where
T: crate::widget::Widget + crate::widget::InteractiveWidget + Any,
{
fn render(&mut self, area: Rect, buf: &mut ScreenBuffer) {
self.0.render(area, buf);
}
fn handle_event(&mut self, event: &Event) -> EventResult {
self.0.handle_event(event)
}
fn as_any(&self) -> &dyn Any {
&self.0
}
fn as_any_mut(&mut self) -> &mut dyn Any {
&mut self.0
}
}
pub struct StyledLeaf<T>(pub T);
impl<T> StyledLeaf<T> {
pub fn new(inner: T) -> Self {
Self(inner)
}
}
impl<T> NodeWidget for StyledLeaf<T>
where
T: crate::widget::Widget + crate::tcss::ApplyComputedStyle + Any,
{
fn render(&mut self, area: Rect, buf: &mut ScreenBuffer) {
self.0.render(area, buf);
}
fn apply_computed_style(&mut self, computed: &ComputedStyle) {
self.0.apply_computed_style(computed);
}
fn as_any(&self) -> &dyn Any {
&self.0
}
fn as_any_mut(&mut self) -> &mut dyn Any {
&mut self.0
}
}
pub struct StyledInteractive<T>(pub T);
impl<T> StyledInteractive<T> {
pub fn new(inner: T) -> Self {
Self(inner)
}
}
impl<T> NodeWidget for StyledInteractive<T>
where
T: crate::widget::Widget
+ crate::widget::InteractiveWidget
+ crate::tcss::ApplyComputedStyle
+ Any,
{
fn render(&mut self, area: Rect, buf: &mut ScreenBuffer) {
self.0.render(area, buf);
}
fn handle_event(&mut self, event: &Event) -> EventResult {
self.0.handle_event(event)
}
fn apply_computed_style(&mut self, computed: &ComputedStyle) {
self.0.apply_computed_style(computed);
}
fn as_any(&self) -> &dyn Any {
&self.0
}
fn as_any_mut(&mut self) -> &mut dyn Any {
&mut self.0
}
}