Skip to main content

bevy_feathers/controls/
checkbox.rs

1use bevy_app::{Plugin, PreUpdate};
2use bevy_camera::visibility::Visibility;
3use bevy_ecs::{
4    bundle::Bundle,
5    children,
6    component::Component,
7    entity::Entity,
8    hierarchy::{ChildOf, Children},
9    lifecycle::RemovedComponents,
10    query::{Added, Changed, Has, Or, With},
11    reflect::ReflectComponent,
12    schedule::IntoScheduleConfigs,
13    spawn::{Spawn, SpawnRelated, SpawnableList},
14    system::{Commands, Query},
15    template::FromTemplate,
16};
17use bevy_input_focus::tab_navigation::TabIndex;
18use bevy_math::Rot2;
19use bevy_picking::{hover::Hovered, PickingSystems};
20use bevy_reflect::{prelude::ReflectDefault, Reflect};
21use bevy_scene::prelude::*;
22use bevy_text::FontWeight;
23use bevy_ui::{
24    px, AlignItems, BorderRadius, Checked, Display, FlexDirection, InteractionDisabled,
25    JustifyContent, Node, PositionType, Pressed, UiRect, UiTransform,
26};
27use bevy_ui_widgets::{ActivateOnPress, Checkbox};
28
29use crate::{
30    constants::{fonts, size},
31    cursor::EntityCursor,
32    focus::FocusIndicator,
33    font_styles::InheritableFont,
34    theme::{InheritableThemeTextColor, ThemeBackgroundColor, ThemeBorderColor},
35    tokens,
36};
37
38/// A checkbox widget.
39///
40/// This is spawnable by inheriting it as a "scene component" with optional [`FeathersCheckboxProps`].
41///
42/// # Emitted events
43/// * [`bevy_ui_widgets::ValueChange<bool>`] with the new value when the checkbox changes state.
44///
45///  These events can be disabled by adding an [`bevy_ui::InteractionDisabled`] component to the entity
46#[derive(impl bevy_scene::SceneComponent for FeathersCheckbox where
    Self: ::core::marker::Send + ::core::marker::Sync + 'static {
    type Props = FeathersCheckboxProps;
    fn scene(props: Self::Props) -> impl bevy_scene::Scene {
        (Self::scene(props),
            <bevy_scene::InitTemplate<<FeathersCheckbox as
                    bevy_ecs::template::FromTemplate>::Template> as
                    ::core::default::Default>::default(),
            bevy_scene::template_value(bevy_scene::SceneComponentInfo::new::<FeathersCheckbox>(true)))
    }
}SceneComponent, impl ::core::default::Default for FeathersCheckboxTemplate {
    fn default() -> Self { Self }
}FromTemplate)]
47#[scene(FeathersCheckboxProps)]
48#[derive(const _: () =
    {
        impl bevy_reflect::GetTypeRegistration for FeathersCheckbox where  {
            fn get_type_registration() -> bevy_reflect::TypeRegistration {
                let mut registration =
                    bevy_reflect::TypeRegistration::of::<Self>();
                registration.insert::<bevy_reflect::ReflectFromPtr>(bevy_reflect::FromType::<Self>::from_type());
                registration.insert::<bevy_reflect::ReflectFromReflect>(bevy_reflect::FromType::<Self>::from_type());
                registration.register_type_data::<ReflectComponent, Self>();
                registration
            }
            #[inline(never)]
            fn register_type_dependencies(registry:
                    &mut bevy_reflect::TypeRegistry) {}
        }
        impl bevy_reflect::Typed for FeathersCheckbox where  {
            #[inline]
            fn type_info() -> &'static bevy_reflect::TypeInfo {
                static CELL: bevy_reflect::utility::NonGenericTypeInfoCell =
                    bevy_reflect::utility::NonGenericTypeInfoCell::new();
                CELL.get_or_set(||
                        {
                            bevy_reflect::TypeInfo::Struct(bevy_reflect::structs::StructInfo::new::<Self>(&[]))
                        })
            }
        }
        #[allow(deprecated, reason =
        "derives on a deprecated type shouldn't be considered a usage")]
        impl bevy_reflect::TypePath for FeathersCheckbox where  {
            fn type_path() -> &'static str {
                "bevy_feathers::controls::checkbox::FeathersCheckbox"
            }
            fn short_type_path() -> &'static str { "FeathersCheckbox" }
            fn type_ident() -> ::core::option::Option<&'static str> {
                ::core::option::Option::Some("FeathersCheckbox")
            }
            fn crate_name() -> ::core::option::Option<&'static str> {
                ::core::option::Option::Some("bevy_feathers::controls::checkbox".split(':').next().unwrap())
            }
            fn module_path() -> ::core::option::Option<&'static str> {
                ::core::option::Option::Some("bevy_feathers::controls::checkbox")
            }
        }
        impl bevy_reflect::Reflect for FeathersCheckbox where  {
            #[inline]
            fn into_any(self:
                    bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
                ->
                    bevy_reflect::__macro_exports::alloc_utils::Box<dyn ::core::any::Any> {
                self
            }
            #[inline]
            fn as_any(&self) -> &dyn ::core::any::Any { self }
            #[inline]
            fn as_any_mut(&mut self) -> &mut dyn ::core::any::Any { self }
            #[inline]
            fn into_reflect(self:
                    bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
                ->
                    bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect> {
                self
            }
            #[inline]
            fn as_reflect(&self) -> &dyn bevy_reflect::Reflect { self }
            #[inline]
            fn as_reflect_mut(&mut self) -> &mut dyn bevy_reflect::Reflect {
                self
            }
            #[inline]
            fn set(&mut self,
                value:
                    bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect>)
                ->
                    ::core::result::Result<(),
                    bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect>> {
                *self = <dyn bevy_reflect::Reflect>::take(value)?;
                ::core::result::Result::Ok(())
            }
        }
        #[allow(non_upper_case_globals)]
        const _: () =
            {
                static __INVENTORY: ::inventory::Node =
                    ::inventory::Node {
                        value: &{
                                bevy_reflect::__macro_exports::auto_register::AutomaticReflectRegistrations(<FeathersCheckbox
                                        as
                                        bevy_reflect::__macro_exports::auto_register::RegisterForReflection>::__register)
                            },
                        next: ::inventory::__private::UnsafeCell::new(::inventory::__private::Option::None),
                    };
                #[link_section = ".text.startup"]
                unsafe extern "C" fn __ctor() {
                    unsafe {
                        ::inventory::ErasedNode::submit(__INVENTORY.value,
                            &__INVENTORY)
                    }
                }
                #[used]
                #[link_section = ".init_array"]
                static __CTOR: unsafe extern "C" fn() = __ctor;
            };
        impl bevy_reflect::structs::Struct for FeathersCheckbox where  {
            fn field(&self, name: &str)
                -> ::core::option::Option<&dyn bevy_reflect::PartialReflect> {
                match name { _ => ::core::option::Option::None, }
            }
            fn field_mut(&mut self, name: &str)
                ->
                    ::core::option::Option<&mut dyn bevy_reflect::PartialReflect> {
                match name { _ => ::core::option::Option::None, }
            }
            fn field_at(&self, index: usize)
                -> ::core::option::Option<&dyn bevy_reflect::PartialReflect> {
                match index { _ => ::core::option::Option::None, }
            }
            fn field_at_mut(&mut self, index: usize)
                ->
                    ::core::option::Option<&mut dyn bevy_reflect::PartialReflect> {
                match index { _ => ::core::option::Option::None, }
            }
            fn name_at(&self, index: usize) -> ::core::option::Option<&str> {
                match index { _ => ::core::option::Option::None, }
            }
            fn index_of_name(&self, name: &str)
                -> ::core::option::Option<usize> {
                match name { _ => ::core::option::Option::None, }
            }
            fn field_len(&self) -> usize { 0usize }
            fn iter_fields(&self) -> bevy_reflect::structs::FieldIter {
                bevy_reflect::structs::FieldIter::new(self)
            }
            fn to_dynamic_struct(&self)
                -> bevy_reflect::structs::DynamicStruct {
                let mut dynamic: bevy_reflect::structs::DynamicStruct =
                    ::core::default::Default::default();
                dynamic.set_represented_type(bevy_reflect::PartialReflect::get_represented_type_info(self));
                dynamic
            }
        }
        impl bevy_reflect::PartialReflect for FeathersCheckbox where  {
            #[inline]
            fn get_represented_type_info(&self)
                -> ::core::option::Option<&'static bevy_reflect::TypeInfo> {
                ::core::option::Option::Some(<Self as
                            bevy_reflect::Typed>::type_info())
            }
            #[inline]
            fn try_apply(&mut self, value: &dyn bevy_reflect::PartialReflect)
                -> ::core::result::Result<(), bevy_reflect::ApplyError> {
                if let bevy_reflect::ReflectRef::Struct(struct_value) =
                        bevy_reflect::PartialReflect::reflect_ref(value) {
                    for (name, value) in
                        bevy_reflect::structs::Struct::iter_fields(struct_value) {
                        if let ::core::option::Option::Some(v) =
                                bevy_reflect::structs::Struct::field_mut(self, name) {
                            bevy_reflect::PartialReflect::try_apply(v, value)?;
                        }
                    }
                } else {
                    return ::core::result::Result::Err(bevy_reflect::ApplyError::MismatchedKinds {
                                from_kind: bevy_reflect::PartialReflect::reflect_kind(value),
                                to_kind: bevy_reflect::ReflectKind::Struct,
                            });
                }
                ::core::result::Result::Ok(())
            }
            #[inline]
            fn reflect_kind(&self) -> bevy_reflect::ReflectKind {
                bevy_reflect::ReflectKind::Struct
            }
            #[inline]
            fn reflect_ref(&self) -> bevy_reflect::ReflectRef {
                bevy_reflect::ReflectRef::Struct(self)
            }
            #[inline]
            fn reflect_mut(&mut self) -> bevy_reflect::ReflectMut {
                bevy_reflect::ReflectMut::Struct(self)
            }
            #[inline]
            fn reflect_owned(self:
                    bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
                -> bevy_reflect::ReflectOwned {
                bevy_reflect::ReflectOwned::Struct(self)
            }
            #[inline]
            fn try_into_reflect(self:
                    bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
                ->
                    ::core::result::Result<bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect>,
                    bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::PartialReflect>> {
                ::core::result::Result::Ok(self)
            }
            #[inline]
            fn try_as_reflect(&self)
                -> ::core::option::Option<&dyn bevy_reflect::Reflect> {
                ::core::option::Option::Some(self)
            }
            #[inline]
            fn try_as_reflect_mut(&mut self)
                -> ::core::option::Option<&mut dyn bevy_reflect::Reflect> {
                ::core::option::Option::Some(self)
            }
            #[inline]
            fn into_partial_reflect(self:
                    bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
                ->
                    bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::PartialReflect> {
                self
            }
            #[inline]
            fn as_partial_reflect(&self)
                -> &dyn bevy_reflect::PartialReflect {
                self
            }
            #[inline]
            fn as_partial_reflect_mut(&mut self)
                -> &mut dyn bevy_reflect::PartialReflect {
                self
            }
            fn reflect_partial_eq(&self,
                value: &dyn bevy_reflect::PartialReflect)
                -> ::core::option::Option<bool> {
                (bevy_reflect::structs::struct_partial_eq)(self, value)
            }
            fn reflect_partial_cmp(&self,
                value: &dyn bevy_reflect::PartialReflect)
                -> ::core::option::Option<::core::cmp::Ordering> {
                (bevy_reflect::structs::struct_partial_cmp)(self, value)
            }
            #[inline]
            #[allow(unreachable_code, reason =
            "Ignored fields without a `clone` attribute will early-return with an error")]
            fn reflect_clone(&self)
                ->
                    ::core::result::Result<bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect>,
                    bevy_reflect::ReflectCloneError> {
                ::core::result::Result::Ok(bevy_reflect::__macro_exports::alloc_utils::Box::new(Self {}))
            }
        }
        impl bevy_reflect::FromReflect for FeathersCheckbox where  {
            fn from_reflect(reflect: &dyn bevy_reflect::PartialReflect)
                -> ::core::option::Option<Self> {
                if let bevy_reflect::ReflectRef::Struct(__ref_struct) =
                        bevy_reflect::PartialReflect::reflect_ref(reflect) {
                    let __this = Self {};
                    ::core::option::Option::Some(__this)
                } else { ::core::option::Option::None }
            }
        }
    };Reflect)]
