use super::{Map, MapAny, OnUpdate, Reserve, WithLabel};
use kas::cast::{Cast, CastFloat};
use kas::dir::Directional;
use kas::event::ConfigCx;
use kas::geom::Vec2;
use kas::layout::{AxisInfo, SizeRules};
use kas::text::AccessString;
use kas::theme::SizeCx;
use kas::Widget;
#[allow(unused)] use kas::{Events, Layout};
pub trait AdaptWidgetAny: Widget<Data = ()> + Sized {
#[must_use]
fn map_any<A>(self) -> MapAny<A, Self> {
MapAny::new(self)
}
}
impl<W: Widget<Data = ()>> AdaptWidgetAny for W {}
pub trait AdaptWidget: Widget + Sized {
#[must_use]
fn map<A, F>(self, f: F) -> Map<A, Self, F>
where
F: for<'a> Fn(&'a A) -> &'a Self::Data,
{
Map::new(self, f)
}
#[must_use]
fn on_configure<F>(self, f: F) -> OnUpdate<Self>
where
F: Fn(&mut ConfigCx, &mut Self) + 'static,
{
OnUpdate::new(self).on_configure(f)
}
#[must_use]
fn on_update<F>(self, f: F) -> OnUpdate<Self>
where
F: Fn(&mut ConfigCx, &mut Self, &Self::Data) + 'static,
{
OnUpdate::new(self).on_update(f)
}
#[must_use]
fn with_min_size_px(self, w: i32, h: i32) -> Reserve<Self> {
let size = Vec2(w.cast(), h.cast());
Reserve::new(self, move |sizer: SizeCx, axis: AxisInfo| {
let size = size.extract(axis) * sizer.scale_factor();
SizeRules::fixed(size.cast_ceil(), (0, 0))
})
}
#[must_use]
fn with_min_size_em(self, w: f32, h: f32) -> Reserve<Self> {
let size = Vec2(w, h);
Reserve::new(self, move |sizer: SizeCx, axis: AxisInfo| {
let size = size.extract(axis) * sizer.dpem();
SizeRules::fixed(size.cast_ceil(), (0, 0))
})
}
#[must_use]
fn with_label<D, T>(self, direction: D, label: T) -> WithLabel<Self, D>
where
D: Directional,
T: Into<AccessString>,
{
WithLabel::new_dir(self, direction, label)
}
}
impl<W: Widget> AdaptWidget for W {}