49 lines
1.0 KiB
Rust
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)
|
|
}
|
|
}
|