use ribir_core::prelude::*;
#[derive(Declare, Clone)]
pub struct Avatar;
class_names! {
AVATAR_LABEL_CONTAINER,
AVATAR_WIDGET_CONTAINER,
AVATAR_LABEL,
AVATAR_WIDGET,
}
#[derive(Template)]
pub enum AvatarChild<'c> {
Label(TextValue),
Widget(Widget<'c>),
}
impl<'c> ComposeChild<'c> for Avatar {
type Child = AvatarChild<'c>;
fn compose_child(_: impl StateWriter<Value = Self>, child: Self::Child) -> Widget<'c> {
container! {
class: child.container_class(),
clip_boundary: true,
size: Size::splat(40.),
@ { child.wrap_with_class() }
}
.into_widget()
}
}
impl<'w> AvatarChild<'w> {
fn wrap_with_class(self) -> Widget<'w> {
match self {
AvatarChild::Label(text) => text! { text, class: AVATAR_LABEL }.into_widget(),
AvatarChild::Widget(w) => class! {
class: Some(AVATAR_WIDGET),
box_fit: BoxFit::Contain,
@ { w }
}
.into_widget(),
}
}
fn container_class(&self) -> ClassName {
match self {
AvatarChild::Label(_) => AVATAR_LABEL_CONTAINER,
AvatarChild::Widget(_) => AVATAR_WIDGET_CONTAINER,
}
}
}
#[cfg(test)]
mod tests {
use ribir_core::test_helper::*;
use ribir_dev_helper::*;
use super::*;
widget_image_tests! {
label_avatar,
WidgetTester::new(avatar!{
x: AnchorX::center(),
y: AnchorY::center(),
@{"A"}
}).with_wnd_size(Size::splat(64.))
}
widget_image_tests! {
widget_avatar,
WidgetTester::new(avatar!{
x: AnchorX::center(),
y: AnchorY::center(),
@MockBox { size: Size::splat(100.), background: Color::RED }
}).with_wnd_size(Size::splat(64.))
}
}