private VectorEditor CreateVectorEditor(Vector2 value, int column, int row) { var vector = new VectorEditor() { Dock = DockStyle.Fill, AutoSize = true, Value = value, }; tableLayoutPanel.Controls.Add(vector, column, row); vector.ValueChanged += OnVectorValueChanged; return(vector); }
private async Task <DependencyObject> GetEditorForType(object originalObject, object value, Type memberType, string propertyPath, string memberName, Type declaringTypeToIgnore) { DependencyObject result = null; if (memberType.IsEnum) { var editor = new EnumEditor { EnumType = memberType, PropertyName = propertyPath, Title = memberName, Value = value }; editor.ValueChangedCommand = new RelayCommand <EditableValueChangedEventArgs <object> >(e => this.UpdateProperty(e.PropertyName, value, e.Value, originalObject, editor), true); result = editor; } else if (memberType == typeof(string)) { var editor = new StringEditor { PropertyName = propertyPath, Title = memberName, Value = (string)value }; editor.ValueChangedCommand = new RelayCommand <EditableValueChangedEventArgs <string> >(e => this.UpdateProperty(e.PropertyName, (string)value, e.Value, originalObject, editor), true); result = editor; } else if (memberType == typeof(int)) { var editor = new IntEditor { PropertyName = propertyPath, Title = memberName, Value = (int)value }; editor.ValueChangedCommand = new RelayCommand <EditableValueChangedEventArgs <int> >(e => this.UpdateProperty(e.PropertyName, (int)value, e.Value, originalObject, editor), true); result = editor; } else if (memberType == typeof(float)) { var editor = new FloatEditor { PropertyName = propertyPath, Title = memberName, Value = (float)value }; editor.ValueChangedCommand = new RelayCommand <EditableValueChangedEventArgs <float> >(e => this.UpdateProperty(e.PropertyName, (float)value, e.Value, originalObject, editor), true); result = editor; } else if (memberType == typeof(bool)) { var editor = new BoolEditor { PropertyName = propertyPath, Title = memberName, Value = (bool)value }; editor.ValueChangedCommand = new RelayCommand <EditableValueChangedEventArgs <bool> >(e => this.UpdateProperty(e.PropertyName, (bool)value, e.Value, originalObject, editor), true); result = editor; } else if (memberType == typeof(Vector2)) { var editor = new VectorEditor { PropertyName = propertyPath, Title = memberName, Value = (Vector2)value }; editor.ValueChangedCommand = new RelayCommand <EditableValueChangedEventArgs <Vector2> >(e => this.UpdateProperty(e.PropertyName, (Vector2)value, e.Value, originalObject, editor), true); result = editor; } else if (memberType == typeof(Microsoft.Xna.Framework.Point)) { var editor = new PointEditor { PropertyName = propertyPath, Title = memberName, Value = (Microsoft.Xna.Framework.Point)value }; editor.ValueChangedCommand = new RelayCommand <EditableValueChangedEventArgs <Microsoft.Xna.Framework.Point> >(e => this.UpdateProperty(e.PropertyName, (Microsoft.Xna.Framework.Point)value, e.Value, originalObject, editor), true); result = editor; } else if (memberType == typeof(Microsoft.Xna.Framework.Color)) { var editor = new ColorEditor { PropertyName = propertyPath, Title = memberName, Value = (Microsoft.Xna.Framework.Color)value }; editor.ValueChangedCommand = new RelayCommand <EditableValueChangedEventArgs <Microsoft.Xna.Framework.Color> >(e => this.UpdateProperty(e.PropertyName, (Microsoft.Xna.Framework.Color)value, e.Value, originalObject, editor), true); result = editor; } else if (memberType == typeof(Sprite)) { var editor = new SpriteEditor { PropertyName = propertyPath, Title = memberName, Value = value as Sprite }; if (value is Sprite sprite) { var spriteWrappers = this._projectService.CurrentProject.AssetFolder.GetAssetsOfType <SpriteWrapper>(); editor.SpriteWrapper = spriteWrappers.FirstOrDefault(x => x.Sprite.Id == sprite.Id); } editor.ValueChangedCommand = new RelayCommand <EditableValueChangedEventArgs <Sprite> >(e => this.UpdateProperty(e.PropertyName, value as Sprite, e.Value, originalObject, editor), true); editor.SelectSpriteCommand = new RelayCommand(() => { var asset = this._dialogService.ShowSelectAssetDialog(this._projectService.CurrentProject, AssetType.Image | AssetType.Sprite, AssetType.Sprite); if (asset is SpriteWrapper spriteWrapper) { editor.SpriteWrapper = spriteWrapper; } }, true); result = editor; } else if (memberType == typeof(AudioClip)) { var editor = new AudioClipEditor { PropertyName = propertyPath, Title = memberName, Value = value as AudioClip }; editor.ValueChangedCommand = new RelayCommand <EditableValueChangedEventArgs <AudioClip> >(e => this.UpdateProperty(e.PropertyName, value as AudioClip, e.Value, originalObject, editor), true); editor.SelectAudioClipCommand = new RelayCommand(() => { var asset = this._dialogService.ShowSelectAssetDialog(this._projectService.CurrentProject, AssetType.Audio, AssetType.Audio); if (asset is AudioAsset audioAsset) { editor.Value = audioAsset.AudioClip; } }, true); result = editor; } else if (memberType == typeof(SpriteAnimation)) { var editor = new SpriteAnimationEditor { PropertyName = propertyPath, Title = memberName, Value = value as SpriteAnimation }; if (value is SpriteAnimation animation) { var spriteAnimationAssets = this._projectService.CurrentProject.AssetFolder.GetAssetsOfType <SpriteAnimationAsset>(); editor.Asset = spriteAnimationAssets.FirstOrDefault(x => x.SavableValue.Id == animation.Id); } editor.ValueChangedCommand = new RelayCommand <EditableValueChangedEventArgs <SpriteAnimation> >(e => this.UpdateProperty(e.PropertyName, value as SpriteAnimation, e.Value, originalObject, editor), true); editor.SelectSpriteAnimationCommand = new RelayCommand(() => { var asset = this._dialogService.ShowSelectAssetDialog(this._projectService.CurrentProject, AssetType.SpriteAnimation, AssetType.SpriteAnimation); if (asset is SpriteAnimationAsset spriteAnimationAsset) { editor.Asset = spriteAnimationAsset; editor.Value = spriteAnimationAsset.SavableValue; } }, true); result = editor; } else if (memberType == typeof(Font)) { var editor = new FontEditor { PropertyName = propertyPath, Title = memberName, Value = value as Font }; if (value is Font font) { var fontAssets = this._projectService.CurrentProject.AssetFolder.GetAssetsOfType <FontAsset>(); editor.Asset = fontAssets.FirstOrDefault(x => x.SavableValue.Id == font.Id); } editor.ValueChangedCommand = new RelayCommand <EditableValueChangedEventArgs <Font> >(e => this.UpdateProperty(e.PropertyName, value as Font, e.Value, originalObject, editor), true); editor.SelectFontCommand = new RelayCommand(() => { var asset = this._dialogService.ShowSelectAssetDialog(this._projectService.CurrentProject, AssetType.Font, AssetType.Font); if (asset is FontAsset fontAsset) { editor.Asset = fontAsset; editor.Value = fontAsset.SavableValue; } }, true); result = editor; } else if (memberType == typeof(Collider)) { var colliderTypes = await this._assemblyService.LoadTypes(typeof(Collider)); colliderTypes.Remove(typeof(PolygonCollider)); // TODO: Eventually allow PolygonCollider. var editor = new ColliderEditor { ColliderTypes = colliderTypes, PropertyName = propertyPath, Title = memberName, Value = (Collider)value }; editor.ValueChangedCommand = new RelayCommand <EditableValueChangedEventArgs <Collider> >(e => this.UpdateProperty(e.PropertyName, (Collider)value, e.Value, originalObject, editor), true); result = editor; } else if (memberType == typeof(LineCollider)) { var colliderTypes = await this._assemblyService.LoadTypes(typeof(Collider)); var editor = new LineColliderEditor { PropertyName = propertyPath, Title = memberName, Value = (LineCollider)value }; editor.ValueChangedCommand = new RelayCommand <EditableValueChangedEventArgs <LineCollider> >(e => this.UpdateProperty(e.PropertyName, (LineCollider)value, e.Value, originalObject, editor), true); result = editor; } else if (memberType == typeof(RectangleCollider)) { var colliderTypes = await this._assemblyService.LoadTypes(typeof(Collider)); var editor = new RectangleColliderEditor { PropertyName = propertyPath, Title = memberName, Value = (RectangleCollider)value }; editor.ValueChangedCommand = new RelayCommand <EditableValueChangedEventArgs <RectangleCollider> >(e => this.UpdateProperty(e.PropertyName, (RectangleCollider)value, e.Value, originalObject, editor), true); result = editor; } else if (memberType.IsSubclassOf(typeof(BaseComponent))) { // TODO: Allow user to select a component. } else { // TODO: I don't know, this should probably work when value is null if (value != null) { var editor = new GenericValueEditor { DeclaringType = declaringTypeToIgnore, PropertyName = propertyPath, Title = memberName, Value = value }; editor.ValueChangedCommand = new RelayCommand <EditableValueChangedEventArgs <object> >(e => this.UpdateProperty(e.PropertyName, value, e.Value, originalObject, editor), true); result = editor; } } return(result); }