49#[reflect(Component)]
50pub struct FeathersCheckbox;
51
52/// Props used to construct a [`FeathersCheckbox`] scene.
53pub struct FeathersCheckboxProps {
54    /// Label for this checkbox. This can contain multiple entities, which will be contained
55    /// in a flexbox.
56    pub caption: Box<dyn SceneList>,
57}
58
59impl Default for FeathersCheckboxProps {
60    fn default() -> Self {
61        Self {
62            caption: Box::new({ let _res = bevy_scene::SceneListScope(()); _res }bsn_list!()),
63        }
64    }
65}
66
67impl FeathersCheckbox {
68    fn scene(props: FeathersCheckboxProps) -> impl Scene {
69        bevy_scene::SceneScope({
        let _expr0 = { px(4) }.into();
        let _expr1 = { tokens::CHECKBOX_TEXT }.into();
        let _expr2 = { fonts::REGULAR }.into();
        let _expr3 = { size::MEDIUM_FONT }.into();
        let _expr4 = { FontWeight::NORMAL }.into();
        let _expr5 = { size::CHECKBOX_SIZE }.into();
        let _expr6 = { size::CHECKBOX_SIZE }.into();
        let _expr7 = { px(2) }.into();
        let _expr8 = { px(4) }.into();
        let _expr9 = { tokens::CHECKBOX_BG }.into();
        let _expr10 = { tokens::CHECKBOX_BORDER }.into();
        let _expr11 = { px(4) }.into();
        let _expr12 = { px(0) }.into();
        let _expr13 = { px(6) }.into();
        let _expr14 = { px(11) }.into();
        let _expr15 = { px(2) }.into();
        let _expr16 = { px(2) }.into();
        let _expr17 = { tokens::CHECKBOX_MARK }.into();
        let _res =
            (bevy_scene::SceneFunction(move |_context, _scene|
                        {
                            let __value =
                                _scene.get_or_insert_template::<<Node as
                                    bevy_ecs::template::FromTemplate>::Template>(_context);
                            __value.display = (Display::Flex {}).into();
                            __value.flex_direction = (FlexDirection::Row {}).into();
                            __value.justify_content = (JustifyContent::Start {}).into();
                            __value.align_items = (AlignItems::Center {}).into();
                            __value.column_gap = _expr0;
                            let _ =
                                _scene.get_or_insert_template::<<Checkbox as
                                    bevy_ecs::template::FromTemplate>::Template>(_context);
                            let _ =
                                _scene.get_or_insert_template::<<CheckboxFrame as
                                    bevy_ecs::template::FromTemplate>::Template>(_context);
                            let _ =
                                _scene.get_or_insert_template::<<Hovered as
                                    bevy_ecs::template::FromTemplate>::Template>(_context);
                            let __value =
                                _scene.get_or_insert_template::<<EntityCursor as
                                    bevy_ecs::template::FromTemplate>::Template>(_context);
                            {
                                let _node = __value;
                                if !#[allow(non_exhaustive_omitted_patterns)] match _node {
                                            bevy_scene::macro_utils::PathResolveHelper::<<EntityCursor
                                                as bevy_ecs::template::FromTemplate>::Template>::System(..)
                                                => true,
                                            _ => false,
                                        } {
                                    *_node =
                                        bevy_scene::macro_utils::PathResolveHelper::<<EntityCursor
                                                as
                                                bevy_ecs::template::FromTemplate>::Template>::default_system();
                                }
                                if let bevy_scene::macro_utils::PathResolveHelper::<<EntityCursor
                                        as
                                        bevy_ecs::template::FromTemplate>::Template>::System(t0, ..)
                                        = _node {
                                    *t0 = (bevy_window::SystemCursorIcon::Pointer {}).into();
                                }
                            }
                            let __value =
                                _scene.get_or_insert_template::<<TabIndex as
                                    bevy_ecs::template::FromTemplate>::Template>(_context);
                            __value.0 = 0;
                            let __value =
                                _scene.get_or_insert_template::<<InheritableThemeTextColor
                                    as bevy_ecs::template::FromTemplate>::Template>(_context);
                            __value.0 = _expr1;
                            let __value =
                                _scene.get_or_insert_template::<<InheritableFont as
                                    bevy_ecs::template::FromTemplate>::Template>(_context);
                            __value.font = _expr2;
                            __value.font_size = _expr3;
                            __value.weight = _expr4;
                        }),
                bevy_scene::RelatedScenes::<<Children as
                        bevy_ecs::relationship::RelationshipTarget>::Relationship,
                        _>::new((bevy_scene::EntityScene((bevy_scene::SceneFunction(move
                                        |_context, _scene|
                                        {
                                            let __value =
                                                _scene.get_or_insert_template::<<Node as
                                                    bevy_ecs::template::FromTemplate>::Template>(_context);
                                            __value.width = _expr5;
                                            __value.height = _expr6;
                                            __value.border = _expr7;
                                            __value.border_radius = _expr8;
                                            let _ =
                                                _scene.get_or_insert_template::<<CheckboxOutline as
                                                    bevy_ecs::template::FromTemplate>::Template>(_context);
                                            let __value =
                                                _scene.get_or_insert_template::<<ThemeBackgroundColor as
                                                    bevy_ecs::template::FromTemplate>::Template>(_context);
                                            __value.0 = _expr9;
                                            let __value =
                                                _scene.get_or_insert_template::<<ThemeBorderColor as
                                                    bevy_ecs::template::FromTemplate>::Template>(_context);
                                            __value.0 = _expr10;
                                            let _ =
                                                _scene.get_or_insert_template::<<FocusIndicator as
                                                    bevy_ecs::template::FromTemplate>::Template>(_context);
                                        }),
                                bevy_scene::RelatedScenes::<<Children as
                                        bevy_ecs::relationship::RelationshipTarget>::Relationship,
                                        _>::new(bevy_scene::EntityScene(bevy_scene::SceneFunction(move
                                                |_context, _scene|
                                                {
                                                    let __value =
                                                        _scene.get_or_insert_template::<<Node as
                                                            bevy_ecs::template::FromTemplate>::Template>(_context);
                                                    __value.position_type = (PositionType::Absolute {}).into();
                                                    __value.left = _expr11;
                                                    __value.top = _expr12;
                                                    __value.width = _expr13;
                                                    __value.height = _expr14;
                                                    bevy_scene::macro_utils::touch_type::<UiRect>();
                                                    __value.border.bottom = _expr15;
                                                    __value.border.right = _expr16;
                                                    let __value =
                                                        _scene.get_or_insert_template::<<UiTransform as
                                                            bevy_ecs::template::FromTemplate>::Template>(_context);
                                                    *__value =
                                                        <UiTransform as
                                                                bevy_ecs::template::FromTemplate>::Template::from_rotation(Rot2::FRAC_PI_4);
                                                    let _ =
                                                        _scene.get_or_insert_template::<<CheckboxMark as
                                                            bevy_ecs::template::FromTemplate>::Template>(_context);
                                                    let __value =
                                                        _scene.get_or_insert_template::<<ThemeBorderColor as
                                                            bevy_ecs::template::FromTemplate>::Template>(_context);
                                                    __value.0 = _expr17;
                                                }))))), props.caption)));
        _res
    });bsn! {
70            Node {
71                display: Display::Flex,
72                flex_direction: FlexDirection::Row,
73                justify_content: JustifyContent::Start,
74                align_items: AlignItems::Center,
75                column_gap: px(4),
76            }
77            Checkbox
78            CheckboxFrame
79            Hovered
80            EntityCursor::System(bevy_window::SystemCursorIcon::Pointer)
81            TabIndex(0)
82            InheritableThemeTextColor(tokens::CHECKBOX_TEXT)
83            InheritableFont {
84                font: fonts::REGULAR,
85                font_size: size::MEDIUM_FONT,
86                weight: FontWeight::NORMAL,
87            }
88            Children [(
89                Node {
90                    width: size::CHECKBOX_SIZE,
91                    height: size::CHECKBOX_SIZE,
92                    border: px(2),
93                    border_radius: px(4),
94                }
95                CheckboxOutline
96                ThemeBackgroundColor(tokens::CHECKBOX_BG)
97                ThemeBorderColor(tokens::CHECKBOX_BORDER)
98                FocusIndicator
99                Children [(
100                    // Cheesy checkmark: rotated node with L-shaped border.
101                    Node {
102                        position_type: PositionType::Absolute,
103                        left: px(4),
104                        top: px(0),
105                        width: px(6),
106                        height: px(11),
107                        border: UiRect {
108                            bottom: px(2),
109                            right: px(2),
110                        },
111                    }
112                    UiTransform::from_rotation(Rot2::FRAC_PI_4)
113                    CheckboxMark
114                    ThemeBorderColor(tokens::CHECKBOX_MARK)
115                )]),
116                {props.caption}
117            ]
118        }
119    }
120}
121
122/// Marker for the checkbox frame (contains both checkbox and label)
123#[derive(impl bevy_ecs::component::Component for CheckboxFrame where
    Self: ::core::marker::Send + ::core::marker::Sync + 'static {
    const STORAGE_TYPE: bevy_ecs::component::StorageType =
        bevy_ecs::component::StorageType::Table;
    type Mutability = bevy_ecs::component::Mutable;
    fn register_required_components(_requiree:
            bevy_ecs::component::ComponentId,
        required_components:
            &mut bevy_ecs::component::RequiredComponentsRegistrator) {}
    fn clone_behavior() -> bevy_ecs::component::ComponentCloneBehavior {
        use bevy_ecs::component::{
            DefaultCloneBehaviorBase, DefaultCloneBehaviorViaClone,
        };
        (&&&bevy_ecs::component::DefaultCloneBehaviorSpecialization::<Self>::default()).default_clone_behavior()
    }
    fn relationship_accessor()
        ->
            ::core::option::Option<bevy_ecs::relationship::ComponentRelationshipAccessor<Self>> {
        ::core::option::Option::None
    }
}Component, #[automatically_derived]
impl ::core::default::Default for CheckboxFrame {
    #[inline]
    fn default() -> CheckboxFrame { CheckboxFrame {} }
}Default, #[automatically_derived]
impl ::core::clone::Clone for CheckboxFrame {
    #[inline]
    fn clone(&self) -> CheckboxFrame { CheckboxFrame }
}Clone, const _: () =
    {
        impl bevy_reflect::GetTypeRegistration for CheckboxFrame where  {
            fn get_type_registration() -> bevy_reflect::TypeRegistration {
                let mut registration =
                    bevy_reflect::TypeRegistration::of::<Self>();
                registration.insert::<bevy_reflect::ReflectFromPtr>(bevy_reflect::FromType::<Self>::from_type());
                registration.insert::<bevy_reflect::ReflectFromReflect>(bevy_reflect::FromType::<Self>::from_type());
                registration.register_type_data::<ReflectComponent, Self>();
                registration.register_type_data::<ReflectDefault, Self>();
                registration
            }
            #[inline(never)]
            fn register_type_dependencies(registry:
                    &mut bevy_reflect::TypeRegistry) {}
        }
        impl bevy_reflect::Typed for CheckboxFrame where  {
            #[inline]
            fn type_info() -> &'static bevy_reflect::TypeInfo {
                static CELL: bevy_reflect::utility::NonGenericTypeInfoCell =
                    bevy_reflect::utility::NonGenericTypeInfoCell::new();
                CELL.get_or_set(||
                        {
                            bevy_reflect::TypeInfo::Struct(bevy_reflect::structs::StructInfo::new::<Self>(&[]))
                        })
            }
        }
        #[allow(deprecated, reason =
        "derives on a deprecated type shouldn't be considered a usage")]
        impl bevy_reflect::TypePath for CheckboxFrame where  {
            fn type_path() -> &'static str {
                "bevy_feathers::controls::checkbox::CheckboxFrame"
            }
            fn short_type_path() -> &'static str { "CheckboxFrame" }
            fn type_ident() -> ::core::option::Option<&'static str> {
                ::core::option::Option::Some("CheckboxFrame")
            }
            fn crate_name() -> ::core::option::Option<&'static str> {
                ::core::option::Option::Some("bevy_feathers::controls::checkbox".split(':').next().unwrap())
            }
            fn module_path() -> ::core::option::Option<&'static str> {
                ::core::option::Option::Some("bevy_feathers::controls::checkbox")
            }
        }
        impl bevy_reflect::Reflect for CheckboxFrame where  {
            #[inline]
            fn into_any(self:
                    bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
                ->
                    bevy_reflect::__macro_exports::alloc_utils::Box<dyn ::core::any::Any> {
                self
            }
            #[inline]
            fn as_any(&self) -> &dyn ::core::any::Any { self }
            #[inline]
            fn as_any_mut(&mut self) -> &mut dyn ::core::any::Any { self }
            #[inline]
            fn into_reflect(self:
                    bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
                ->
                    bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect> {
                self
            }
            #[inline]
            fn as_reflect(&self) -> &dyn bevy_reflect::Reflect { self }
            #[inline]
            fn as_reflect_mut(&mut self) -> &mut dyn bevy_reflect::Reflect {
                self
            }
            #[inline]
            fn set(&mut self,
                value:
                    bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect>)
                ->
                    ::core::result::Result<(),
                    bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect>> {
                *self = <dyn bevy_reflect::Reflect>::take(value)?;
                ::core::result::Result::Ok(())
            }
        }
        #[allow(non_upper_case_globals)]
        const _: () =
            {
                static __INVENTORY: ::inventory::Node =
                    ::inventory::Node {
                        value: &{
                                bevy_reflect::__macro_exports::auto_register::AutomaticReflectRegistrations(<CheckboxFrame
                                        as
                                        bevy_reflect::__macro_exports::auto_register::RegisterForReflection>::__register)
                            },
                        next: ::inventory::__private::UnsafeCell::new(::inventory::__private::Option::None),
                    };
                #[link_section = ".text.startup"]
                unsafe extern "C" fn __ctor() {
                    unsafe {
                        ::inventory::ErasedNode::submit(__INVENTORY.value,
                            &__INVENTORY)
                    }
                }
                #[used]
                #[link_section = ".init_array"]
                static __CTOR: unsafe extern "C" fn() = __ctor;
            };
        impl bevy_reflect::structs::Struct for CheckboxFrame where  {
            fn field(&self, name: &str)
                -> ::core::option::Option<&dyn bevy_reflect::PartialReflect> {
                match name { _ => ::core::option::Option::None, }
            }
            fn field_mut(&mut self, name: &str)
                ->
                    ::core::option::Option<&mut dyn bevy_reflect::PartialReflect> {
                match name { _ => ::core::option::Option::None, }
            }
            fn field_at(&self, index: usize)
                -> ::core::option::Option<&dyn bevy_reflect::PartialReflect> {
                match index { _ => ::core::option::Option::None, }
            }
            fn field_at_mut(&mut self, index: usize)
                ->
                    ::core::option::Option<&mut dyn bevy_reflect::PartialReflect> {
                match index { _ => ::core::option::Option::None, }
            }
            fn name_at(&self, index: usize) -> ::core::option::Option<&str> {
                match index { _ => ::core::option::Option::None, }
            }
            fn index_of_name(&self, name: &str)
                -> ::core::option::Option<usize> {
                match name { _ => ::core::option::Option::None, }
            }
            fn field_len(&self) -> usize { 0usize }
            fn iter_fields(&self) -> bevy_reflect::structs::FieldIter {
                bevy_reflect::structs::FieldIter::new(self)
            }
            fn to_dynamic_struct(&self)
                -> bevy_reflect::structs::DynamicStruct {
                let mut dynamic: bevy_reflect::structs::DynamicStruct =
                    ::core::default::Default::default();
                dynamic.set_represented_type(bevy_reflect::PartialReflect::get_represented_type_info(self));
                dynamic
            }
        }
        impl bevy_reflect::PartialReflect for CheckboxFrame where  {
            #[inline]
            fn get_represented_type_info(&self)
                -> ::core::option::Option<&'static bevy_reflect::TypeInfo> {
                ::core::option::Option::Some(<Self as
                            bevy_reflect::Typed>::type_info())
            }
            #[inline]
            fn try_apply(&mut self, value: &dyn bevy_reflect::PartialReflect)
                -> ::core::result::Result<(), bevy_reflect::ApplyError> {
                if let bevy_reflect::ReflectRef::Struct(struct_value) =
                        bevy_reflect::PartialReflect::reflect_ref(value) {
                    for (name, value) in
                        bevy_reflect::structs::Struct::iter_fields(struct_value) {
                        if let ::core::option::Option::Some(v) =
                                bevy_reflect::structs::Struct::field_mut(self, name) {
                            bevy_reflect::PartialReflect::try_apply(v, value)?;
                        }
                    }
                } else {
                    return ::core::result::Result::Err(bevy_reflect::ApplyError::MismatchedKinds {
                                from_kind: bevy_reflect::PartialReflect::reflect_kind(value),
                                to_kind: bevy_reflect::ReflectKind::Struct,
                            });
                }
                ::core::result::Result::Ok(())
            }
            #[inline]
            fn reflect_kind(&self) -> bevy_reflect::ReflectKind {
                bevy_reflect::ReflectKind::Struct
            }
            #[inline]
            fn reflect_ref(&self) -> bevy_reflect::ReflectRef {
                bevy_reflect::ReflectRef::Struct(self)
            }
            #[inline]
            fn reflect_mut(&mut self) -> bevy_reflect::ReflectMut {
                bevy_reflect::ReflectMut::Struct(self)
            }
            #[inline]
            fn reflect_owned(self:
                    bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
                -> bevy_reflect::ReflectOwned {
                bevy_reflect::ReflectOwned::Struct(self)
            }
            #[inline]
            fn try_into_reflect(self:
                    bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
                ->
                    ::core::result::Result<bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect>,
                    bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::PartialReflect>> {
                ::core::result::Result::Ok(self)
            }
            #[inline]
            fn try_as_reflect(&self)
                -> ::core::option::Option<&dyn bevy_reflect::Reflect> {
                ::core::option::Option::Some(self)
            }
            #[inline]
            fn try_as_reflect_mut(&mut self)
                -> ::core::option::Option<&mut dyn bevy_reflect::Reflect> {
                ::core::option::Option::Some(self)
            }
            #[inline]
            fn into_partial_reflect(self:
                    bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
                ->
                    bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::PartialReflect> {
                self
            }
            #[inline]
            fn as_partial_reflect(&self)
                -> &dyn bevy_reflect::PartialReflect {
                self
            }
            #[inline]
            fn as_partial_reflect_mut(&mut self)
                -> &mut dyn bevy_reflect::PartialReflect {
                self
            }
            fn reflect_partial_eq(&self,
                value: &dyn bevy_reflect::PartialReflect)
                -> ::core::option::Option<bool> {
                (bevy_reflect::structs::struct_partial_eq)(self, value)
            }
            fn reflect_partial_cmp(&self,
                value: &dyn bevy_reflect::PartialReflect)
                -> ::core::option::Option<::core::cmp::Ordering> {
                (bevy_reflect::structs::struct_partial_cmp)(self, value)
            }
            #[inline]
            fn reflect_clone(&self)
                ->
                    ::core::result::Result<bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect>,
                    bevy_reflect::ReflectCloneError> {
                ::core::result::Result::Ok(bevy_reflect::__macro_exports::alloc_utils::Box::new(::core::clone::Clone::clone(self)))
            }
        }
        impl bevy_reflect::FromReflect for CheckboxFrame where  {
            fn from_reflect(reflect: &dyn bevy_reflect::PartialReflect)
                -> ::core::option::Option<Self> {
                if let bevy_reflect::ReflectRef::Struct(__ref_struct) =
                        bevy_reflect::PartialReflect::reflect_ref(reflect) {
                    let mut __this =
                        <Self as ::core::default::Default>::default();
                    ::core::option::Option::Some(__this)
                } else { ::core::option::Option::None }
            }
        }
    };Reflect)]
124#[reflect(Component, Clone, Default)]
125struct CheckboxFrame;
126
127/// Marker for the checkbox outline
128#[derive(impl bevy_ecs::component::Component for CheckboxOutline where
    Self: ::core::marker::Send + ::core::marker::Sync + 'static {
    const STORAGE_TYPE: bevy_ecs::component::StorageType =
        bevy_ecs::component::StorageType::Table;
    type Mutability = bevy_ecs::component::Mutable;
    fn register_required_components(_requiree:
            bevy_ecs::component::ComponentId,
        required_components:
            &mut bevy_ecs::component::RequiredComponentsRegistrator) {}
    fn clone_behavior() -> bevy_ecs::component::ComponentCloneBehavior {
        use bevy_ecs::component::{
            DefaultCloneBehaviorBase, DefaultCloneBehaviorViaClone,
        };
        (&&&bevy_ecs::component::DefaultCloneBehaviorSpecialization::<Self>::default()).default_clone_behavior()
    }
    fn relationship_accessor()
        ->
            ::core::option::Option<bevy_ecs::relationship::ComponentRelationshipAccessor<Self>> {
        ::core::option::Option::None
    }
}Component, #[automatically_derived]
impl ::core::default::Default for CheckboxOutline {
    #[inline]
    fn default() -> CheckboxOutline { CheckboxOutline {} }
}Default, #[automatically_derived]
impl ::core::clone::Clone for CheckboxOutline {
    #[inline]
    fn clone(&self) -> CheckboxOutline { CheckboxOutline }
}Clone, const _: () =
    {
        impl bevy_reflect::GetTypeRegistration for CheckboxOutline where  {
            fn get_type_registration() -> bevy_reflect::TypeRegistration {
                let mut registration =
                    bevy_reflect::TypeRegistration::of::<Self>();
                registration.insert::<bevy_reflect::ReflectFromPtr>(bevy_reflect::FromType::<Self>::from_type());
                registration.insert::<bevy_reflect::ReflectFromReflect>(bevy_reflect::FromType::<Self>::from_type());
                registration.register_type_data::<ReflectComponent, Self>();
                registration.register_type_data::<ReflectDefault, Self>();
                registration
            }
            #[inline(never)]
            fn register_type_dependencies(registry:
                    &mut bevy_reflect::TypeRegistry) {}
        }
        impl bevy_reflect::Typed for CheckboxOutline where  {
            #[inline]
            fn type_info() -> &'static bevy_reflect::TypeInfo {
                static CELL: bevy_reflect::utility::NonGenericTypeInfoCell =
                    bevy_reflect::utility::NonGenericTypeInfoCell::new();
                CELL.get_or_set(||
                        {
                            bevy_reflect::TypeInfo::Struct(bevy_reflect::structs::StructInfo::new::<Self>(&[]))
                        })
            }
        }
        #[allow(deprecated, reason =
        "derives on a deprecated type shouldn't be considered a usage")]
        impl bevy_reflect::TypePath for CheckboxOutline where  {
            fn type_path() -> &'static str {
                "bevy_feathers::controls::checkbox::CheckboxOutline"
            }
            fn short_type_path() -> &'static str { "CheckboxOutline" }
            fn type_ident() -> ::core::option::Option<&'static str> {
                ::core::option::Option::Some("CheckboxOutline")
            }
            fn crate_name() -> ::core::option::Option<&'static str> {
                ::core::option::Option::Some("bevy_feathers::controls::checkbox".split(':').next().unwrap())
            }
            fn module_path() -> ::core::option::Option<&'static str> {
                ::core::option::Option::Some("bevy_feathers::controls::checkbox")
            }
        }
        impl bevy_reflect::Reflect for CheckboxOutline where  {
            #[inline]
            fn into_any(self:
                    bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
                ->
                    bevy_reflect::__macro_exports::alloc_utils::Box<dyn ::core::any::Any> {
                self
            }
            #[inline]
            fn as_any(&self) -> &dyn ::core::any::Any { self }
            #[inline]
            fn as_any_mut(&mut self) -> &mut dyn ::core::any::Any { self }
            #[inline]
            fn into_reflect(self:
                    bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
                ->
                    bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect> {
                self
            }
            #[inline]
            fn as_reflect(&self) -> &dyn bevy_reflect::Reflect { self }
            #[inline]
            fn as_reflect_mut(&mut self) -> &mut dyn bevy_reflect::Reflect {
                self
            }
            #[inline]
            fn set(&mut self,
                value:
                    bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect>)
                ->
                    ::core::result::Result<(),
                    bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect>> {
                *self = <dyn bevy_reflect::Reflect>::take(value)?;
                ::core::result::Result::Ok(())
            }
        }
        #[allow(non_upper_case_globals)]
        const _: () =
            {
                static __INVENTORY: ::inventory::Node =
                    ::inventory::Node {
                        value: &{
                                bevy_reflect::__macro_exports::auto_register::AutomaticReflectRegistrations(<CheckboxOutline
                                        as
                                        bevy_reflect::__macro_exports::auto_register::RegisterForReflection>::__register)
                            },
                        next: ::inventory::__private::UnsafeCell::new(::inventory::__private::Option::None),
                    };
                #[link_section = ".text.startup"]
                unsafe extern "C" fn __ctor() {
                    unsafe {
                        ::inventory::ErasedNode::submit(__INVENTORY.value,
                            &__INVENTORY)
                    }
                }
                #[used]
                #[link_section = ".init_array"]
                static __CTOR: unsafe extern "C" fn() = __ctor;
            };
        impl bevy_reflect::structs::Struct for CheckboxOutline where  {
            fn field(&self, name: &str)
                -> ::core::option::Option<&dyn bevy_reflect::PartialReflect> {
                match name { _ => ::core::option::Option::None, }
            }
            fn field_mut(&mut self, name: &str)
                ->
                    ::core::option::Option<&mut dyn bevy_reflect::PartialReflect> {
                match name { _ => ::core::option::Option::None, }
            }
            fn field_at(&self, index: usize)
                -> ::core::option::Option<&dyn bevy_reflect::PartialReflect> {
                match index { _ => ::core::option::Option::None, }
            }
            fn field_at_mut(&mut self, index: usize)
                ->
                    ::core::option::Option<&mut dyn bevy_reflect::PartialReflect> {
                match index { _ => ::core::option::Option::None, }
            }
            fn name_at(&self, index: usize) -> ::core::option::Option<&str> {
                match index { _ => ::core::option::Option::None, }
            }
            fn index_of_name(&self, name: &str)
                -> ::core::option::Option<usize> {
                match name { _ => ::core::option::Option::None, }
            }
            fn field_len(&self) -> usize { 0usize }
            fn iter_fields(&self) -> bevy_reflect::structs::FieldIter {
                bevy_reflect::structs::FieldIter::new(self)
            }
            fn to_dynamic_struct(&self)
                -> bevy_reflect::structs::DynamicStruct {
                let mut dynamic: bevy_reflect::structs::DynamicStruct =
                    ::core::default::Default::default();
                dynamic.set_represented_type(bevy_reflect::PartialReflect::get_represented_type_info(self));
                dynamic
            }
        }
        impl bevy_reflect::PartialReflect for CheckboxOutline where  {
            #[inline]
            fn get_represented_type_info(&self)
                -> ::core::option::Option<&'static bevy_reflect::TypeInfo> {
                ::core::option::Option::Some(<Self as
                            bevy_reflect::Typed>::type_info())
            }
            #[inline]
            fn try_apply(&mut self, value: &dyn bevy_reflect::PartialReflect)
                -> ::core::result::Result<(), bevy_reflect::ApplyError> {
                if let bevy_reflect::ReflectRef::Struct(struct_value) =
                        bevy_reflect::PartialReflect::reflect_ref(value) {
                    for (name, value) in
                        bevy_reflect::structs::Struct::iter_fields(struct_value) {
                        if let ::core::option::Option::Some(v) =
                                bevy_reflect::structs::Struct::field_mut(self, name) {
                            bevy_reflect::PartialReflect::try_apply(v, value)?;
                        }
                    }
                } else {
                    return ::core::result::Result::Err(bevy_reflect::ApplyError::MismatchedKinds {
                                from_kind: bevy_reflect::PartialReflect::reflect_kind(value),
                                to_kind: bevy_reflect::ReflectKind::Struct,
                            });
                }
                ::core::result::Result::Ok(())
            }
            #[inline]
            fn reflect_kind(&self) -> bevy_reflect::ReflectKind {
                bevy_reflect::ReflectKind::Struct
            }
            #[inline]
            fn reflect_ref(&self) -> bevy_reflect::ReflectRef {
                bevy_reflect::ReflectRef::Struct(self)
            }
            #[inline]
            fn reflect_mut(&mut self) -> bevy_reflect::ReflectMut {
                bevy_reflect::ReflectMut::Struct(self)
            }
            #[inline]
            fn reflect_owned(self:
                    bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
                -> bevy_reflect::ReflectOwned {
                bevy_reflect::ReflectOwned::Struct(self)
            }
            #[inline]
            fn try_into_reflect(self:
                    bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
                ->
                    ::core::result::Result<bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect>,
                    bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::PartialReflect>> {
                ::core::result::Result::Ok(self)
            }
            #[inline]
            fn try_as_reflect(&self)
                -> ::core::option::Option<&dyn bevy_reflect::Reflect> {
                ::core::option::Option::Some(self)
            }
            #[inline]
            fn try_as_reflect_mut(&mut self)
                -> ::core::option::Option<&mut dyn bevy_reflect::Reflect> {
                ::core::option::Option::Some(self)
            }
            #[inline]
            fn into_partial_reflect(self:
                    bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
                ->
                    bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::PartialReflect> {
                self
            }
            #[inline]
            fn as_partial_reflect(&self)
                -> &dyn bevy_reflect::PartialReflect {
                self
            }
            #[inline]
            fn as_partial_reflect_mut(&mut self)
                -> &mut dyn bevy_reflect::PartialReflect {
                self
            }
            fn reflect_partial_eq(&self,
                value: &dyn bevy_reflect::PartialReflect)
                -> ::core::option::Option<bool> {
                (bevy_reflect::structs::struct_partial_eq)(self, value)
            }
            fn reflect_partial_cmp(&self,
                value: &dyn bevy_reflect::PartialReflect)
                -> ::core::option::Option<::core::cmp::Ordering> {
                (bevy_reflect::structs::struct_partial_cmp)(self, value)
            }
            #[inline]
            fn reflect_clone(&self)
                ->
                    ::core::result::Result<bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect>,
                    bevy_reflect::ReflectCloneError> {
                ::core::result::Result::Ok(bevy_reflect::__macro_exports::alloc_utils::Box::new(::core::clone::Clone::clone(self)))
            }
        }
        impl bevy_reflect::FromReflect for CheckboxOutline where  {
            fn from_reflect(reflect: &dyn bevy_reflect::PartialReflect)
                -> ::core::option::Option<Self> {
                if let bevy_reflect::ReflectRef::Struct(__ref_struct) =
                        bevy_reflect::PartialReflect::reflect_ref(reflect) {
                    let mut __this =
                        <Self as ::core::default::Default>::default();
                    ::core::option::Option::Some(__this)
                } else { ::core::option::Option::None }
            }
        }
    };Reflect)]
129#[reflect(Component, Clone, Default)]
130struct CheckboxOutline;
131
132/// Marker for the checkbox check mark
133#[derive(impl bevy_ecs::component::Component for CheckboxMark where
    Self: ::core::marker::Send + ::core::marker::Sync + 'static {
    const STORAGE_TYPE: bevy_ecs::component::StorageType =
        bevy_ecs::component::StorageType::Table;
    type Mutability = bevy_ecs::component::Mutable;
    fn register_required_components(_requiree:
            bevy_ecs::component::ComponentId,
        required_components:
            &mut bevy_ecs::component::RequiredComponentsRegistrator) {}
    fn clone_behavior() -> bevy_ecs::component::ComponentCloneBehavior {
        use bevy_ecs::component::{
            DefaultCloneBehaviorBase, DefaultCloneBehaviorViaClone,
        };
        (&&&bevy_ecs::component::DefaultCloneBehaviorSpecialization::<Self>::default()).default_clone_behavior()
    }
    fn relationship_accessor()
        ->
            ::core::option::Option<bevy_ecs::relationship::ComponentRelationshipAccessor<Self>> {
        ::core::option::Option::None
    }
}Component, #[automatically_derived]
impl ::core::default::Default for CheckboxMark {
    #[inline]
    fn default() -> CheckboxMark { CheckboxMark {} }
}Default, #[automatically_derived]
impl ::core::clone::Clone for CheckboxMark {
    #[inline]
    fn clone(&self) -> CheckboxMark { CheckboxMark }
}Clone, const _: () =
    {
        impl bevy_reflect::GetTypeRegistration for CheckboxMark where  {
            fn get_type_registration() -> bevy_reflect::TypeRegistration {
                let mut registration =
                    bevy_reflect::TypeRegistration::of::<Self>();
                registration.insert::<bevy_reflect::ReflectFromPtr>(bevy_reflect::FromType::<Self>::from_type());
                registration.insert::<bevy_reflect::ReflectFromReflect>(bevy_reflect::FromType::<Self>::from_type());
                registration.register_type_data::<ReflectComponent, Self>();
                registration.register_type_data::<ReflectDefault, Self>();
                registration
            }
            #[inline(never)]
            fn register_type_dependencies(registry:
                    &mut bevy_reflect::TypeRegistry) {}
        }
        impl bevy_reflect::Typed for CheckboxMark where  {
            #[inline]
            fn type_info() -> &'static bevy_reflect::TypeInfo {
                static CELL: bevy_reflect::utility::NonGenericTypeInfoCell =
                    bevy_reflect::utility::NonGenericTypeInfoCell::new();
                CELL.get_or_set(||
                        {
                            bevy_reflect::TypeInfo::Struct(bevy_reflect::structs::StructInfo::new::<Self>(&[]))
                        })
            }
        }
        #[allow(deprecated, reason =
        "derives on a deprecated type shouldn't be considered a usage")]
        impl bevy_reflect::TypePath for CheckboxMark where  {
            fn type_path() -> &'static str {
                "bevy_feathers::controls::checkbox::CheckboxMark"
            }
            fn short_type_path() -> &'static str { "CheckboxMark" }
            fn type_ident() -> ::core::option::Option<&'static str> {
                ::core::option::Option::Some("CheckboxMark")
            }
            fn crate_name() -> ::core::option::Option<&'static str> {
                ::core::option::Option::Some("bevy_feathers::controls::checkbox".split(':').next().unwrap())
            }
            fn module_path() -> ::core::option::Option<&'static str> {
                ::core::option::Option::Some("bevy_feathers::controls::checkbox")
            }
        }
        impl bevy_reflect::Reflect for CheckboxMark where  {
            #[inline]
            fn into_any(self:
                    bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
                ->
                    bevy_reflect::__macro_exports::alloc_utils::Box<dyn ::core::any::Any> {
                self
            }
            #[inline]
            fn as_any(&self) -> &dyn ::core::any::Any { self }
            #[inline]
            fn as_any_mut(&mut self) -> &mut dyn ::core::any::Any { self }
            #[inline]
            fn into_reflect(self:
                    bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
                ->
                    bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect> {
                self
            }
            #[inline]
            fn as_reflect(&self) -> &dyn bevy_reflect::Reflect { self }
            #[inline]
            fn as_reflect_mut(&mut self) -> &mut dyn bevy_reflect::Reflect {
                self
            }
            #[inline]
            fn set(&mut self,
                value:
                    bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect>)
                ->
                    ::core::result::Result<(),
                    bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect>> {
                *self = <dyn bevy_reflect::Reflect>::take(value)?;
                ::core::result::Result::Ok(())
            }
        }
        #[allow(non_upper_case_globals)]
        const _: () =
            {
                static __INVENTORY: ::inventory::Node =
                    ::inventory::Node {
                        value: &{
                                bevy_reflect::__macro_exports::auto_register::AutomaticReflectRegistrations(<CheckboxMark
                                        as
                                        bevy_reflect::__macro_exports::auto_register::RegisterForReflection>::__register)
                            },
                        next: ::inventory::__private::UnsafeCell::new(::inventory::__private::Option::None),
                    };
                #[link_section = ".text.startup"]
                unsafe extern "C" fn __ctor() {
                    unsafe {
                        ::inventory::ErasedNode::submit(__INVENTORY.value,
                            &__INVENTORY)
                    }
                }
                #[used]
                #[link_section = ".init_array"]
                static __CTOR: unsafe extern "C" fn() = __ctor;
            };
        impl bevy_reflect::structs::Struct for CheckboxMark where  {
            fn field(&self, name: &str)
                -> ::core::option::Option<&dyn bevy_reflect::PartialReflect> {
                match name { _ => ::core::option::Option::None, }
            }
            fn field_mut(&mut self, name: &str)
                ->
                    ::core::option::Option<&mut dyn bevy_reflect::PartialReflect> {
                match name { _ => ::core::option::Option::None, }
            }
            fn field_at(&self, index: usize)
                -> ::core::option::Option<&dyn bevy_reflect::PartialReflect> {
                match index { _ => ::core::option::Option::None, }
            }
            fn field_at_mut(&mut self, index: usize)
                ->
                    ::core::option::Option<&mut dyn bevy_reflect::PartialReflect> {
                match index { _ => ::core::option::Option::None, }
            }
            fn name_at(&self, index: usize) -> ::core::option::Option<&str> {
                match index { _ => ::core::option::Option::None, }
            }
            fn index_of_name(&self, name: &str)
                -> ::core::option::Option<usize> {
                match name { _ => ::core::option::Option::None, }
            }
            fn field_len(&self) -> usize { 0usize }
            fn iter_fields(&self) -> bevy_reflect::structs::FieldIter {
                bevy_reflect::structs::FieldIter::new(self)
            }
            fn to_dynamic_struct(&self)
                -> bevy_reflect::structs::DynamicStruct {
                let mut dynamic: bevy_reflect::structs::DynamicStruct =
                    ::core::default::Default::default();
                dynamic.set_represented_type(bevy_reflect::PartialReflect::get_represented_type_info(self));
                dynamic
            }
        }
        impl bevy_reflect::PartialReflect for CheckboxMark where  {
            #[inline]
            fn get_represented_type_info(&self)
                -> ::core::option::Option<&'static bevy_reflect::TypeInfo> {
                ::core::option::Option::Some(<Self as
                            bevy_reflect::Typed>::type_info())
            }
            #[inline]
            fn try_apply(&mut self, value: &dyn bevy_reflect::PartialReflect)
                -> ::core::result::Result<(), bevy_reflect::ApplyError> {
                if let bevy_reflect::ReflectRef::Struct(struct_value) =
                        bevy_reflect::PartialReflect::reflect_ref(value) {
                    for (name, value) in
                        bevy_reflect::structs::Struct::iter_fields(struct_value) {
                        if let ::core::option::Option::Some(v) =
                                bevy_reflect::structs::Struct::field_mut(self, name) {
                            bevy_reflect::PartialReflect::try_apply(v, value)?;
                        }
                    }
                } else {
                    return ::core::result::Result::Err(bevy_reflect::ApplyError::MismatchedKinds {
                                from_kind: bevy_reflect::PartialReflect::reflect_kind(value),
                                to_kind: bevy_reflect::ReflectKind::Struct,
                            });
                }
                ::core::result::Result::Ok(())
            }
            #[inline]
            fn reflect_kind(&self) -> bevy_reflect::ReflectKind {
                bevy_reflect::ReflectKind::Struct
            }
            #[inline]
            fn reflect_ref(&self) -> bevy_reflect::ReflectRef {
                bevy_reflect::ReflectRef::Struct(self)
            }
            #[inline]
            fn reflect_mut(&mut self) -> bevy_reflect::ReflectMut {
                bevy_reflect::ReflectMut::Struct(self)
            }
            #[inline]
            fn reflect_owned(self:
                    bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
                -> bevy_reflect::ReflectOwned {
                bevy_reflect::ReflectOwned::Struct(self)
            }
            #[inline]
            fn try_into_reflect(self:
                    bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
                ->
                    ::core::result::Result<bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect>,
                    bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::PartialReflect>> {
                ::core::result::Result::Ok(self)
            }
            #[inline]
            fn try_as_reflect(&self)
                -> ::core::option::Option<&dyn bevy_reflect::Reflect> {
                ::core::option::Option::Some(self)
            }
            #[inline]
            fn try_as_reflect_mut(&mut self)
                -> ::core::option::Option<&mut dyn bevy_reflect::Reflect> {
                ::core::option::Option::Some(self)
            }
            #[inline]
            fn into_partial_reflect(self:
                    bevy_reflect::__macro_exports::alloc_utils::Box<Self>)
                ->
                    bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::PartialReflect> {
                self
            }
            #[inline]
            fn as_partial_reflect(&self)
                -> &dyn bevy_reflect::PartialReflect {
                self
            }
            #[inline]
            fn as_partial_reflect_mut(&mut self)
                -> &mut dyn bevy_reflect::PartialReflect {
                self
            }
            fn reflect_partial_eq(&self,
                value: &dyn bevy_reflect::PartialReflect)
                -> ::core::option::Option<bool> {
                (bevy_reflect::structs::struct_partial_eq)(self, value)
            }
            fn reflect_partial_cmp(&self,
                value: &dyn bevy_reflect::PartialReflect)
                -> ::core::option::Option<::core::cmp::Ordering> {
                (bevy_reflect::structs::struct_partial_cmp)(self, value)
            }
            #[inline]
            fn reflect_clone(&self)
                ->
                    ::core::result::Result<bevy_reflect::__macro_exports::alloc_utils::Box<dyn bevy_reflect::Reflect>,
                    bevy_reflect::ReflectCloneError> {
                ::core::result::Result::Ok(bevy_reflect::__macro_exports::alloc_utils::Box::new(::core::clone::Clone::clone(self)))
            }
        }
        impl bevy_reflect::FromReflect for CheckboxMark where  {
            fn from_reflect(reflect: &dyn bevy_reflect::PartialReflect)
                -> ::core::option::Option<Self> {
                if let bevy_reflect::ReflectRef::Struct(__ref_struct) =
                        bevy_reflect::PartialReflect::reflect_ref(reflect) {
                    let mut __this =
                        <Self as ::core::default::Default>::default();
                    ::core::option::Option::Some(__this)
                } else { ::core::option::Option::None }
            }
        }
    };Reflect)]
