Skip to main content

bevy_feathers/controls/
checkbox.rs

1use bevy_app::{Plugin, PreUpdate};
2use bevy_camera::visibility::Visibility;
3use bevy_ecs::{
4    component::Component,
5    entity::Entity,
6    hierarchy::Children,
7    lifecycle::RemovedComponents,
8    query::{Added, Changed, Has, Or, With},
9    reflect::ReflectComponent,
10    schedule::IntoScheduleConfigs,
11    system::{Commands, Query},
12    template::FromTemplate,
13};
14use bevy_input_focus::tab_navigation::TabIndex;
15use bevy_math::Rot2;
16use bevy_picking::{cursor::EntityCursor, hover::Hovered, PickingSystems};
17use bevy_reflect::{prelude::ReflectDefault, Reflect};
18use bevy_scene::prelude::*;
19use bevy_text::FontWeight;
20use bevy_ui::{
21    px, AlignItems, Checked, Display, FlexDirection, InteractionDisabled, JustifyContent, Node,
22    PositionType, Pressed, UiRect, UiTransform,
23};
24use bevy_ui_widgets::{ActivateOnPress, Checkbox};
25
26use crate::{
27    constants::{fonts, size},
28    focus::FocusIndicator,
29    font_styles::InheritableFont,
30    theme::{InheritableThemeTextColor, ThemeBackgroundColor, ThemeBorderColor},
31    tokens,
32};
33
34/// A checkbox widget.
35///
36/// This is spawnable by inheriting it as a "scene component" with optional [`FeathersCheckboxProps`].
37///
38/// # Emitted events
39/// * [`bevy_ui_widgets::ValueChange<bool>`] with the new value when the checkbox changes state.
40///
41///  These events can be disabled by adding an [`bevy_ui::InteractionDisabled`] component to the entity
42///
43/// A more complete explanation of how to control this widget can be found in the documentation
44/// for [`Checkbox`] and [`bevy_ui_widgets`].
45#[derive(impl bevy_ecs::component::Component for FeathersCheckbox 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) {
        required_components.register_required(||
                bevy_scene::SceneComponentInfo::new::<FeathersCheckbox>(false));
    }
    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
    }
}
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 bevy_ecs::template::FromTemplate for FeathersCheckbox {
    type Template = FeathersCheckboxTemplate;
}
impl ::core::marker::Unpin for FeathersCheckbox where
    for<'a> [()]: bevy_ecs::template::SpecializeFromTemplate {}
