Browse Source

add callbacks for wasm ime, ready to sync with me.

pull/8963/head
Dan Walmsley 3 years ago
parent
commit
3fcf3bf992
  1. 12
      src/Web/Avalonia.Web.Blazor/AvaloniaView.razor.cs
  2. 61
      src/Web/Avalonia.Web.Blazor/Interop/ActionHelper.cs
  3. 6
      src/Web/Avalonia.Web.Blazor/Interop/DpiWatcherInterop.cs
  4. 20
      src/Web/Avalonia.Web.Blazor/Interop/FloatFloatActionHelper.cs
  5. 47
      src/Web/Avalonia.Web.Blazor/Interop/InputHelperInterop.cs
  6. 6
      src/Web/Avalonia.Web.Blazor/Interop/SizeWatcherInterop.cs
  7. 2
      src/Web/Avalonia.Web.Blazor/webapp/modules/Avalonia/InputHelper.ts

12
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<IJSInProcessRuntime>().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))

61
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<T>
{
private readonly Action<T> action;
public ActionHelper(Action<T> action)
{
this.action = action;
}
[JSInvokable]
public void Invoke(T param1) => action?.Invoke(param1);
}
[EditorBrowsable(EditorBrowsableState.Never)]
public class ActionHelper<T1, T2>
{
private readonly Action<T1, T2> action;
public ActionHelper(Action<T1, T2> action)
{
this.action = action;
}
[JSInvokable]
public void Invoke(T1 p1, T2 p2) => action?.Invoke(p1, p2);
}
[EditorBrowsable(EditorBrowsableState.Never)]
public class ActionHelper<T1, T2, T3>
{
private readonly Action<T1, T2, T3> action;
public ActionHelper(Action<T1, T2, T3> 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<T1, T2, T3, T4>
{
private readonly Action<T1, T2, T3, T4> action;
public ActionHelper(Action<T1, T2, T3, T4> action)
{
this.action = action;
}
[JSInvokable]
public void Invoke(T1 p1, T2 p2, T3 p3, T4 p4) => action?.Invoke(p1, p2, p3, p4);
}
}

6
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<double>? callbacksEvent;
private readonly FloatFloatActionHelper _callbackHelper;
private readonly ActionHelper<float, float> _callbackHelper;
private readonly AvaloniaModule _module;
private DotNetObjectReference<FloatFloatActionHelper>? callbackReference;
private DotNetObjectReference<ActionHelper<float, float>>? callbackReference;
public DpiWatcherInterop(AvaloniaModule module, Action<double>? callback = null)
{
_module = module;
_callbackHelper = new FloatFloatActionHelper((o, n) => callbacksEvent?.Invoke(n));
_callbackHelper = new ActionHelper<float, float>((o, n) => callbacksEvent?.Invoke(n));
if (callback != null)
Subscribe(callback);

20
src/Web/Avalonia.Web.Blazor/Interop/FloatFloatActionHelper.cs

@ -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<float, float> action;
public FloatFloatActionHelper(Action<float, float> action)
{
this.action = action;
}
[JSInvokable]
public void Invoke(float width, float height) => action?.Invoke(width, height);
}
}

47
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<ActionHelper>? callbackReference;
private readonly ActionHelper<string, string> _actionHelper;
private DotNetObjectReference<ActionHelper<string, string>>? callbackReference;
public InputHelperInterop(AvaloniaModule module, ElementReference inputElement)
{
_module = module;
_inputElement = inputElement;
_actionHelper = new ActionHelper(() =>
{
});
_actionHelper = new ActionHelper<string, string>(OnCompositionEvent);
Start();
}
public event EventHandler<WebCompositionEventArgs>? 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);

6
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<float, float> _callbackHelper;
private DotNetObjectReference<FloatFloatActionHelper>? callbackReference;
private DotNetObjectReference<ActionHelper<float, float>>? callbackReference;
public SizeWatcherInterop(AvaloniaModule module, ElementReference element, Action<SKSize> callback)
{
_module = module;
_htmlElement = element;
_htmlElementId = element.Id;
_callbackHelper = new FloatFloatActionHelper((x, y) => callback(new SKSize(x, y)));
_callbackHelper = new ActionHelper<float, float>((x, y) => callback(new SKSize(x, y)));
}
public void Dispose() => Stop();

2
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;
}
}

Loading…
Cancel
Save