fyrox_ui/inspector/editors/
bool.rs

1// Copyright (c) 2019-present Dmitry Stepanov and Fyrox Engine contributors.
2//
3// Permission is hereby granted, free of charge, to any person obtaining a copy
4// of this software and associated documentation files (the "Software"), to deal
5// in the Software without restriction, including without limitation the rights
6// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7// copies of the Software, and to permit persons to whom the Software is
8// furnished to do so, subject to the following conditions:
9//
10// The above copyright notice and this permission notice shall be included in all
11// copies or substantial portions of the Software.
12//
13// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
19// SOFTWARE.
20
21use crate::inspector::editors::PropertyEditorTranslationContext;
22use crate::{
23    check_box::{CheckBoxBuilder, CheckBoxMessage},
24    inspector::{
25        editors::{
26            PropertyEditorBuildContext, PropertyEditorDefinition, PropertyEditorInstance,
27            PropertyEditorMessageContext,
28        },
29        FieldKind, InspectorError, PropertyChanged,
30    },
31    message::{MessageDirection, UiMessage},
32    widget::WidgetBuilder,
33    Thickness, VerticalAlignment,
34};
35use std::any::TypeId;
36
37#[derive(Debug)]
38pub struct BoolPropertyEditorDefinition;
39
40impl PropertyEditorDefinition for BoolPropertyEditorDefinition {
41    fn value_type_id(&self) -> TypeId {
42        TypeId::of::<bool>()
43    }
44
45    fn create_instance(
46        &self,
47        ctx: PropertyEditorBuildContext,
48    ) -> Result<PropertyEditorInstance, InspectorError> {
49        let value = ctx.property_info.cast_value::<bool>()?;
50        Ok(PropertyEditorInstance::Simple {
51            editor: CheckBoxBuilder::new(
52                WidgetBuilder::new()
53                    .with_margin(Thickness::top_bottom(1.0))
54                    .with_vertical_alignment(VerticalAlignment::Center),
55            )
56            .checked(Some(*value))
57            .build(ctx.build_context),
58        })
59    }
60
61    fn create_message(
62        &self,
63        ctx: PropertyEditorMessageContext,
64    ) -> Result<Option<UiMessage>, InspectorError> {
65        let value = ctx.property_info.cast_value::<bool>()?;
66        Ok(Some(CheckBoxMessage::checked(
67            ctx.instance,
68            MessageDirection::ToWidget,
69            Some(*value),
70        )))
71    }
72
73    fn translate_message(&self, ctx: PropertyEditorTranslationContext) -> Option<PropertyChanged> {
74        if ctx.message.direction() == MessageDirection::FromWidget {
75            if let Some(CheckBoxMessage::Check(Some(value))) = ctx.message.data::<CheckBoxMessage>()
76            {
77                return Some(PropertyChanged {
78                    name: ctx.name.to_string(),
79                    owner_type_id: ctx.owner_type_id,
80                    value: FieldKind::object(*value),
81                });
82            }
83        }
84        None
85    }
86}