Skip to content

Commit

Permalink
feat: added inputextensions returntype property
Browse files Browse the repository at this point in the history
  • Loading branch information
Matthew Rajala authored and rajamatt committed May 9, 2024
1 parent 87f3a19 commit 286dff5
Showing 1 changed file with 92 additions and 0 deletions.
92 changes: 92 additions & 0 deletions src/Uno.Toolkit.UI/Behaviors/InputExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,12 @@
using Windows.System;
using Windows.UI.ViewManagement;

#if __ANDROID__
using Android.Views.InputMethods;
#elif __IOS__
using UIKit;
#endif

#if IS_WINUI
using Microsoft.UI.Xaml;
using Microsoft.UI.Xaml.Controls;
Expand All @@ -27,6 +33,30 @@ public static class InputExtensions
{
private static readonly ILogger _logger = typeof(InputExtensions).Log();

public enum ReturnType {
Default,
Done,
Go,
Next,
Search,
Send
}

#region DependencyProperty: ReturnType

/// <summary>
/// Backing property for what type of return the soft-keyboard will show.
/// </summary>
public static DependencyProperty ReturnTypeProperty { get; } = DependencyProperty.RegisterAttached(
"ReturnType",
typeof(ReturnType),
typeof(InputExtensions),
new PropertyMetadata(ReturnType.Default, OnReturnTypeChanged));

public static ReturnType GetReturnType(DependencyObject obj) => (ReturnType)obj.GetValue(ReturnTypeProperty);
public static void SetReturnType(DependencyObject obj, ReturnType value) => obj.SetValue(ReturnTypeProperty, value);

#endregion
#region DependencyProperty: AutoDismiss

/// <summary>
Expand Down Expand Up @@ -109,6 +139,36 @@ internal static bool IsEnterCommandSupportedFor(DependencyObject host)
return host is TextBox || host is PasswordBox;
}

private static void OnReturnTypeChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
{
if (sender is Control control && (sender is TextBox || sender is PasswordBox) && e.NewValue is ReturnType returnType)
{
#if __ANDROID__
ImeAction imeAction = GetImeActionFromReturnType(returnType);

if (control is TextBox textBox)
{
textBox.ImeOptions = imeAction;
}
else if (control is PasswordBox passwordBox)
{
passwordBox.ImeOptions = imeAction;
}
#elif __IOS__
UIReturnKeyType returnKeyType = GetReturnKeyTypeFromReturnType(returnType);

if (control is TextBox textBox)
{
textBox.ReturnKeyType = returnKeyType;
}
else if (control is PasswordBox passwordBox)
{
passwordBox.ReturnKeyType = returnKeyType;
}
#endif
}
}

private static void OnAutoDismissChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e) => UpdateSubscription(sender);
private static void OnAutoFocusNextChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e) => UpdateSubscription(sender);
private static void OnAutoFocusNextElementChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e) => UpdateSubscription(sender);
Expand Down Expand Up @@ -177,5 +237,37 @@ private static void OnUIElementKeyUp(object sender, KeyRoutedEventArgs e)
_ => default,
};
}

#if __ANDROID__
private static ImeAction GetImeActionFromReturnType(ReturnType returnType)
{
switch (returnType)
{
case ReturnType.Go: return ImeAction.Go;
case ReturnType.Search: return ImeAction.Search;
case ReturnType.Send: return ImeAction.Send;
case ReturnType.Done: return ImeAction.Done;
case ReturnType.Default:
case ReturnType.Next:
default: return ImeAction.Next;
}
}
#endif

#if __IOS__
private static UIReturnKeyType GetReturnKeyTypeFromReturnType(ReturnType returnType)
{
switch (returnType)
{
case ReturnType.Go: return UIReturnKeyType.Go;
case ReturnType.Search: return UIReturnKeyType.Search;
case ReturnType.Send: return UIReturnKeyType.Send;
case ReturnType.Done: return UIReturnKeyType.Done;
case ReturnType.Default:
case ReturnType.Next:
default: return UIReturnKeyType.Next;
}
}
#endif
}
}

0 comments on commit 286dff5

Please sign in to comment.