From 3fcf3bf99228c08f0fcf2133dfc59231be163f87 Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Thu, 15 Sep 2022 17:13:54 +0100 Subject: [PATCH] add callbacks for wasm ime, ready to sync with me. --- .../Avalonia.Web.Blazor/AvaloniaView.razor.cs | 12 +++- .../Interop/ActionHelper.cs | 61 +++++++++++++++++++ .../Interop/DpiWatcherInterop.cs | 6 +- .../Interop/FloatFloatActionHelper.cs | 20 ------ .../Interop/InputHelperInterop.cs | 47 +++++++++++--- .../Interop/SizeWatcherInterop.cs | 6 +- .../webapp/modules/Avalonia/InputHelper.ts | 2 +- 7 files changed, 118 insertions(+), 36 deletions(-) delete mode 100644 src/Web/Avalonia.Web.Blazor/Interop/FloatFloatActionHelper.cs diff --git a/src/Web/Avalonia.Web.Blazor/AvaloniaView.razor.cs b/src/Web/Avalonia.Web.Blazor/AvaloniaView.razor.cs index a8189e3b32..88037cd0a5 100644 --- a/src/Web/Avalonia.Web.Blazor/AvaloniaView.razor.cs +++ b/src/Web/Avalonia.Web.Blazor/AvaloniaView.razor.cs @@ -1,3 +1,4 @@ +using System.Diagnostics; using Avalonia.Controls.ApplicationLifetimes; using Avalonia.Controls.Embedding; using Avalonia.Controls.Platform; @@ -254,10 +255,12 @@ namespace Avalonia.Web.Blazor AvaloniaLocator.CurrentMutable.Bind().ToConstant((IJSInProcessRuntime)Js); _avaloniaModule = await AvaloniaModule.ImportAsync(Js); - - _inputHelper = new InputHelperInterop(_avaloniaModule, _inputElement); + _canvasHelper = new InputHelperInterop(_avaloniaModule, _htmlCanvas); _containerHelper = new InputHelperInterop(_avaloniaModule, _containerElement); + _inputHelper = new InputHelperInterop(_avaloniaModule, _inputElement); + + _inputHelper.CompositionEvent += InputHelperOnCompositionEvent; HideIme(); _canvasHelper.SetCursor("default"); @@ -330,6 +333,11 @@ namespace Avalonia.Web.Blazor } } + private void InputHelperOnCompositionEvent(object? sender, WebCompositionEventArgs e) + { + Debug.WriteLine("Test"); + } + private void OnRenderFrame() { if (_useGL && (_jsGlInfo == null)) diff --git a/src/Web/Avalonia.Web.Blazor/Interop/ActionHelper.cs b/src/Web/Avalonia.Web.Blazor/Interop/ActionHelper.cs index d6d504e07e..8bb266a942 100644 --- a/src/Web/Avalonia.Web.Blazor/Interop/ActionHelper.cs +++ b/src/Web/Avalonia.Web.Blazor/Interop/ActionHelper.cs @@ -17,4 +17,65 @@ namespace Avalonia.Web.Blazor.Interop [JSInvokable] public void Invoke() => action?.Invoke(); } + + [EditorBrowsable(EditorBrowsableState.Never)] + public class ActionHelper + { + private readonly Action action; + + public ActionHelper(Action action) + { + this.action = action; + } + + [JSInvokable] + public void Invoke(T param1) => action?.Invoke(param1); + } + + [EditorBrowsable(EditorBrowsableState.Never)] + public class ActionHelper + { + private readonly Action action; + + public ActionHelper(Action action) + { + this.action = action; + } + + [JSInvokable] + public void Invoke(T1 p1, T2 p2) => action?.Invoke(p1, p2); + } + + [EditorBrowsable(EditorBrowsableState.Never)] + public class ActionHelper + { + private readonly Action action; + + public ActionHelper(Action action) + { + this.action = action; + } + + [JSInvokable] + public void Invoke(T1 p1, T2 p2, T3 p3) => action?.Invoke(p1, p2, p3); + } + + [EditorBrowsable(EditorBrowsableState.Never)] + public class ActionHelper + { + private readonly Action action; + + public ActionHelper(Action action) + { + this.action = action; + } + + [JSInvokable] + public void Invoke(T1 p1, T2 p2, T3 p3, T4 p4) => action?.Invoke(p1, p2, p3, p4); + } + + + + + } diff --git a/src/Web/Avalonia.Web.Blazor/Interop/DpiWatcherInterop.cs b/src/Web/Avalonia.Web.Blazor/Interop/DpiWatcherInterop.cs index 2c39cb8d00..c86c72f29c 100644 --- a/src/Web/Avalonia.Web.Blazor/Interop/DpiWatcherInterop.cs +++ b/src/Web/Avalonia.Web.Blazor/Interop/DpiWatcherInterop.cs @@ -9,15 +9,15 @@ namespace Avalonia.Web.Blazor.Interop private const string GetDpiSymbol = "DpiWatcher.getDpi"; private event Action? callbacksEvent; - private readonly FloatFloatActionHelper _callbackHelper; + private readonly ActionHelper _callbackHelper; private readonly AvaloniaModule _module; - private DotNetObjectReference? callbackReference; + private DotNetObjectReference>? callbackReference; public DpiWatcherInterop(AvaloniaModule module, Action? callback = null) { _module = module; - _callbackHelper = new FloatFloatActionHelper((o, n) => callbacksEvent?.Invoke(n)); + _callbackHelper = new ActionHelper((o, n) => callbacksEvent?.Invoke(n)); if (callback != null) Subscribe(callback); diff --git a/src/Web/Avalonia.Web.Blazor/Interop/FloatFloatActionHelper.cs b/src/Web/Avalonia.Web.Blazor/Interop/FloatFloatActionHelper.cs deleted file mode 100644 index 80b9e5689a..0000000000 --- a/src/Web/Avalonia.Web.Blazor/Interop/FloatFloatActionHelper.cs +++ /dev/null @@ -1,20 +0,0 @@ -using System; -using System.ComponentModel; -using Microsoft.JSInterop; - -namespace Avalonia.Web.Blazor.Interop -{ - [EditorBrowsable(EditorBrowsableState.Never)] - public class FloatFloatActionHelper - { - private readonly Action action; - - public FloatFloatActionHelper(Action action) - { - this.action = action; - } - - [JSInvokable] - public void Invoke(float width, float height) => action?.Invoke(width, height); - } -} diff --git a/src/Web/Avalonia.Web.Blazor/Interop/InputHelperInterop.cs b/src/Web/Avalonia.Web.Blazor/Interop/InputHelperInterop.cs index ca09a4ba78..bd4e3f92f6 100644 --- a/src/Web/Avalonia.Web.Blazor/Interop/InputHelperInterop.cs +++ b/src/Web/Avalonia.Web.Blazor/Interop/InputHelperInterop.cs @@ -1,8 +1,36 @@ -using Microsoft.AspNetCore.Components; +using System.Diagnostics; +using Microsoft.AspNetCore.Components; using Microsoft.JSInterop; namespace Avalonia.Web.Blazor.Interop { + internal class WebCompositionEventArgs : EventArgs + { + public enum WebCompositionEventType + { + Start, + Update, + End + } + + public WebCompositionEventArgs(string type, string data) + { + Type = type switch + { + "compositionstart" => WebCompositionEventType.Start, + "compositionupdate" => WebCompositionEventType.Update, + "compositionend" => WebCompositionEventType.End, + _ => Type + }; + + Data = data; + } + + public WebCompositionEventType Type { get; } + + public string Data { get; } + } + internal class InputHelperInterop { private const string ClearSymbol = "InputHelper.clear"; @@ -14,22 +42,27 @@ namespace Avalonia.Web.Blazor.Interop private readonly AvaloniaModule _module; private readonly ElementReference _inputElement; - private readonly ActionHelper _actionHelper; - private DotNetObjectReference? callbackReference; + private readonly ActionHelper _actionHelper; + private DotNetObjectReference>? callbackReference; public InputHelperInterop(AvaloniaModule module, ElementReference inputElement) { _module = module; _inputElement = inputElement; - _actionHelper = new ActionHelper(() => - { - - }); + _actionHelper = new ActionHelper(OnCompositionEvent); Start(); } + public event EventHandler? CompositionEvent; + + private void OnCompositionEvent(string type, string data) + { + Console.WriteLine($"CompositionEvent Handler Helper {CompositionEvent == null} "); + CompositionEvent?.Invoke(this, new WebCompositionEventArgs(type, data)); + } + public void Clear() => _module.Invoke(ClearSymbol, _inputElement); public void Focus() => _module.Invoke(FocusSymbol, _inputElement); diff --git a/src/Web/Avalonia.Web.Blazor/Interop/SizeWatcherInterop.cs b/src/Web/Avalonia.Web.Blazor/Interop/SizeWatcherInterop.cs index 10198751a9..e21ae837d0 100644 --- a/src/Web/Avalonia.Web.Blazor/Interop/SizeWatcherInterop.cs +++ b/src/Web/Avalonia.Web.Blazor/Interop/SizeWatcherInterop.cs @@ -12,16 +12,16 @@ namespace Avalonia.Web.Blazor.Interop private readonly AvaloniaModule _module; private readonly ElementReference _htmlElement; private readonly string _htmlElementId; - private readonly FloatFloatActionHelper _callbackHelper; + private readonly ActionHelper _callbackHelper; - private DotNetObjectReference? callbackReference; + private DotNetObjectReference>? callbackReference; public SizeWatcherInterop(AvaloniaModule module, ElementReference element, Action callback) { _module = module; _htmlElement = element; _htmlElementId = element.Id; - _callbackHelper = new FloatFloatActionHelper((x, y) => callback(new SKSize(x, y))); + _callbackHelper = new ActionHelper((x, y) => callback(new SKSize(x, y))); } public void Dispose() => Stop(); diff --git a/src/Web/Avalonia.Web.Blazor/webapp/modules/Avalonia/InputHelper.ts b/src/Web/Avalonia.Web.Blazor/webapp/modules/Avalonia/InputHelper.ts index 21779449e6..c4708cb130 100644 --- a/src/Web/Avalonia.Web.Blazor/webapp/modules/Avalonia/InputHelper.ts +++ b/src/Web/Avalonia.Web.Blazor/webapp/modules/Avalonia/InputHelper.ts @@ -49,7 +49,7 @@ case "compositionstart": case "compositionupdate": case "compositionend": - InputHelper.callback.invokeMethod('Invoke'); + InputHelper.callback.invokeMethod('Invoke', ev.type, ev.data); break; } }