rg3d_ui/inspector/editors/
mod.rs1use 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 editor: Handle<UiNode>,
61 },
62 Custom {
63 container: Handle<UiNode>,
64
65 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}