use crate::style::{StyleProperty, StylePropertyContainer};
use crate::{
absm::{EventAction, EventKind},
bit::BitField,
border::Border,
brush::{Brush, GradientPoint},
button::Button,
canvas::Canvas,
core::{
algebra::{Matrix2, Matrix3, Matrix4, SMatrix, UnitQuaternion, Vector2, Vector3, Vector4},
color::Color,
color_gradient::ColorGradient,
math::{curve::Curve, Rect, SmoothAngle},
parking_lot::{Mutex, RwLock, RwLockReadGuard, RwLockWriteGuard},
pool::Handle,
reflect::prelude::*,
sstorage::ImmutableString,
uuid::Uuid,
visitor::prelude::*,
SafeLock,
},
decorator::Decorator,
dropdown_list::DropdownList,
expander::Expander,
font::FontResource,
formatted_text::{FormattedText, Run, RunSet, WrapMode},
grid::{Grid, GridDimension, SizeMode},
image::Image,
inspector::{
editors::{
array::ArrayPropertyEditorDefinition,
bool::BoolPropertyEditorDefinition,
cell::CellPropertyEditorDefinition,
char::CharPropertyEditorDefinition,
collection::{CollectionItem, VecCollectionPropertyEditorDefinition},
color::{ColorGradientPropertyEditorDefinition, ColorPropertyEditorDefinition},
curve::CurvePropertyEditorDefinition,
enumeration::{EnumPropertyEditorDefinition, InspectableEnum},
immutable_string::ImmutableStringPropertyEditorDefinition,
inherit::InheritablePropertyEditorDefinition,
inspectable::InspectablePropertyEditorDefinition,
key::KeyBindingPropertyEditorDefinition,
matrix2::MatrixPropertyEditorDefinition,
numeric::NumericPropertyEditorDefinition,
path::PathPropertyEditorDefinition,
quat::QuatPropertyEditorDefinition,
range::RangePropertyEditorDefinition,
rect::RectPropertyEditorDefinition,
refcell::RefCellPropertyEditorDefinition,
string::StringPropertyEditorDefinition,
style::StyledPropertyEditorDefinition,
texture_slice::TextureSlicePropertyEditorDefinition,
utf32::Utf32StringPropertyEditorDefinition,
uuid::UuidPropertyEditorDefinition,
vec::{
Vec2PropertyEditorDefinition, Vec3PropertyEditorDefinition,
Vec4PropertyEditorDefinition,
},
},
InspectorEnvironment, InspectorError, PropertyChanged, PropertyFilter,
},
key::{HotKeyEditor, KeyBinding, KeyBindingEditor},
list_view::{ListView, ListViewItem},
menu::{Menu, MenuItem},
message::{CursorIcon, UiMessage},
messagebox::MessageBox,
nine_patch::{NinePatch, StretchMode},
numeric::NumericUpDown,
path::PathEditor,
popup::Popup,
progress_bar::ProgressBar,
range::RangeEditor,
rect::RectEditor,
scroll_bar::ScrollBar,
scroll_panel::ScrollPanel,
stack_panel::StackPanel,
style::StyledProperty,
tab_control::TabControl,
text::Text,
text_box::{Position, SelectionRange, TextBox, TextCommitMode},
tree::{Tree, TreeRoot},
uuid::UuidEditor,
vec::VecEditor,
vector_image::{Primitive, VectorImage},
widget::Widget,
window::Window,
wrap_panel::WrapPanel,
BuildContext, HorizontalAlignment, Orientation, RcUiNodeHandle, RcUiNodeHandleInner, Thickness,
UiNode, UserInterface, VerticalAlignment,
};
use fxhash::FxHashMap;
use fyrox_animation::machine::Parameter;
use fyrox_core::pool::ObjectOrVariant;
use fyrox_texture::TextureResource;
use std::{
any::{Any, TypeId},
cell::RefCell,
fmt::Debug,
fmt::Formatter,
ops::Range,
path::PathBuf,
str::FromStr,
sync::Arc,
};
use strum::VariantNames;
pub mod array;
pub mod bit;
pub mod bool;
pub mod cell;
pub mod char;
pub mod collection;
pub mod color;
pub mod curve;
pub mod enumeration;
pub mod immutable_string;
pub mod inherit;
pub mod inspectable;
pub mod key;
pub mod matrix2;
pub mod numeric;
pub mod path;
pub mod quat;
pub mod range;
pub mod rect;
pub mod refcell;
pub mod string;
pub mod style;
pub mod texture_slice;
pub mod utf32;
pub mod uuid;
pub mod vec;
pub struct PropertyEditorBuildContext<'a, 'b, 'c, 'd> {
pub build_context: &'a mut BuildContext<'c>,
pub property_info: &'b FieldRef<'b, 'd>,
pub environment: Option<Arc<dyn InspectorEnvironment>>,
pub definition_container: Arc<PropertyEditorDefinitionContainer>,
pub layer_index: usize,
pub generate_property_string_values: bool,
pub filter: PropertyFilter,
pub name_column_width: f32,
pub base_path: String,
pub has_parent_object: bool,
}
pub struct PropertyEditorMessageContext<'a, 'b, 'c> {
pub instance: Handle<UiNode>,
pub ui: &'b mut UserInterface,
pub property_info: &'a FieldRef<'a, 'c>,
pub definition_container: Arc<PropertyEditorDefinitionContainer>,
pub layer_index: usize,
pub environment: Option<Arc<dyn InspectorEnvironment>>,
pub generate_property_string_values: bool,
pub filter: PropertyFilter,
pub name_column_width: f32,
pub base_path: String,
pub has_parent_object: bool,
}
pub struct PropertyEditorTranslationContext<'b, 'c> {
pub environment: Option<Arc<dyn InspectorEnvironment>>,
pub name: &'b str,
pub message: &'c UiMessage,
pub definition_container: Arc<PropertyEditorDefinitionContainer>,
}
#[derive(Clone, Debug, PartialEq, Visit, Reflect)]
pub enum PropertyEditorInstance {
Simple {
editor: Handle<UiNode>,
},
Custom {
container: Handle<UiNode>,
editor: Handle<UiNode>,
},
}
impl Default for PropertyEditorInstance {
fn default() -> Self {
Self::Simple {
editor: Default::default(),
}
}
}
impl PropertyEditorInstance {
pub fn simple(editor: Handle<impl ObjectOrVariant<UiNode>>) -> Self {
Self::Simple {
editor: editor.to_base(),
}
}
pub fn editor(&self) -> Handle<UiNode> {
match self {
PropertyEditorInstance::Simple { editor }
| PropertyEditorInstance::Custom { editor, .. } => *editor,
}
}
}
pub trait PropertyEditorDefinition: Debug + Send + Sync {
fn value_type_id(&self) -> TypeId;
fn create_instance(
&self,
ctx: PropertyEditorBuildContext,
) -> Result<PropertyEditorInstance, InspectorError>;
fn create_message(
&self,
ctx: PropertyEditorMessageContext,
) -> Result<Option<UiMessage>, InspectorError>;
fn translate_message(&self, ctx: PropertyEditorTranslationContext) -> Option<PropertyChanged>;
}
pub struct PropertyEditorDefinitionContainerEntry {
pub source_type_id: TypeId,
pub property_editor: Box<dyn PropertyEditorDefinition>,
}
pub struct PropertyEditorDefinitionContainer {
pub context_type_id: Mutex<TypeId>,
definitions: RwLock<FxHashMap<TypeId, PropertyEditorDefinitionContainerEntry>>,
}
impl Debug for PropertyEditorDefinitionContainer {
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
write!(f, "PropertyEditorDefinitionContainer")
}
}
impl Default for PropertyEditorDefinitionContainer {
fn default() -> Self {
Self {
context_type_id: Mutex::new(().type_id()),
definitions: Default::default(),
}
}
}
macro_rules! reg_array_property_editor {
($container:ident, $ty:ty, $($count:literal),*) => {
$(
$container.insert(ArrayPropertyEditorDefinition::<$ty, $count>::new());
)*
}
}
macro_rules! reg_property_editor {
($container:ident, $base:ident:$init:ident, $($ty:ty),*) => {
$(
$container.insert($base::<$ty>::$init());
)*
}
}
macro_rules! reg_inspectables {
($container:ident, $($ty:ty),*) => {
$(
$container.insert(InspectablePropertyEditorDefinition::<$ty>::new());
)*
}
}
macro_rules! reg_matrix_property_editor {
($container:ident, $base:ident[$rows:expr, $columns:expr]:$init:ident, $($ty:ty),*) => {
$(
$container.insert($base::<$rows, $columns, $ty>::$init());
)*
}
}
impl PropertyEditorDefinitionContainer {
pub fn empty() -> Self {
Self::default()
}
pub fn with_default_editors() -> Self {
let container = Self::default();
container.insert(InheritablePropertyEditorDefinition::<bool>::new());
container.insert(BoolPropertyEditorDefinition);
container.insert(CellPropertyEditorDefinition::<bool>::new());
container.insert(StringPropertyEditorDefinition);
container.insert(InheritablePropertyEditorDefinition::<String>::new());
container.insert(VecCollectionPropertyEditorDefinition::<String>::new());
container.insert(ImmutableStringPropertyEditorDefinition);
container.insert(InheritablePropertyEditorDefinition::<ImmutableString>::new());
container.insert(VecCollectionPropertyEditorDefinition::<ImmutableString>::new());
reg_property_editor! { container, NumericPropertyEditorDefinition: default, f64, f32, i64, u64, i32, u32, i16, u16, i8, u8, usize, isize }
reg_property_editor! { container, InheritablePropertyEditorDefinition: new, f64, f32, i64, u64, i32, u32, i16, u16, i8, u8, usize, isize }
reg_property_editor! { container, CellPropertyEditorDefinition: new, f64, f32, i64, u64, i32, u32, i16, u16, i8, u8, usize, isize }
reg_property_editor! { container, Vec4PropertyEditorDefinition: default, f64, f32, i64, u64, i32, u32, i16, u16, i8, u8, usize, isize }
reg_property_editor! { container, InheritablePropertyEditorDefinition: new,
Vector4<f64>, Vector4<f32>, Vector4<i64>, Vector4<u64>, Vector4<i32>, Vector4<u32>,
Vector4<i16>, Vector4<u16>, Vector4<i8>, Vector4<u8>, Vector4<usize>, Vector4<isize>
}
reg_property_editor! { container, Vec3PropertyEditorDefinition: default, f64, f32, i64, u64, i32, u32, i16, u16, i8, u8, usize, isize }
reg_property_editor! { container, InheritablePropertyEditorDefinition: new,
Vector3<f64>, Vector3<f32>, Vector3<i64>, Vector3<u64>, Vector3<i32>, Vector3<u32>,
Vector3<i16>, Vector3<u16>, Vector3<i8>, Vector3<u8>, Vector3<usize>, Vector3<isize>
}
reg_property_editor! { container, Vec2PropertyEditorDefinition: default, f64, f32, i64, u64, i32, u32, i16, u16, i8, u8, usize, isize }
reg_property_editor! { container, InheritablePropertyEditorDefinition: new,
Vector2<f64>, Vector2<f32>, Vector2<i64>, Vector2<u64>, Vector2<i32>, Vector2<u32>,
Vector2<i16>, Vector2<u16>, Vector2<i8>, Vector2<u8>, Vector2<usize>, Vector2<isize>
}
reg_matrix_property_editor! { container, MatrixPropertyEditorDefinition[2, 2]: default, f64, f32, i64, u64, i32, u32, i16, u16, i8, u8, usize, isize }
reg_matrix_property_editor! { container, MatrixPropertyEditorDefinition[3, 3]: default, f64, f32, i64, u64, i32, u32, i16, u16, i8, u8, usize, isize }
reg_matrix_property_editor! { container, MatrixPropertyEditorDefinition[4, 4]: default, f64, f32, i64, u64, i32, u32, i16, u16, i8, u8, usize, isize }
container.insert(VecCollectionPropertyEditorDefinition::<SMatrix<f32, 2, 2>>::new());
container.insert(VecCollectionPropertyEditorDefinition::<SMatrix<f32, 3, 3>>::new());
container.insert(VecCollectionPropertyEditorDefinition::<SMatrix<f32, 4, 4>>::new());
container.insert(VecCollectionPropertyEditorDefinition::<SMatrix<f64, 2, 2>>::new());
container.insert(VecCollectionPropertyEditorDefinition::<SMatrix<f64, 3, 3>>::new());
container.insert(VecCollectionPropertyEditorDefinition::<SMatrix<f64, 4, 4>>::new());
container.insert(CellPropertyEditorDefinition::<Matrix2<f32>>::new());
container.insert(CellPropertyEditorDefinition::<Matrix3<f32>>::new());
container.insert(CellPropertyEditorDefinition::<Matrix4<f32>>::new());
reg_property_editor! { container, RangePropertyEditorDefinition: new, f64, f32, i64, u64, i32, u32, i16, u16, i8, u8, usize, isize }
reg_property_editor! { container, InheritablePropertyEditorDefinition: new,
Range<f64>, Range<f32>, Range<i64>, Range<u64>, Range<i32>, Range<u32>,
Range<i16>, Range<u16>, Range<i8>, Range<u8>, Range<usize>, Range<isize>
}
container.insert(QuatPropertyEditorDefinition::<f64>::default());
container.insert(InheritablePropertyEditorDefinition::<UnitQuaternion<f64>>::new());
container.insert(QuatPropertyEditorDefinition::<f32>::default());
container.insert(InheritablePropertyEditorDefinition::<UnitQuaternion<f32>>::new());
reg_property_editor! { container, RectPropertyEditorDefinition: new, f64, f32, i64, u64, i32, u32, i16, u16, i8, u8, usize, isize }
reg_property_editor! { container, InheritablePropertyEditorDefinition: new,
Rect<f64>, Rect<f32>, Rect<i64>, Rect<u64>, Rect<i32>, Rect<u32>,
Rect<i16>, Rect<u16>, Rect<i8>, Rect<u8>, Rect<usize>, Rect<isize>
}
reg_property_editor! { container, InheritablePropertyEditorDefinition: new,
Option<Rect<f64>>, Option<Rect<f32>>, Option<Rect<i64>>, Option<Rect<u64>>, Option<Rect<i32>>, Option<Rect<u32>>,
Option<Rect<i16>>, Option<Rect<u16>>, Option<Rect<i8>>, Option<Rect<u8>>, Option<Rect<usize>>, Option<Rect<isize>>
}
reg_property_editor! { container, EnumPropertyEditorDefinition: new_optional,
Rect<f64>, Rect<f32>, Rect<i64>, Rect<u64>, Rect<i32>, Rect<u32>,
Rect<i16>, Rect<u16>, Rect<i8>, Rect<u8>, Rect<usize>, Rect<isize>
}
reg_property_editor! { container, EnumPropertyEditorDefinition: new_optional, f64, f32, i64, u64, i32, u32, i16, u16, i8, u8, usize, isize }
reg_property_editor! { container, InheritablePropertyEditorDefinition: new,
Option<f64>, Option<f32>, Option<i64>, Option<u64>, Option<i32>, Option<u32>,
Option<i16>, Option<u16>, Option<i8>, Option<u8>, Option<usize>, Option<isize>
}
container.insert(PathPropertyEditorDefinition);
container.insert(VecCollectionPropertyEditorDefinition::<PathBuf>::new());
container.insert(ColorPropertyEditorDefinition);
container.insert(InheritablePropertyEditorDefinition::<Color>::new());
reg_array_property_editor! { container, f64, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 }
reg_array_property_editor! { container, f32, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 }
reg_array_property_editor! { container, u64, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 }
reg_array_property_editor! { container, i64, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 }
reg_array_property_editor! { container, u32, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 }
reg_array_property_editor! { container, i32, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 }
reg_array_property_editor! { container, u16, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 }
reg_array_property_editor! { container, i16, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 }
reg_array_property_editor! { container, u8, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 }
reg_array_property_editor! { container, i8, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 }
reg_array_property_editor! { container, u8, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 }
reg_array_property_editor! { container, usize, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 }
reg_array_property_editor! { container, isize, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 }
container.register_inheritable_inspectable::<SmoothAngle>();
container.insert(UuidPropertyEditorDefinition);
container.insert(InheritablePropertyEditorDefinition::<Uuid>::new());
container.insert(ColorGradientPropertyEditorDefinition);
container.insert(InheritablePropertyEditorDefinition::<ColorGradient>::new());
container.insert(KeyBindingPropertyEditorDefinition);
container.insert(InheritablePropertyEditorDefinition::<KeyBinding>::new());
container.insert(CurvePropertyEditorDefinition);
container.insert(InheritablePropertyEditorDefinition::<Curve>::new());
container.register_inheritable_styleable_enum::<Brush, _>();
container.register_inheritable_enum::<Orientation, _>();
container.register_inheritable_enum::<VerticalAlignment, _>();
container.register_inheritable_enum::<HorizontalAlignment, _>();
container.register_inheritable_enum::<WrapMode, _>();
container.register_inheritable_enum::<Primitive, _>();
container.register_inheritable_enum::<SizeMode, _>();
container.insert(EnumPropertyEditorDefinition::<CursorIcon>::new());
container.insert(EnumPropertyEditorDefinition::<CursorIcon>::new_optional());
container.insert(EnumPropertyEditorDefinition::<bool>::new_optional());
container.insert(InheritablePropertyEditorDefinition::<Option<bool>>::new());
container.insert(InheritablePropertyEditorDefinition::<Option<CursorIcon>>::new());
container.register_inheritable_vec_collection::<GradientPoint>();
container.register_inheritable_vec_collection::<Primitive>();
container.insert(RefCellPropertyEditorDefinition::<FormattedText>::new());
container.insert(VecCollectionPropertyEditorDefinition::<GridDimension>::new());
container.insert(RefCellPropertyEditorDefinition::<Vec<GridDimension>>::new());
container.insert(InheritablePropertyEditorDefinition::<
RefCell<Vec<GridDimension>>,
>::new());
container.insert(Utf32StringPropertyEditorDefinition);
container.insert(InheritablePropertyEditorDefinition::<Vec<char>>::new());
container.insert(InheritablePropertyEditorDefinition::<Thickness>::new());
container.register_inheritable_enum::<EventKind, _>();
container.register_inheritable_enum::<StretchMode, _>();
container.insert(InspectablePropertyEditorDefinition::<EventAction>::new());
container.register_inheritable_vec_collection::<EventAction>();
container.insert(EnumPropertyEditorDefinition::<Parameter>::new());
container.insert(EnumPropertyEditorDefinition::<TextCommitMode>::new());
container.insert(InheritablePropertyEditorDefinition::<TextCommitMode>::new());
container.insert(EnumPropertyEditorDefinition::<SelectionRange>::new_optional());
container.insert(InheritablePropertyEditorDefinition::<Option<SelectionRange>>::new());
container.register_inheritable_inspectable::<Position>();
container.insert(EnumPropertyEditorDefinition::<RcUiNodeHandle>::new_optional());
container.insert(InspectablePropertyEditorDefinition::<RcUiNodeHandle>::new());
container.insert(InspectablePropertyEditorDefinition::<RcUiNodeHandleInner>::new());
container.insert(InspectablePropertyEditorDefinition::<
Arc<Mutex<RcUiNodeHandleInner>>,
>::new());
container.insert(TextureSlicePropertyEditorDefinition);
container.insert(InspectablePropertyEditorDefinition::<RunSet>::new());
container.insert(InspectablePropertyEditorDefinition::<Run>::new());
container.insert(VecCollectionPropertyEditorDefinition::<Run>::new());
container.insert(EnumPropertyEditorDefinition::<FontResource>::new_optional());
container.insert(EnumPropertyEditorDefinition::<Brush>::new_optional());
container.insert(EnumPropertyEditorDefinition::<Vector2<f32>>::new_optional());
container.insert(InheritablePropertyEditorDefinition::<Option<char>>::new());
container.insert(EnumPropertyEditorDefinition::<char>::new_optional());
container.insert(CharPropertyEditorDefinition);
container.insert(InheritablePropertyEditorDefinition::<StyledProperty<f32>>::new());
container.insert(StyledPropertyEditorDefinition::<f32>::new());
container.insert(InheritablePropertyEditorDefinition::<StyledProperty<Color>>::new());
container.insert(StyledPropertyEditorDefinition::<Color>::new());
container.insert(InheritablePropertyEditorDefinition::<
StyledProperty<Thickness>,
>::new());
container.insert(StyledPropertyEditorDefinition::<Thickness>::new());
container.insert(InheritablePropertyEditorDefinition::<
StyledProperty<TextureResource>,
>::new());
container.insert(StyledPropertyEditorDefinition::<TextureResource>::new());
container.insert(VecCollectionPropertyEditorDefinition::<
StylePropertyContainer,
>::new());
container.insert(InspectablePropertyEditorDefinition::<StylePropertyContainer>::new());
container.insert(EnumPropertyEditorDefinition::<StyleProperty>::new());
reg_inspectables!(
container,
Widget,
Border,
BitField<u8>,
BitField<i8>,
BitField<u16>,
BitField<i16>,
BitField<u32>,
BitField<i32>,
BitField<u64>,
BitField<i64>,
Button,
Canvas,
Decorator,
DropdownList,
Expander,
Grid,
Image,
HotKeyEditor,
KeyBindingEditor,
ListViewItem,
ListView,
Menu,
MenuItem,
MessageBox,
NinePatch,
NumericUpDown<u8>,
NumericUpDown<i8>,
NumericUpDown<u16>,
NumericUpDown<i16>,
NumericUpDown<u32>,
NumericUpDown<i32>,
NumericUpDown<u64>,
NumericUpDown<i64>,
NumericUpDown<f32>,
NumericUpDown<f64>,
PathEditor,
Popup,
ProgressBar,
RangeEditor<u8>,
RangeEditor<i8>,
RangeEditor<u16>,
RangeEditor<i16>,
RangeEditor<u32>,
RangeEditor<i32>,
RangeEditor<u64>,
RangeEditor<i64>,
RangeEditor<f32>,
RangeEditor<f64>,
RectEditor<u8>,
RectEditor<i8>,
RectEditor<u16>,
RectEditor<i16>,
RectEditor<u32>,
RectEditor<i32>,
RectEditor<u64>,
RectEditor<i64>,
RectEditor<f32>,
RectEditor<f64>,
ScrollBar,
ScrollPanel,
StackPanel,
TabControl,
Text,
TextBox,
Tree,
TreeRoot,
UuidEditor,
VecEditor<u8, 2>,
VecEditor<i8, 2>,
VecEditor<u16,2>,
VecEditor<i16,2>,
VecEditor<u32,2>,
VecEditor<i32,2>,
VecEditor<u64,2>,
VecEditor<i64,2>,
VecEditor<f32,2>,
VecEditor<f64,2>,
VecEditor<u8, 3>,
VecEditor<i8, 3>,
VecEditor<u16,3>,
VecEditor<i16,3>,
VecEditor<u32,3>,
VecEditor<i32,3>,
VecEditor<u64,3>,
VecEditor<i64,3>,
VecEditor<f32,3>,
VecEditor<f64,3>,
VecEditor<u8, 4>,
VecEditor<i8, 4>,
VecEditor<u16,4>,
VecEditor<i16,4>,
VecEditor<u32,4>,
VecEditor<i32,4>,
VecEditor<u64,4>,
VecEditor<i64,4>,
VecEditor<f32,4>,
VecEditor<f64,4>,
VectorImage,
Window,
WrapPanel,
GradientPoint,
Thickness,
FormattedText,
GridDimension
);
container
}
pub fn insert_raw(
&self,
definition: Box<dyn PropertyEditorDefinition>,
) -> Option<PropertyEditorDefinitionContainerEntry> {
self.definitions.write().insert(
definition.value_type_id(),
PropertyEditorDefinitionContainerEntry {
source_type_id: *self.context_type_id.safe_lock(),
property_editor: definition,
},
)
}
pub fn merge(&self, other: Self) {
for (_, definition) in other.definitions.into_inner() {
self.insert_raw(definition.property_editor);
}
}
pub fn insert<T>(&self, definition: T) -> Option<PropertyEditorDefinitionContainerEntry>
where
T: PropertyEditorDefinition + 'static,
{
self.definitions.write().insert(
definition.value_type_id(),
PropertyEditorDefinitionContainerEntry {
source_type_id: *self.context_type_id.safe_lock(),
property_editor: Box::new(definition),
},
)
}
pub fn register_inheritable_vec_collection<T>(&self)
where
T: CollectionItem + FieldValue,
{
assert!(self
.insert(VecCollectionPropertyEditorDefinition::<T>::new())
.is_none());
assert!(self
.insert(InheritablePropertyEditorDefinition::<Vec<T>>::new())
.is_none());
}
pub fn register_inheritable_inspectable<T>(&self)
where
T: Reflect + FieldValue,
{
assert!(self
.insert(InspectablePropertyEditorDefinition::<T>::new())
.is_none());
assert!(self
.insert(InheritablePropertyEditorDefinition::<T>::new())
.is_none());
}
pub fn register_inheritable_styleable_inspectable<T>(&self)
where
T: Reflect + FieldValue + Clone + PartialEq,
{
assert!(self
.insert(InspectablePropertyEditorDefinition::<T>::new())
.is_none());
assert!(self
.insert(InheritablePropertyEditorDefinition::<T>::new())
.is_none());
assert!(self
.insert(InheritablePropertyEditorDefinition::<StyledProperty<T>>::new())
.is_none());
assert!(self
.insert(StyledPropertyEditorDefinition::<T>::new())
.is_none());
}
pub fn register_inheritable_enum<T, E: Debug>(&self)
where
T: InspectableEnum + FieldValue + VariantNames + AsRef<str> + FromStr<Err = E> + Debug,
{
assert!(self
.insert(EnumPropertyEditorDefinition::<T>::new())
.is_none());
assert!(self
.insert(InheritablePropertyEditorDefinition::<T>::new())
.is_none());
}
pub fn register_inheritable_styleable_enum<T, E: Debug>(&self)
where
T: InspectableEnum
+ FieldValue
+ VariantNames
+ AsRef<str>
+ FromStr<Err = E>
+ Debug
+ PartialEq,
{
assert!(self
.insert(EnumPropertyEditorDefinition::<T>::new())
.is_none());
assert!(self
.insert(InheritablePropertyEditorDefinition::<T>::new())
.is_none());
assert!(self
.insert(InheritablePropertyEditorDefinition::<StyledProperty<T>>::new())
.is_none());
assert!(self
.insert(StyledPropertyEditorDefinition::<T>::new())
.is_none());
}
pub fn register_inheritable_option<T>(&self)
where
T: InspectableEnum + FieldValue + Default,
{
assert!(self
.insert(EnumPropertyEditorDefinition::<T>::new_optional())
.is_none());
assert!(self
.insert(InheritablePropertyEditorDefinition::<Option<T>>::new())
.is_none());
}
pub fn definitions(
&self,
) -> RwLockReadGuard<FxHashMap<TypeId, PropertyEditorDefinitionContainerEntry>> {
self.definitions.read()
}
pub fn definitions_mut(
&self,
) -> RwLockWriteGuard<FxHashMap<TypeId, PropertyEditorDefinitionContainerEntry>> {
self.definitions.write()
}
}