use super::*;
#[allow(unused)] use kas::Events;
use kas::Widget;
use kas::cast::{Cast, CastFloat};
use kas::dir::Directional;
use kas::geom::Vec2;
use kas::layout::{AlignHints, AxisInfo, SizeRules};
use kas::text::AccessString;
use kas::theme::{MarginStyle, SizeCx, TextClass};
use std::fmt::Debug;
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 align(self, hints: AlignHints) -> Align<Self> {
Align::new(self, hints)
}
#[must_use]
fn pack(self, hints: AlignHints) -> Pack<Self> {
Pack::new(self, hints)
}
#[must_use]
fn with_stretch(
self,
horiz: impl Into<Option<Stretch>>,
vert: impl Into<Option<Stretch>>,
) -> WithStretch<Self> {
WithStretch::new(self, horiz, vert)
}
#[must_use]
fn with_margin_style(self, style: MarginStyle) -> WithMarginStyle<Self> {
WithMarginStyle::new(self, style)
}
#[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) -> AdaptEvents<Self>
where
F: Fn(&mut AdaptConfigCx, &mut Self) + 'static,
{
AdaptEvents::new(self).on_configure(f)
}
#[must_use]
fn on_update<F>(self, f: F) -> AdaptEvents<Self>
where
F: Fn(&mut AdaptConfigCx, &mut Self, &Self::Data) + 'static,
{
AdaptEvents::new(self).on_update(f)
}
#[must_use]
fn on_message<M, H>(self, handler: H) -> AdaptEvents<Self>
where
M: Debug + 'static,
H: Fn(&mut AdaptEventCx, &mut Self, M) + 'static,
{
AdaptEvents::new(self).on_message(handler)
}
fn map_message<M, N, H>(self, handler: H) -> AdaptEvents<Self>
where
M: Debug + 'static,
N: Debug + 'static,
H: Fn(usize, M) -> N + 'static,
{
AdaptEvents::new(self).map_message(handler)
}
#[must_use]
fn on_messages<H>(self, handler: H) -> AdaptEvents<Self>
where
H: Fn(&mut AdaptEventCx, &mut Self, &Self::Data) + 'static,
{
AdaptEvents::new(self).on_messages(handler)
}
#[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 |cx: &mut SizeCx, axis: AxisInfo| {
let size = size.extract(axis) * cx.scale_factor();
SizeRules::fixed(size.cast_ceil())
})
}
#[must_use]
fn with_min_size_em(self, w: f32, h: f32) -> Reserve<Self> {
let size = Vec2(w, h);
Reserve::new(self, move |cx: &mut SizeCx, axis: AxisInfo| {
let size = size.extract(axis) * cx.dpem(TextClass::Standard);
SizeRules::fixed(size.cast_ceil())
})
}
#[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)
}
#[must_use]
fn with_hidden_label<T: ToString>(self, label: T) -> WithHiddenLabel<Self> {
WithHiddenLabel::new(self, label)
}
#[inline]
#[must_use]
fn with_state<A>(self, state: Self::Data) -> Adapt<A, Self> {
Adapt::new(self, state)
}
}
impl<W: Widget> AdaptWidget for W {}