public Control AddItemControl(PropertyModelView.OptionItemPropertyDescriptor prop, TableLayoutPanel clientControl, int count) { System.Windows.Forms.Binding viewBinding; bool span = false; string bindingTarget = "Value"; Control inputControl = prop.GetAttribute(OptionItem.CUSTOM_DIALOGITEM_EDITOR) as Control; if (inputControl != null && inputControl is IDialogItemControl) { span = true; } else { Type editorType = prop.GetAttribute(OptionItem.CUSTOM_DIALOGITEM_EDITOR) as Type; if (editorType != null) { Control c = System.Activator.CreateInstance(editorType) as Control; if (c != null && c is IDialogItemControl) { inputControl = c; span = true; } } else { //now build default editors if (prop is PropertyModelView.OptionGroupPropertyDescriptor) { inputControl = new DialogSectionControl(_enclosingInstance, prop.GetChildProperties(), prop, true); span = true; //don't bind... bindingTarget = null; } else if (prop.Type == typeof(bool)) { //checkbox for bools inputControl = new CheckBoxWrapper(); bool supportUndefined = (bool)prop.GetAttribute(OptionItem.SUPPORT_UNDEFINED_VALUE_ATTRIBUTE); ((CheckBoxWrapper)inputControl).ThreeState = supportUndefined && prop.GetValue(this) == OptionItem.VALUE_UNDEFINED; } else { inputControl = new GenericValueEditor(prop); } } } inputControl.Size = inputControl.GetPreferredSize(new Size()); clientControl.Controls.Add(inputControl, 1, count); _enclosingInstance.inputControls.Add(inputControl); inputControl.Anchor = AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Top; inputControl.Enabled = prop.Enabled; if (span) { clientControl.SetColumnSpan(inputControl, 2); } else { Label inputLabel = new Label(); inputLabel.AutoSize = true; inputLabel.TextAlign = ContentAlignment.MiddleLeft; inputLabel.Text = prop.DisplayName + ":"; //todo: needs serious overhaul... inputLabel.Anchor = AnchorStyles.Left | AnchorStyles.Bottom | AnchorStyles.Top; clientControl.Controls.Add(inputLabel, 0, count); } if (bindingTarget != null) { viewBinding = new System.Windows.Forms.Binding(bindingTarget, _enclosingInstance.bindingSource, prop.Name, true, DataSourceUpdateMode.OnPropertyChanged); inputControl.DataBindings.Add(viewBinding); } return(inputControl); }
/// <summary> /// Creates the editor service. /// </summary> /// <param name="editor">The cell editor.</param> public GenericValueEditorService(GenericValueEditor editor) { this.editor = editor; }
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); }