tuid/src/widget/widget_pod.rs

49 lines
1.0 KiB
Rust

use std::marker::PhantomData;
use crate::{box_constraints::BoxConstraints, Data, DataWrapper, Event, Point, Rect, Size, Widget};
pub struct WidgetPod<T, W> {
data: PhantomData<T>,
inner: W,
origin: Point,
size: Size,
}
impl<T, W: Widget<T>> WidgetPod<T, W> {
pub fn new(inner: W) -> Self {
Self {
data: PhantomData,
inner,
origin: Point { x: 0, y: 0 },
size: Size::ZERO,
}
}
pub fn set_origin(&mut self, p: Point) {
self.origin = p;
}
pub fn layout_rect(&self) -> Rect {
Rect::from_origin_size(self.origin, self.size)
}
}
impl<T: Data, W: Widget<T>> Widget<T> for WidgetPod<T, W> {
fn update(&mut self, data: &DataWrapper<T>) {
self.inner.update(data)
}
fn layout(&mut self, bounds: &BoxConstraints) -> Size {
let new_size = self.inner.layout(bounds);
self.size = new_size;
new_size
}
fn paint(&mut self, buf: &mut [char], origin: Point, _: &Size) {
self.inner.paint(buf, origin + self.origin, &self.size)
}
fn event(&mut self, data: &mut DataWrapper<T>, event: &Event) {
self.inner.event(data, event)
}
}