Skip to content
Snippets Groups Projects
input.rs 3.53 KiB
Newer Older
Louis's avatar
Louis committed
use bevy::prelude::*;
use kayak_ui::prelude::{widgets::*, *};

use crate::TodoList;

#[derive(Component, Default, Clone, PartialEq, Eq)]
pub struct TodoInputProps;

impl Widget for TodoInputProps {}

#[derive(Bundle)]
pub struct TodoInputBundle {
    pub widget: TodoInputProps,
    pub focusable: Focusable,
    pub styles: KStyle,
    pub computed_styles: ComputedStyles,
    pub widget_name: WidgetName,
}

impl Default for TodoInputBundle {
    fn default() -> Self {
        Self {
            widget: TodoInputProps,
            focusable: Default::default(),
            styles: KStyle::default(),
            computed_styles: ComputedStyles(KStyle {
                render_command: StyleProp::Value(RenderCommand::Layout),
                // height: StyleProp::Value(Units::Stretch(1.0)),
                height: StyleProp::Value(Units::Auto),
                width: StyleProp::Value(Units::Stretch(1.0)),
                bottom: StyleProp::Value(Units::Pixels(20.0)),
                ..KStyle::default()
            }),
            widget_name: TodoInputProps.get_name(),
        }
    }
}

pub fn render_todo_input(
    In(entity): In<Entity>,
    widget_context: Res<KayakWidgetContext>,
    mut commands: Commands,
    todo_list: Res<TodoList>,
) -> bool {
    let on_change = OnChange::new(
        move |In((_, value)): In<(Entity, String)>, mut todo_list: ResMut<TodoList>| {
            todo_list.new_item = value;
        },
    );

    let handle_click = OnEvent::new(
        move |In(_entity): In<Entity>, event: Res<KEvent>, mut todo_list: ResMut<TodoList>| {
            if let EventType::Click(..) = event.event_type {
                if !todo_list.new_item.is_empty() {
                    let value = todo_list.new_item.clone();
                    todo_list.items.push(value);
                    todo_list.new_item.clear();
                }
            }
        },
    );

    let parent_id = Some(entity);
    rsx! {
        <ElementBundle
            id={"element_bundle"}
            styles={KStyle {
                layout_type: StyleProp::Value(LayoutType::Row),
                height: StyleProp::Value(Units::Pixels(32.0)),
                cursor: StyleProp::Value(KCursorIcon(CursorIcon::Text)),
                ..Default::default()
            }}
        >
            {
                // You can spawn whatever you want on UI widgets this way! :)
                commands.entity(element_bundle).insert(Focusable);
            }
            <TextBoxBundle
                styles={KStyle {
                    // bottom: StyleProp::Value(Units::Stretch(1.0)),
                    // top: StyleProp::Value(Units::Stretch(1.0)),
                    ..Default::default()
                }}
                text_box={TextBoxProps {
                    value: todo_list.new_item.clone(),
                    placeholder: Some("Add item here..".into()),
                    ..Default::default()
                }}
                on_change={on_change}
            />
            <KButtonBundle
                styles={KStyle {
                    width: StyleProp::Value(Units::Pixels(32.0)),
                    height: StyleProp::Value(Units::Pixels(32.0)),
                    left: StyleProp::Value(Units::Pixels(5.0)),
                    ..Default::default()
                }}
                button={KButton {
                    text: "+".into(),
                }}
                on_event={handle_click}
            />
        </ElementBundle>
    };
    true
}