Merge pull request #537 from irihitech/ipbox

Enable IME for IPv4Box on android.
This commit is contained in:
Dong Bin
2025-01-13 21:36:05 +08:00
committed by GitHub
2 changed files with 38 additions and 1 deletions

View File

@@ -7,6 +7,7 @@ using Avalonia.Controls.Primitives;
using Avalonia.Data;
using Avalonia.Input;
using Avalonia.Input.Platform;
using Avalonia.Input.TextInput;
using Avalonia.Interactivity;
using Avalonia.Media;
using Avalonia.Media.TextFormatting;
@@ -96,11 +97,15 @@ public class IPv4Box: TemplatedControl
get => GetValue(InputModeProperty);
set => SetValue(InputModeProperty, value);
}
private readonly IPv4BoxInputMethodClient _imClient = new IPv4BoxInputMethodClient();
static IPv4Box()
{
ShowLeadingZeroProperty.Changed.AddClassHandler<IPv4Box>((o, e) => o.OnFormatChange(e));
IPAddressProperty.Changed.AddClassHandler<IPv4Box>((o, e) => o.OnIPChanged(e));
TextInputMethodClientRequestedEvent.AddClassHandler<IPv4Box>((tb, e) =>
{
e.Client = tb._imClient;
});
}
#region Overrides
@@ -278,6 +283,7 @@ public class IPv4Box: TemplatedControl
{
if (e.ClickCount == 1)
{
_imClient.SetPresenter(presenter);
presenter.ShowCaret();
_currentActivePresenter = presenter;
var caretPosition = position.WithX(position.X - presenter.Bounds.X);

View File

@@ -0,0 +1,31 @@
using Avalonia;
using Avalonia.Controls.Presenters;
using Avalonia.Input.TextInput;
namespace Ursa.Controls;
public class IPv4BoxInputMethodClient:TextInputMethodClient
{
private TextPresenter? _presenter;
public override Visual TextViewVisual => _presenter;
public override bool SupportsPreedit => false;
public override bool SupportsSurroundingText => true;
public override string SurroundingText
{
get;
}
public override Rect CursorRectangle { get; }
public override TextSelection Selection { get; set; }
private IPv4Box? _parent;
public void SetPresenter(TextPresenter? presenter)
{
this.RaiseTextViewVisualChanged();
this.RaiseCursorRectangleChanged();
}
private void OnParentPropertyChanged(object? sender, AvaloniaPropertyChangedEventArgs e)
{
this.RaiseSelectionChanged();
}
}