#[allow(missing_docs)]
pub struct FeathersCheckboxTemplate;
impl bevy_ecs::template::Template for FeathersCheckboxTemplate {
    type Output = FeathersCheckbox;
    fn build_template(&self,
        context: &mut bevy_ecs::template::TemplateContext)
        -> bevy_ecs::error::Result<Self::Output> {
        bevy_ecs::error::Result::Ok(FeathersCheckbox)
    }
    fn clone_template(&self) -> Self { Self }
}
impl ::core::default::Default for FeathersCheckboxTemplate {
    fn default() -> Self { Self }
}FromTemplate)]
46#[scene(FeathersCheckboxProps)]
47#[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 as
                            bevy_reflect::CreateTypeData<Self>>::create_type_data(()));
                registration.insert(<bevy_reflect::ReflectFromReflect as
                            bevy_reflect::CreateTypeData<Self>>::create_type_data(()));
                registration.register_type_data_with::<ReflectComponent, Self,
                    _>(());
                registration
            }
            #[inline(never)]
            fn register_type_dependencies(registry:
                    &mut bevy_reflect::TypeRegistry) {}
        }
        impl bevy_reflect::Typed for FeathersCheckbox where  {
            #[inline(never)]
            fn type_info() -> &'static bevy_reflect::TypeInfo {
                static CELL: bevy_reflect::utility::NonGenericTypeInfoCell =
                    bevy_reflect::utility::NonGenericTypeInfoCell::new();
                CELL.get_or_set(#[inline(never)] ||
                        {
                            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)
                ->
                    ::core::result::Result<bevy_reflect::structs::DynamicStruct,
                    bevy_reflect::ReflectCloneError> {
                let mut dynamic: bevy_reflect::structs::DynamicStruct =
                    ::core::default::Default::default();
                dynamic.set_represented_type(bevy_reflect::PartialReflect::get_represented_type_info(self));
                ::core::result::Result::Ok(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)]
48#[reflect(Component)]
49pub struct FeathersCheckbox;
50
51/// Props used to construct a [`FeathersCheckbox`] scene.
52pub struct FeathersCheckboxProps {
53    /// Label for this checkbox. This can contain multiple entities, which will be contained
54    /// in a flexbox.
55    pub caption: Box<dyn SceneList>,
56}
57
58impl Default for FeathersCheckboxProps {
59    fn default() -> Self {
60        Self {
61            caption: Box::new(bevy_scene::SceneListScope(())bsn_list! {}),
62        }
63    }
64}
65
66impl FeathersCheckbox {
67    fn scene(props: FeathersCheckboxProps) -> impl Scene {
68        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 = { size::CHECKBOX_SIZE }.into();
        let _expr5 = { size::CHECKBOX_SIZE }.into();
        let _expr6 = { px(2) }.into();
        let _expr7 = { px(4) }.into();
        let _expr8 = { tokens::CHECKBOX_BG }.into();
        let _expr9 = { tokens::CHECKBOX_BORDER }.into();
        let _expr10 = { px(4) }.into();
        let _expr11 = { px(0) }.into();
        let _expr12 = { px(6) }.into();
        let _expr13 = { px(11) }.into();
        let _expr14 = { px(2) }.into();
        let _expr15 = { px(2) }.into();
        let _expr16 = { tokens::CHECKBOX_MARK }.into();
        (bevy_scene::SceneFunction(move |_context, _scene|
                    {
                        let __value =
                            _scene.get_or_insert_from_template::<Node>(_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_from_template::<Checkbox>(_context);
                        let _ =
                            _scene.get_or_insert_from_template::<CheckboxFrame>(_context);
                        let _ =
                            _scene.get_or_insert_from_template::<Hovered>(_context);
                        _scene.insert_template(bevy_scene::macro_utils::PathResolveHelper::<<EntityCursor
                                    as
                                    bevy_ecs::template::FromTemplate>::Template>::System(bevy_window::SystemCursorIcon::Pointer));
                        let __value =
                            _scene.get_or_insert_from_template::<TabIndex>(_context);
                        __value.0 = 0;
                        let __value =
                            _scene.get_or_insert_from_template::<InheritableThemeTextColor>(_context);
                        __value.0 = _expr1;
                        let __value =
                            _scene.get_or_insert_from_template::<InheritableFont>(_context);
                        __value.font = _expr2;
                        __value.font_size = _expr3;
                        __value.weight = FontWeight::NORMAL.into();
                    }),
            bevy_scene::RelatedScenes::<Children>::new((bevy_scene::EntityScene((bevy_scene::SceneFunction(move
                                    |_context, _scene|
                                    {
                                        let __value =
                                            _scene.get_or_insert_from_template::<Node>(_context);
                                        __value.width = _expr4;
                                        __value.height = _expr5;
                                        __value.border = _expr6;
                                        __value.border_radius = _expr7;
                                        let _ =
                                            _scene.get_or_insert_from_template::<CheckboxOutline>(_context);
                                        let __value =
                                            _scene.get_or_insert_from_template::<ThemeBackgroundColor>(_context);
                                        __value.0 = _expr8;
                                        let __value =
                                            _scene.get_or_insert_from_template::<ThemeBorderColor>(_context);
                                        __value.0 = _expr9;
                                        let _ =
                                            _scene.get_or_insert_from_template::<FocusIndicator>(_context);
                                    }),
                            bevy_scene::RelatedScenes::<Children>::new(bevy_scene::EntityScene(bevy_scene::SceneFunction(move
                                            |_context, _scene|
                                            {
                                                let __value =
                                                    _scene.get_or_insert_from_template::<Node>(_context);
                                                __value.position_type = PositionType::Absolute.into();
                                                __value.left = _expr10;
                                                __value.top = _expr11;
                                                __value.width = _expr12;
                                                __value.height = _expr13;
                                                bevy_scene::macro_utils::touch_type::<UiRect>();
                                                __value.border.bottom = _expr14;
                                                __value.border.right = _expr15;
                                                _scene.insert_template(<UiTransform as
                                                            bevy_ecs::template::FromTemplate>::Template::from_rotation(Rot2::FRAC_PI_4));
                                                let _ =
                                                    _scene.get_or_insert_from_template::<CheckboxMark>(_context);
                                                let __value =
                                                    _scene.get_or_insert_from_template::<ThemeBorderColor>(_context);
                                                __value.0 = _expr16;
                                            }))))), props.caption)))
    });bsn! {
69            Node {
70                display: Display::Flex,
71                flex_direction: FlexDirection::Row,
72                justify_content: JustifyContent::Start,
73                align_items: AlignItems::Center,
74                column_gap: px(4),
75            }
76            Checkbox
77            CheckboxFrame
78            Hovered
79            EntityCursor::System(bevy_window::SystemCursorIcon::Pointer)
80            TabIndex(0)
81            InheritableThemeTextColor(tokens::CHECKBOX_TEXT)
82            InheritableFont {
83                font: fonts::REGULAR,
84                font_size: size::MEDIUM_FONT,
85                weight: FontWeight::NORMAL,
86            }
87            Children [
88                Node {
89                    width: size::CHECKBOX_SIZE,
90                    height: size::CHECKBOX_SIZE,
91                    border: px(2),
92                    border_radius: px(4),
93                }
94                CheckboxOutline
95                ThemeBackgroundColor(tokens::CHECKBOX_BG)
96                ThemeBorderColor(tokens::CHECKBOX_BORDER)
97                FocusIndicator
98                Children [
99                    // Cheesy checkmark: rotated node with L-shaped border.
100                    Node {
101                        position_type: PositionType::Absolute,
102                        left: px(4),
103                        top: px(0),
104                        width: px(6),
105                        height: px(11),
106                        border: UiRect {
107                            bottom: px(2),
108                            right: px(2),
109                        },
110                    }
111                    UiTransform::from_rotation(Rot2::FRAC_PI_4)
112                    CheckboxMark
113                    ThemeBorderColor(tokens::CHECKBOX_MARK)
114                ]
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() -> Self { CheckboxFrame {} }
}Default, #[automatically_derived]impl ::core::clone::Clone for CheckboxFrame {
    #[inline]
    fn clone(&self) -> Self { 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 as
                            bevy_reflect::CreateTypeData<Self>>::create_type_data(()));
                registration.insert(<bevy_reflect::ReflectFromReflect as
                            bevy_reflect::CreateTypeData<Self>>::create_type_data(()));
                registration.register_type_data_with::<ReflectComponent, Self,
                    _>(());
                registration.register_type_data_with::<ReflectDefault, Self,
                    _>(());
                registration
            }
            #[inline(never)]
            fn register_type_dependencies(registry:
                    &mut bevy_reflect::TypeRegistry) {}
        }
        impl bevy_reflect::Typed for CheckboxFrame where  {
            #[inline(never)]
            fn type_info() -> &'static bevy_reflect::TypeInfo {
                static CELL: bevy_reflect::utility::NonGenericTypeInfoCell =
                    bevy_reflect::utility::NonGenericTypeInfoCell::new();
                CELL.get_or_set(#[inline(never)] ||
                        {
                            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)
                ->
                    ::core::result::Result<bevy_reflect::structs::DynamicStruct,
                    bevy_reflect::ReflectCloneError> {
                let mut dynamic: bevy_reflect::structs::DynamicStruct =
                    ::core::default::Default::default();
                dynamic.set_represented_type(bevy_reflect::PartialReflect::get_represented_type_info(self));
                ::core::result::Result::Ok(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() -> Self { CheckboxOutline {} }
}Default, #[automatically_derived]impl ::core::clone::Clone for CheckboxOutline {
    #[inline]
    fn clone(&self) -> Self { 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 as
                            bevy_reflect::CreateTypeData<Self>>::create_type_data(()));
                registration.insert(<bevy_reflect::ReflectFromReflect as
                            bevy_reflect::CreateTypeData<Self>>::create_type_data(()));
                registration.register_type_data_with::<ReflectComponent, Self,
                    _>(());
                registration.register_type_data_with::<ReflectDefault, Self,
                    _>(());
                registration
            }
            #[inline(never)]
            fn register_type_dependencies(registry:
                    &mut bevy_reflect::TypeRegistry) {}
        }
        impl bevy_reflect::Typed for CheckboxOutline where  {
            #[inline(never)]
            fn type_info() -> &'static bevy_reflect::TypeInfo {
                static CELL: bevy_reflect::utility::NonGenericTypeInfoCell =
                    bevy_reflect::utility::NonGenericTypeInfoCell::new();
                CELL.get_or_set(#[inline(never)] ||
                        {
                            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)
                ->
                    ::core::result::Result<bevy_reflect::structs::DynamicStruct,
                    bevy_reflect::ReflectCloneError> {
                let mut dynamic: bevy_reflect::structs::DynamicStruct =
                    ::core::default::Default::default();
                dynamic.set_represented_type(bevy_reflect::PartialReflect::get_represented_type_info(self));
                ::core::result::Result::Ok(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() -> Self { CheckboxMark {} }
}Default, #[automatically_derived]impl ::core::clone::Clone for CheckboxMark {
    #[inline]
    fn clone(&self) -> Self { 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 as
                            bevy_reflect::CreateTypeData<Self>>::create_type_data(()));
                registration.insert(<bevy_reflect::ReflectFromReflect as
                            bevy_reflect::CreateTypeData<Self>>::create_type_data(()));
                registration.register_type_data_with::<ReflectComponent, Self,
                    _>(());
                registration.register_type_data_with::<ReflectDefault, Self,
                    _>(());
                registration
            }
            #[inline(never)]
            fn register_type_dependencies(registry:
                    &mut bevy_reflect::TypeRegistry) {}
        }
        impl bevy_reflect::Typed for CheckboxMark where  {
            #[inline(never)]
            fn type_info() -> &'static bevy_reflect::TypeInfo {
                static CELL: bevy_reflect::utility::NonGenericTypeInfoCell =
                    bevy_reflect::utility::NonGenericTypeInfoCell::new();
                CELL.get_or_set(#[inline(never)] ||
                        {
                            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)
                ->
                    ::core::result::Result<bevy_reflect::structs::DynamicStruct,
                    bevy_reflect::ReflectCloneError> {
                let mut dynamic: bevy_reflect::structs::DynamicStruct =
                    ::core::default::Default::default();
                dynamic.set_represented_type(bevy_reflect::PartialReflect::get_represented_type_info(self));
                ::core::result::Result::Ok(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
137fn update_checkbox_styles(
138    q_checkboxes: Query<
139        (
140            Entity,
141            Has<InteractionDisabled>,
142            Has<Checked>,
143            Has<Pressed>,
144            Has<ActivateOnPress>,
145            &Hovered,
146            &InheritableThemeTextColor,
147        ),
148        (
149            With<CheckboxFrame>,
150            Or<(
151                Changed<Hovered>,
152                Added<Checked>,
153                Added<Pressed>,
154                Added<InteractionDisabled>,
155            )>,
156        ),
157    >,
158    q_children: Query<&Children>,
159    mut q_outline: Query<(&ThemeBackgroundColor, &ThemeBorderColor), With<CheckboxOutline>>,
160    mut q_mark: Query<&ThemeBorderColor, With<CheckboxMark>>,
161    mut commands: Commands,
162) {
163    for (checkbox_ent, disabled, checked, pressed, activate_on_press, hovered, font_color) in
164        q_checkboxes.iter()
165    {
166        let Some(outline_ent) = q_children
167            .iter_descendants(checkbox_ent)
168            .find(|en| q_outline.contains(*en))
169        else {
170            continue;
171        };
172        let Some(mark_ent) = q_children
173            .iter_descendants(checkbox_ent)
174            .find(|en| q_mark.contains(*en))
175        else {
176            continue;
177        };
178        let (outline_bg, outline_border) = q_outline.get_mut(outline_ent).unwrap();
179        let mark_color = q_mark.get_mut(mark_ent).unwrap();
180        set_checkbox_styles(
181            checkbox_ent,
182            outline_ent,
183            mark_ent,
184            disabled,
185            checked,
186            pressed,
187            hovered.0,
188            activate_on_press,
189            outline_bg,
190            outline_border,
191            mark_color,
192            font_color,
193            &mut commands,
194        );
195    }
196}
197
198fn update_checkbox_styles_remove(
199    q_checkboxes: Query<
200        (
201            Entity,
202            Has<InteractionDisabled>,
203            Has<Checked>,
204            Has<Pressed>,
205            Has<ActivateOnPress>,
206            &Hovered,
207            &InheritableThemeTextColor,
208        ),
209        With<CheckboxFrame>,
210    >,
211    q_children: Query<&Children>,
212    mut q_outline: Query<(&ThemeBackgroundColor, &ThemeBorderColor), With<CheckboxOutline>>,
213    mut q_mark: Query<&ThemeBorderColor, With<CheckboxMark>>,
214    mut removed_disabled: RemovedComponents<InteractionDisabled>,
215    mut removed_checked: RemovedComponents<Checked>,
216    mut remove_pressed: RemovedComponents<Pressed>,
217    mut remove_activate_on_press: RemovedComponents<ActivateOnPress>,
218    mut commands: Commands,
219) {
220    removed_disabled
221        .read()
222        .chain(removed_checked.read())
223        .chain(remove_pressed.read())
224        .chain(remove_activate_on_press.read())
225        .for_each(|ent| {
226            if let Ok((
227                checkbox_ent,
228                disabled,
229                checked,
230                pressed,
231                activate_on_press,
232                hovered,
233                font_color,
234            )) = q_checkboxes.get(ent)
235            {
236                let Some(outline_ent) = q_children
237                    .iter_descendants(checkbox_ent)
238                    .find(|en| q_outline.contains(*en))
239                else {
240                    return;
241                };
242                let Some(mark_ent) = q_children
243                    .iter_descendants(checkbox_ent)
244                    .find(|en| q_mark.contains(*en))
245                else {
246                    return;
247                };
248                let (outline_bg, outline_border) = q_outline.get_mut(outline_ent).unwrap();
249                let mark_color = q_mark.get_mut(mark_ent).unwrap();
250                set_checkbox_styles(
251                    checkbox_ent,
252                    outline_ent,
253                    mark_ent,
254                    disabled,
255                    checked,
256                    pressed,
257                    hovered.0,
258                    activate_on_press,
259                    outline_bg,
260                    outline_border,
261                    mark_color,
262                    font_color,
263                    &mut commands,
264                );
265            }
266        });
267}
268
269fn set_checkbox_styles(
270    checkbox_ent: Entity,
271    outline_ent: Entity,
272    mark_ent: Entity,
273    disabled: bool,
274    checked: bool,
275    pressed: bool,
276    hovered: bool,
277    activate_on_press: bool,
278    outline_bg: &ThemeBackgroundColor,
279    outline_border: &ThemeBorderColor,
280    mark_color: &ThemeBorderColor,
281    font_color: &InheritableThemeTextColor,
282    commands: &mut Commands,
283) {
284    let outline_border_token = if checked {
285        if disabled {
286            tokens::CHECKBOX_BORDER_CHECKED_DISABLED
287        } else if pressed && !activate_on_press {
288            tokens::CHECKBOX_BORDER_CHECKED_PRESSED
289        } else if hovered {
290            tokens::CHECKBOX_BORDER_CHECKED_HOVER
291        } else {
292            tokens::CHECKBOX_BORDER_CHECKED
293        }
294    } else {
295        if disabled {
296            tokens::CHECKBOX_BORDER_DISABLED
297        } else if pressed && !activate_on_press {
298            tokens::CHECKBOX_BORDER_PRESSED
299        } else if hovered {
300            tokens::CHECKBOX_BORDER_HOVER
301        } else {
302            tokens::CHECKBOX_BORDER
303        }
304    };
305
306    let outline_bg_token = if checked {
307        if disabled {
308            tokens::CHECKBOX_BG_CHECKED_DISABLED
309        } else if pressed && !activate_on_press {
310            tokens::CHECKBOX_BG_CHECKED_PRESSED
311        } else if hovered {
312            tokens::CHECKBOX_BG_CHECKED_HOVER
313        } else {
314            tokens::CHECKBOX_BG_CHECKED
315        }
316    } else {
317        if disabled {
318            tokens::CHECKBOX_BG_DISABLED
319        } else if pressed && !activate_on_press {
320            tokens::CHECKBOX_BG_PRESSED
321        } else if hovered {
322            tokens::CHECKBOX_BG_HOVER
323        } else {
324            tokens::CHECKBOX_BG
325        }
326    };
327
328    let mark_token = match disabled {
329        true => tokens::CHECKBOX_MARK_DISABLED,
330        false => tokens::CHECKBOX_MARK,
331    };
332
333    let font_color_token = match disabled {
334        true => tokens::CHECKBOX_TEXT_DISABLED,
335        false => tokens::CHECKBOX_TEXT,
336    };
337
338    let cursor_shape = match disabled {
339        true => bevy_window::SystemCursorIcon::NotAllowed,
340        false => bevy_window::SystemCursorIcon::Pointer,
341    };
342
343    // Change outline background
344    if outline_bg.0 != outline_bg_token {
345        commands
346            .entity(outline_ent)
347            .insert(ThemeBackgroundColor(outline_bg_token));
348    }
349
350    // Change outline border
351    if outline_border.0 != outline_border_token {
352        commands
353            .entity(outline_ent)
354            .insert(ThemeBorderColor(outline_border_token));
355    }
356
357    // Change mark color
358    if mark_color.0 != mark_token {
359        commands
360            .entity(mark_ent)
361            .insert(ThemeBorderColor(mark_token));
362    }
363
364    // Change mark visibility
365    commands.entity(mark_ent).insert(match checked {
366        true => Visibility::Inherited,
367        false => Visibility::Hidden,
368    });
369
370    // Change font color
371    if font_color.0 != font_color_token {
372        commands
373            .entity(checkbox_ent)
374            .insert(InheritableThemeTextColor(font_color_token));
375    }
376
377    // Change cursor shape
378    commands
379        .entity(checkbox_ent)
380        .insert(EntityCursor::System(cursor_shape));
381}
382
383/// Plugin which registers the systems for updating the checkbox styles.
384pub struct CheckboxPlugin;
385
386impl Plugin for CheckboxPlugin {
387    fn build(&self, app: &mut bevy_app::App) {
388        app.add_systems(
389            PreUpdate,
390            (update_checkbox_styles, update_checkbox_styles_remove).in_set(PickingSystems::Last),
391        );
392    }
393}