134#[reflect(Component, Clone, Default)]
135struct CheckboxMark;
136
137/// Template function to spawn a checkbox.
138///
139/// This version does not take any props. A caption can be set by appending a child entity.
140///
141/// # Emitted events
142/// * [`bevy_ui_widgets::ValueChange<bool>`] with the new value when the checkbox changes state.
143///
144/// These events can be disabled by adding an [`bevy_ui::InteractionDisabled`] component to the entity
145#[deprecated(since = "0.19.0", note = "Use the checkbox() BSN function")]
146pub fn checkbox_bundle<C: SpawnableList<ChildOf> + Send + Sync + 'static, B: Bundle>(
147    overrides: B,
148    label: C,
149) -> impl Bundle {
150    (
151        Node {
152            display: Display::Flex,
153            flex_direction: FlexDirection::Row,
154            justify_content: JustifyContent::Start,
155            align_items: AlignItems::Center,
156            column_gap: px(4),
157            ..Default::default()
158        },
159        Checkbox,
160        CheckboxFrame,
161        Hovered::default(),
162        EntityCursor::System(bevy_window::SystemCursorIcon::Pointer),
163        TabIndex(0),
164        InheritableThemeTextColor(tokens::CHECKBOX_TEXT),
165        InheritableFont {
166            font_size: size::MEDIUM_FONT,
167            weight: FontWeight::NORMAL,
168            ..Default::default()
169        },
170        overrides,
171        Children::spawn((
172            Spawn((
173                Node {
174                    width: size::CHECKBOX_SIZE,
175                    height: size::CHECKBOX_SIZE,
176                    border: UiRect::all(px(2)),
177                    border_radius: BorderRadius::all(px(4)),
178                    ..Default::default()
179                },
180                FocusIndicator,
181                CheckboxOutline,
182                ThemeBackgroundColor(tokens::CHECKBOX_BG),
183                ThemeBorderColor(tokens::CHECKBOX_BORDER),
184                <::bevy_ecs::hierarchy::Children as
        ::bevy_ecs::spawn::SpawnRelated>::spawn(::bevy_ecs::spawn::Spawn((Node {
                position_type: PositionType::Absolute,
                left: px(4),
                top: px(0),
                width: px(6),
                height: px(11),
                border: UiRect {
                    bottom: px(2),
                    right: px(2),
                    ..Default::default()
                },
                ..Default::default()
            }, UiTransform::from_rotation(Rot2::FRAC_PI_4), CheckboxMark,
            ThemeBorderColor(tokens::CHECKBOX_MARK))))children![(
185                    // Cheesy checkmark: rotated node with L-shaped border.
186                    Node {
187                        position_type: PositionType::Absolute,
188                        left: px(4),
189                        top: px(0),
190                        width: px(6),
191                        height: px(11),
192                        border: UiRect {
193                            bottom: px(2),
194                            right: px(2),
195                            ..Default::default()
196                        },
197                        ..Default::default()
198                    },
199                    UiTransform::from_rotation(Rot2::FRAC_PI_4),
200                    CheckboxMark,
201                    ThemeBorderColor(tokens::CHECKBOX_MARK),
202                )],
203            )),
204            label,
205        )),
206    )
207}
208
209fn update_checkbox_styles(
210    q_checkboxes: Query<
211        (
212            Entity,
213            Has<InteractionDisabled>,
214            Has<Checked>,
215            Has<Pressed>,
216            Has<ActivateOnPress>,
217            &Hovered,
218            &InheritableThemeTextColor,
219        ),
220        (
221            With<CheckboxFrame>,
222            Or<(
223                Changed<Hovered>,
224                Added<Checked>,
225                Added<Pressed>,
226                Added<InteractionDisabled>,
227            )>,
228        ),
229    >,
230    q_children: Query<&Children>,
231    mut q_outline: Query<(&ThemeBackgroundColor, &ThemeBorderColor), With<CheckboxOutline>>,
232    mut q_mark: Query<&ThemeBorderColor, With<CheckboxMark>>,
233    mut commands: Commands,
234) {
235    for (checkbox_ent, disabled, checked, pressed, activate_on_press, hovered, font_color) in
236        q_checkboxes.iter()
237    {
238        let Some(outline_ent) = q_children
239            .iter_descendants(checkbox_ent)
240            .find(|en| q_outline.contains(*en))
241        else {
242            continue;
243        };
244        let Some(mark_ent) = q_children
245            .iter_descendants(checkbox_ent)
246            .find(|en| q_mark.contains(*en))
247        else {
248            continue;
249        };
250        let (outline_bg, outline_border) = q_outline.get_mut(outline_ent).unwrap();
251        let mark_color = q_mark.get_mut(mark_ent).unwrap();
252        set_checkbox_styles(
253            checkbox_ent,
254            outline_ent,
255            mark_ent,
256            disabled,
257            checked,
258            pressed,
259            hovered.0,
260            activate_on_press,
261            outline_bg,
262            outline_border,
263            mark_color,
264            font_color,
265            &mut commands,
266        );
267    }
268}
269
270fn update_checkbox_styles_remove(
271    q_checkboxes: Query<
272        (
273            Entity,
274            Has<InteractionDisabled>,
275            Has<Checked>,
276            Has<Pressed>,
277            Has<ActivateOnPress>,
278            &Hovered,
279            &InheritableThemeTextColor,
280        ),
281        With<CheckboxFrame>,
282    >,
283    q_children: Query<&Children>,
284    mut q_outline: Query<(&ThemeBackgroundColor, &ThemeBorderColor), With<CheckboxOutline>>,
285    mut q_mark: Query<&ThemeBorderColor, With<CheckboxMark>>,
286    mut removed_disabled: RemovedComponents<InteractionDisabled>,
287    mut removed_checked: RemovedComponents<Checked>,
288    mut remove_pressed: RemovedComponents<Pressed>,
289    mut remove_activate_on_press: RemovedComponents<ActivateOnPress>,
290    mut commands: Commands,
291) {
292    removed_disabled
293        .read()
294        .chain(removed_checked.read())
295        .chain(remove_pressed.read())
296        .chain(remove_activate_on_press.read())
297        .for_each(|ent| {
298            if let Ok((
299                checkbox_ent,
300                disabled,
301                checked,
302                pressed,
303                activate_on_press,
304                hovered,
305                font_color,
306            )) = q_checkboxes.get(ent)
307            {
308                let Some(outline_ent) = q_children
309                    .iter_descendants(checkbox_ent)
310                    .find(|en| q_outline.contains(*en))
311                else {
312                    return;
313                };
314                let Some(mark_ent) = q_children
315                    .iter_descendants(checkbox_ent)
316                    .find(|en| q_mark.contains(*en))
317                else {
318                    return;
319                };
320                let (outline_bg, outline_border) = q_outline.get_mut(outline_ent).unwrap();
321                let mark_color = q_mark.get_mut(mark_ent).unwrap();
322                set_checkbox_styles(
323                    checkbox_ent,
324                    outline_ent,
325                    mark_ent,
326                    disabled,
327                    checked,
328                    pressed,
329                    hovered.0,
330                    activate_on_press,
331                    outline_bg,
332                    outline_border,
333                    mark_color,
334                    font_color,
335                    &mut commands,
336                );
337            }
338        });
339}
340
341fn set_checkbox_styles(
342    checkbox_ent: Entity,
343    outline_ent: Entity,
344    mark_ent: Entity,
345    disabled: bool,
346    checked: bool,
347    pressed: bool,
348    hovered: bool,
349    activate_on_press: bool,
350    outline_bg: &ThemeBackgroundColor,
351    outline_border: &ThemeBorderColor,
352    mark_color: &ThemeBorderColor,
353    font_color: &InheritableThemeTextColor,
354    commands: &mut Commands,
355) {
356    let outline_border_token = if checked {
357        if disabled {
358            tokens::CHECKBOX_BORDER_CHECKED_DISABLED
359        } else if pressed && !activate_on_press {
360            tokens::CHECKBOX_BORDER_CHECKED_PRESSED
361        } else if hovered {
362            tokens::CHECKBOX_BORDER_CHECKED_HOVER
363        } else {
364            tokens::CHECKBOX_BORDER_CHECKED
365        }
366    } else {
367        if disabled {
368            tokens::CHECKBOX_BORDER_DISABLED
369        } else if pressed && !activate_on_press {
370            tokens::CHECKBOX_BORDER_PRESSED
371        } else if hovered {
372            tokens::CHECKBOX_BORDER_HOVER
373        } else {
374            tokens::CHECKBOX_BORDER
375        }
376    };
377
378    let outline_bg_token = if checked {
379        if disabled {
380            tokens::CHECKBOX_BG_CHECKED_DISABLED
381        } else if pressed && !activate_on_press {
382            tokens::CHECKBOX_BG_CHECKED_PRESSED
383        } else if hovered {
384            tokens::CHECKBOX_BG_CHECKED_HOVER
385        } else {
386            tokens::CHECKBOX_BG_CHECKED
387        }
388    } else {
389        if disabled {
390            tokens::CHECKBOX_BG_DISABLED
391        } else if pressed && !activate_on_press {
392            tokens::CHECKBOX_BG_PRESSED
393        } else if hovered {
394            tokens::CHECKBOX_BG_HOVER
395        } else {
396            tokens::CHECKBOX_BG
397        }
398    };
399
400    let mark_token = match disabled {
401        true => tokens::CHECKBOX_MARK_DISABLED,
402        false => tokens::CHECKBOX_MARK,
403    };
404
405    let font_color_token = match disabled {
406        true => tokens::CHECKBOX_TEXT_DISABLED,
407        false => tokens::CHECKBOX_TEXT,
408    };
409
410    let cursor_shape = match disabled {
411        true => bevy_window::SystemCursorIcon::NotAllowed,
412        false => bevy_window::SystemCursorIcon::Pointer,
413    };
414
415    // Change outline background
416    if outline_bg.0 != outline_bg_token {
417        commands
418            .entity(outline_ent)
419            .insert(ThemeBackgroundColor(outline_bg_token));
420    }
421
422    // Change outline border
423    if outline_border.0 != outline_border_token {
424        commands
425            .entity(outline_ent)
426            .insert(ThemeBorderColor(outline_border_token));
427    }
428
429    // Change mark color
430    if mark_color.0 != mark_token {
431        commands
432            .entity(mark_ent)
433            .insert(ThemeBorderColor(mark_token));
434    }
435
436    // Change mark visibility
437    commands.entity(mark_ent).insert(match checked {
438        true => Visibility::Inherited,
439        false => Visibility::Hidden,
440    });
441
442    // Change font color
443    if font_color.0 != font_color_token {
444        commands
445            .entity(checkbox_ent)
446            .insert(InheritableThemeTextColor(font_color_token));
447    }
448
449    // Change cursor shape
450    commands
451        .entity(checkbox_ent)
452        .insert(EntityCursor::System(cursor_shape));
453}
454
455/// Plugin which registers the systems for updating the checkbox styles.
456pub struct CheckboxPlugin;
457
458impl Plugin for CheckboxPlugin {
459    fn build(&self, app: &mut bevy_app::App) {
460        app.add_systems(
461            PreUpdate,
462            (update_checkbox_styles, update_checkbox_styles_remove).in_set(PickingSystems::Last),
463        );
464    }
465}