diff options
author | Jose Medrano <jose.medrano@microsoft.com> | 2018-12-13 16:35:04 +0300 |
---|---|---|
committer | Jose Medrano <jose.medrano@microsoft.com> | 2018-12-14 15:22:50 +0300 |
commit | 7878353a431562b81cfcde6d90f4a029fc89a50f (patch) | |
tree | 643d323fad42d2e64ed3871d31398efec0c390c4 | |
parent | cd248d8fa5306f3ab05fabc72d6e869dd616ba9a (diff) |
Adds implementation to handle char typeschar-editor
8 files changed, 163 insertions, 0 deletions
diff --git a/Xamarin.PropertyEditing.Mac/Controls/CharEditorControl.cs b/Xamarin.PropertyEditing.Mac/Controls/CharEditorControl.cs new file mode 100644 index 0000000..ed733bd --- /dev/null +++ b/Xamarin.PropertyEditing.Mac/Controls/CharEditorControl.cs @@ -0,0 +1,70 @@ +using System.Collections; +using AppKit; +using Xamarin.PropertyEditing.Mac.Resources; +using Xamarin.PropertyEditing.ViewModels; + +namespace Xamarin.PropertyEditing.Mac +{ + internal class CharEditorControl : PropertyEditorControl<PropertyViewModel<char>> + { + readonly CharTextField editor; + + public CharEditorControl () + { + editor = new CharTextField { + Font = NSFont.FromFontName (DefaultFontName, DefaultFontSize) + }; + + // update the value on keypress + editor.Changed += (sender, e) => { + if (editor.StringValue.Length > 0) { + ViewModel.Value = editor.StringValue[0]; + } else { + ViewModel.Value = default (char); + } + }; + AddSubview (editor); + + this.AddConstraints (new[] { + NSLayoutConstraint.Create (editor, NSLayoutAttribute.Top, NSLayoutRelation.Equal, this, NSLayoutAttribute.Top, 1f, 1f), + NSLayoutConstraint.Create (editor, NSLayoutAttribute.Width, NSLayoutRelation.Equal, this, NSLayoutAttribute.Width, 1f, -34f), + NSLayoutConstraint.Create (editor, NSLayoutAttribute.Height, NSLayoutRelation.Equal, 1f, DefaultControlHeight - 3), + }); + + UpdateTheme (); + } + + public override NSView FirstKeyView => editor; + public override NSView LastKeyView => editor; + + protected override void UpdateValue () + { + editor.StringValue = ViewModel.Value.ToString (); + } + + protected override void HandleErrorsChanged (object sender, System.ComponentModel.DataErrorsChangedEventArgs e) + { + UpdateErrorsDisplayed (ViewModel.GetErrors (ViewModel.Property.Name)); + } + + protected override void UpdateErrorsDisplayed (IEnumerable errors) + { + if (ViewModel.HasErrors) { + SetErrors (errors); + } else { + SetErrors (null); + SetEnabled (); + } + } + + protected override void SetEnabled () + { + editor.Editable = ViewModel.Property.CanWrite; + } + + protected override void UpdateAccessibilityValues () + { + editor.AccessibilityTitle = string.Format (LocalizationResources.AccessibilityChar, ViewModel.Property.Name); + } + } +} diff --git a/Xamarin.PropertyEditing.Mac/Controls/Custom/CharTextField.cs b/Xamarin.PropertyEditing.Mac/Controls/Custom/CharTextField.cs new file mode 100644 index 0000000..e073997 --- /dev/null +++ b/Xamarin.PropertyEditing.Mac/Controls/Custom/CharTextField.cs @@ -0,0 +1,78 @@ +using System;
+using AppKit; +using Foundation; + +namespace Xamarin.PropertyEditing.Mac +{ + public class CharTextField : NSTextField + {
+ string cachedValueString;
+ NSText CachedCurrentEditor { get; set; }
+ + public event EventHandler ValidatedEditingEnded;
+ + public override CoreGraphics.CGSize IntrinsicContentSize => new CoreGraphics.CGSize (30, 20); +
+ public CharTextField () + { + BackgroundColor = NSColor.Clear;
+ ControlSize = NSControlSize.Small;
+ StringValue = string.Empty;
+ TranslatesAutoresizingMaskIntoConstraints = false; + }
+
+ public override bool ShouldBeginEditing (NSText textObject)
+ {
+ CachedCurrentEditor = textObject;
+ cachedValueString = textObject.Value;
+ CachedCurrentEditor.Delegate = new CharValidationDelegate (this);
+ return true;
+ } + + public virtual void NotifyValidatedEditingEnded ()
+ {
+ ValidatedEditingEnded?.Invoke (this, EventArgs.Empty);
+ } + + public virtual void ResetInvalidInput ()
+ {
+ this.StringValue = cachedValueString;
+ } + } + + public class CharValidationDelegate : NSTextViewDelegate + { + readonly CharTextField textField; + + public CharValidationDelegate (CharTextField textField) + { + this.textField = textField; + } + + public override bool TextShouldBeginEditing (NSText textObject) + { + return textField.ShouldBeginEditing (textObject); + } + + public override bool TextShouldEndEditing (NSText textObject) + { + var shouldEndEditing = false; + + if (!char.TryParse (textObject.Value, out var result)) { + textField.ResetInvalidInput (); + AppKitFramework.NSBeep (); + textField.ShouldEndEditing (textObject); + } else { + shouldEndEditing = textField.ShouldEndEditing (textObject); + } + + return shouldEndEditing; + } + + public override void TextDidEndEditing (NSNotification notification) + { + textField.NotifyValidatedEditingEnded (); + textField.DidEndEditing (notification); + } + }
+} diff --git a/Xamarin.PropertyEditing.Mac/PropertyEditorSelector.cs b/Xamarin.PropertyEditing.Mac/PropertyEditorSelector.cs index f3f2afd..135d8bf 100644 --- a/Xamarin.PropertyEditing.Mac/PropertyEditorSelector.cs +++ b/Xamarin.PropertyEditing.Mac/PropertyEditorSelector.cs @@ -36,6 +36,7 @@ namespace Xamarin.PropertyEditing.Mac } private static readonly Dictionary<Type, Type> ViewModelTypes = new Dictionary<Type, Type> { + {typeof (PropertyViewModel<char>), typeof (CharEditorControl)}, {typeof (StringPropertyViewModel), typeof (StringEditorControl)}, {typeof (NumericPropertyViewModel<>), typeof (NumericEditorControl<>)}, {typeof (PropertyViewModel<bool?>), typeof (BooleanEditorControl)}, diff --git a/Xamarin.PropertyEditing.Mac/Resources/LocalizationResources.Designer.cs b/Xamarin.PropertyEditing.Mac/Resources/LocalizationResources.Designer.cs index 1a4f713..552f444 100644 --- a/Xamarin.PropertyEditing.Mac/Resources/LocalizationResources.Designer.cs +++ b/Xamarin.PropertyEditing.Mac/Resources/LocalizationResources.Designer.cs @@ -83,6 +83,12 @@ namespace Xamarin.PropertyEditing.Mac.Resources { } } + internal static string AccessibilityChar { + get { + return ResourceManager.GetString("AccessibilityChar", resourceCulture); + } + } + internal static string AccessibilityString { get { return ResourceManager.GetString("AccessibilityString", resourceCulture); diff --git a/Xamarin.PropertyEditing.Mac/Resources/LocalizationResources.resx b/Xamarin.PropertyEditing.Mac/Resources/LocalizationResources.resx index 9f97d73..6c1acaa 100644 --- a/Xamarin.PropertyEditing.Mac/Resources/LocalizationResources.resx +++ b/Xamarin.PropertyEditing.Mac/Resources/LocalizationResources.resx @@ -36,6 +36,10 @@ <value>{0} Combobox Editor</value> <comment>Editor for Combobox Value</comment> </data> + <data name="AccessibilityChar" xml:space="preserve"> + <value>{0} Char Editor</value> + <comment>Editor for Char Value</comment> + </data> <data name="AccessibilityString" xml:space="preserve"> <value>{0} String Editor</value> <comment>Editor for String Value</comment> diff --git a/Xamarin.PropertyEditing.Mac/Xamarin.PropertyEditing.Mac.csproj b/Xamarin.PropertyEditing.Mac/Xamarin.PropertyEditing.Mac.csproj index c2dc90d..0593dd2 100644 --- a/Xamarin.PropertyEditing.Mac/Xamarin.PropertyEditing.Mac.csproj +++ b/Xamarin.PropertyEditing.Mac/Xamarin.PropertyEditing.Mac.csproj @@ -143,6 +143,8 @@ <Compile Include="PropertyInlinePreviewSelector.cs" />
<Compile Include="Controls\EditorContainer.cs" />
<Compile Include="Controls\Layout.cs" />
+ <Compile Include="Controls\CharEditorControl.cs" />
+ <Compile Include="Controls\Custom\CharTextField.cs" />
</ItemGroup>
<ItemGroup>
<Folder Include="Controls\" />
diff --git a/Xamarin.PropertyEditing.Tests/MockControls/MockSampleControl.cs b/Xamarin.PropertyEditing.Tests/MockControls/MockSampleControl.cs index c724cc1..29541db 100644 --- a/Xamarin.PropertyEditing.Tests/MockControls/MockSampleControl.cs +++ b/Xamarin.PropertyEditing.Tests/MockControls/MockSampleControl.cs @@ -10,6 +10,7 @@ namespace Xamarin.PropertyEditing.Tests.MockControls { public MockSampleControl () { + AddProperty<char> ("Char", ReadWrite, valueSources: ValueSources.Local | ValueSources.Resource | ValueSources.Binding); AddProperty<bool> ("Boolean", ReadWrite, valueSources: ValueSources.Local | ValueSources.Resource | ValueSources.Binding); AddProperty<bool> ("UnsetBoolean", ReadWrite, valueSources: ValueSources.Local); AddProperty<int> ("Integer", ReadWrite); diff --git a/Xamarin.PropertyEditing/ViewModels/PropertiesViewModel.cs b/Xamarin.PropertyEditing/ViewModels/PropertiesViewModel.cs index 0ee785b..e50aafb 100644 --- a/Xamarin.PropertyEditing/ViewModels/PropertiesViewModel.cs +++ b/Xamarin.PropertyEditing/ViewModels/PropertiesViewModel.cs @@ -597,6 +597,7 @@ namespace Xamarin.PropertyEditing.ViewModels } = new AsyncWorkQueue(); private static readonly Dictionary<Type, Func<TargetPlatform, IPropertyInfo, IEnumerable<IObjectEditor>, PropertyVariation, PropertyViewModel>> ViewModelMap = new Dictionary<Type, Func<TargetPlatform, IPropertyInfo, IEnumerable<IObjectEditor>, PropertyVariation, PropertyViewModel>> { + { typeof(char), (tp,p,e,v) => new PropertyViewModel<char> (tp, p, e, v) }, { typeof(string), (tp,p,e,v) => new StringPropertyViewModel (tp, p, e, v) }, { typeof(bool), (tp,p,e,v) => new PropertyViewModel<bool?> (tp, p, e, v) }, { typeof(float), (tp,p,e,v) => new NumericPropertyViewModel<float?> (tp, p, e, v) }, |