rg3d_ui/inspector/editors/
mod.rs

1use crate::{
2    core::{inspect::PropertyInfo, pool::Handle},
3    inspector::{
4        editors::{
5            bool::BoolPropertyEditorDefinition,
6            color::ColorPropertyEditorDefinition,
7            numeric::NumericPropertyEditorDefinition,
8            quat::QuatPropertyEditorDefinition,
9            range::RangePropertyEditorDefinition,
10            rect::RectPropertyEditorDefinition,
11            string::StringPropertyEditorDefinition,
12            vec::{
13                Vec2PropertyEditorDefinition, Vec3PropertyEditorDefinition,
14                Vec4PropertyEditorDefinition,
15            },
16        },
17        InspectorEnvironment, InspectorError, PropertyChanged,
18    },
19    message::UiMessage,
20    BuildContext, UiNode, UserInterface,
21};
22use fxhash::FxHashMap;
23use std::{any::TypeId, fmt::Debug, rc::Rc};
24
25pub mod array;
26pub mod bool;
27pub mod collection;
28pub mod color;
29pub mod enumeration;
30pub mod inspectable;
31pub mod numeric;
32pub mod quat;
33pub mod range;
34pub mod rect;
35pub mod string;
36pub mod vec;
37
38pub struct PropertyEditorBuildContext<'a, 'b, 'c> {
39    pub build_context: &'a mut BuildContext<'c>,
40    pub property_info: &'b PropertyInfo<'b>,
41    pub environment: Option<Rc<dyn InspectorEnvironment>>,
42    pub definition_container: Rc<PropertyEditorDefinitionContainer>,
43    pub sync_flag: u64,
44    pub layer_index: usize,
45}
46
47pub struct PropertyEditorMessageContext<'a, 'b> {
48    pub sync_flag: u64,
49    pub instance: Handle<UiNode>,
50    pub ui: &'b mut UserInterface,
51    pub property_info: &'a PropertyInfo<'a>,
52    pub definition_container: Rc<PropertyEditorDefinitionContainer>,
53    pub layer_index: usize,
54}
55
56pub enum PropertyEditorInstance {
57    Simple {
58        /// A property editor. Could be any widget that capable of editing a property
59        /// value.
60        editor: Handle<UiNode>,
61    },
62    Custom {
63        container: Handle<UiNode>,
64
65        /// A property editor. Could be any widget that capable of editing a property
66        /// value.
67        editor: Handle<UiNode>,
68    },
69}
70
71pub trait PropertyEditorDefinition: Debug {
72    fn value_type_id(&self) -> TypeId;
73
74    fn create_instance(
75        &self,
76        ctx: PropertyEditorBuildContext,
77    ) -> Result<PropertyEditorInstance, InspectorError>;
78
79    fn create_message(
80        &self,
81        ctx: PropertyEditorMessageContext,
82    ) -> Result<Option<UiMessage>, InspectorError>;
83
84    fn translate_message(
85        &self,
86        name: &str,
87        owner_type_id: TypeId,
88        message: &UiMessage,
89    ) -> Option<PropertyChanged>;
90}
91
92#[derive(Clone, Default)]
93pub struct PropertyEditorDefinitionContainer {
94    definitions: FxHashMap<TypeId, Rc<dyn PropertyEditorDefinition>>,
95}
96
97impl PropertyEditorDefinitionContainer {
98    pub fn new() -> Self {
99        let mut container = Self::default();
100
101        container.insert(BoolPropertyEditorDefinition);
102
103        container.insert(StringPropertyEditorDefinition);
104
105        container.insert(NumericPropertyEditorDefinition::<f64>::default());
106        container.insert(NumericPropertyEditorDefinition::<f32>::default());
107        container.insert(NumericPropertyEditorDefinition::<i64>::default());
108        container.insert(NumericPropertyEditorDefinition::<u64>::default());
109        container.insert(NumericPropertyEditorDefinition::<i32>::default());
110        container.insert(NumericPropertyEditorDefinition::<u32>::default());
111        container.insert(NumericPropertyEditorDefinition::<i16>::default());
112        container.insert(NumericPropertyEditorDefinition::<u16>::default());
113        container.insert(NumericPropertyEditorDefinition::<i8>::default());
114        container.insert(NumericPropertyEditorDefinition::<u8>::default());
115        container.insert(NumericPropertyEditorDefinition::<usize>::default());
116        container.insert(NumericPropertyEditorDefinition::<isize>::default());
117
118        container.insert(Vec4PropertyEditorDefinition::<f64>::default());
119        container.insert(Vec4PropertyEditorDefinition::<f32>::default());
120        container.insert(Vec4PropertyEditorDefinition::<i64>::default());
121        container.insert(Vec4PropertyEditorDefinition::<u64>::default());
122        container.insert(Vec4PropertyEditorDefinition::<i32>::default());
123        container.insert(Vec4PropertyEditorDefinition::<u32>::default());
124        container.insert(Vec4PropertyEditorDefinition::<i16>::default());
125        container.insert(Vec4PropertyEditorDefinition::<u16>::default());
126        container.insert(Vec4PropertyEditorDefinition::<i8>::default());
127        container.insert(Vec4PropertyEditorDefinition::<u8>::default());
128        container.insert(Vec4PropertyEditorDefinition::<usize>::default());
129        container.insert(Vec4PropertyEditorDefinition::<isize>::default());
130
131        container.insert(Vec3PropertyEditorDefinition::<f64>::default());
132        container.insert(Vec3PropertyEditorDefinition::<f32>::default());
133        container.insert(Vec3PropertyEditorDefinition::<i64>::default());
134        container.insert(Vec3PropertyEditorDefinition::<u64>::default());
135        container.insert(Vec3PropertyEditorDefinition::<i32>::default());
136        container.insert(Vec3PropertyEditorDefinition::<u32>::default());
137        container.insert(Vec3PropertyEditorDefinition::<i16>::default());
138        container.insert(Vec3PropertyEditorDefinition::<u16>::default());
139        container.insert(Vec3PropertyEditorDefinition::<i8>::default());
140        container.insert(Vec3PropertyEditorDefinition::<u8>::default());
141        container.insert(Vec3PropertyEditorDefinition::<usize>::default());
142        container.insert(Vec3PropertyEditorDefinition::<isize>::default());
143
144        container.insert(Vec2PropertyEditorDefinition::<f64>::default());
145        container.insert(Vec2PropertyEditorDefinition::<f32>::default());
146        container.insert(Vec2PropertyEditorDefinition::<i64>::default());
147        container.insert(Vec2PropertyEditorDefinition::<u64>::default());
148        container.insert(Vec2PropertyEditorDefinition::<i32>::default());
149        container.insert(Vec2PropertyEditorDefinition::<u32>::default());
150        container.insert(Vec2PropertyEditorDefinition::<i16>::default());
151        container.insert(Vec2PropertyEditorDefinition::<u16>::default());
152        container.insert(Vec2PropertyEditorDefinition::<i8>::default());
153        container.insert(Vec2PropertyEditorDefinition::<u8>::default());
154        container.insert(Vec2PropertyEditorDefinition::<usize>::default());
155        container.insert(Vec2PropertyEditorDefinition::<isize>::default());
156
157        container.insert(RangePropertyEditorDefinition::<f64>::new());
158        container.insert(RangePropertyEditorDefinition::<f32>::new());
159        container.insert(RangePropertyEditorDefinition::<i64>::new());
160        container.insert(RangePropertyEditorDefinition::<u64>::new());
161        container.insert(RangePropertyEditorDefinition::<i32>::new());
162        container.insert(RangePropertyEditorDefinition::<u32>::new());
163        container.insert(RangePropertyEditorDefinition::<i16>::new());
164        container.insert(RangePropertyEditorDefinition::<u16>::new());
165        container.insert(RangePropertyEditorDefinition::<i8>::new());
166        container.insert(RangePropertyEditorDefinition::<u8>::new());
167        container.insert(RangePropertyEditorDefinition::<usize>::new());
168        container.insert(RangePropertyEditorDefinition::<isize>::new());
169
170        container.insert(QuatPropertyEditorDefinition::<f64>::default());
171        container.insert(QuatPropertyEditorDefinition::<f32>::default());
172
173        container.insert(RectPropertyEditorDefinition::<f64>::new());
174        container.insert(RectPropertyEditorDefinition::<f32>::new());
175        container.insert(RectPropertyEditorDefinition::<i32>::new());
176        container.insert(RectPropertyEditorDefinition::<u32>::new());
177        container.insert(RectPropertyEditorDefinition::<i16>::new());
178        container.insert(RectPropertyEditorDefinition::<u16>::new());
179        container.insert(RectPropertyEditorDefinition::<i8>::new());
180        container.insert(RectPropertyEditorDefinition::<u8>::new());
181        container.insert(RectPropertyEditorDefinition::<usize>::new());
182        container.insert(RectPropertyEditorDefinition::<isize>::new());
183
184        container.insert(ColorPropertyEditorDefinition);
185
186        container
187    }
188
189    pub fn insert<T: PropertyEditorDefinition + 'static>(
190        &mut self,
191        definition: T,
192    ) -> Option<Rc<dyn PropertyEditorDefinition>> {
193        self.definitions
194            .insert(definition.value_type_id(), Rc::new(definition))
195    }
196
197    pub fn definitions(&self) -> &FxHashMap<TypeId, Rc<dyn PropertyEditorDefinition>> {
198        &self.definitions
199    }
200}