Skip to content

Commit ca8a7d1

Browse files
committed
feat: Add base (no touch input) support for Uno Platform
1 parent 804579d commit ca8a7d1

File tree

3 files changed

+128
-4
lines changed

3 files changed

+128
-4
lines changed
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
<Project Sdk="Microsoft.NET.Sdk">
2+
3+
<PropertyGroup>
4+
<TargetFramework>netstandard2.0</TargetFramework>
5+
<Description>The SkiaSharp front end for CSharpMath on WebAssembly.</Description>
6+
<PackageTags>$(PackageTags) skiasharp</PackageTags>
7+
</PropertyGroup>
8+
9+
<ItemGroup>
10+
<Compile Include="..\CSharpMath.SkiaSharp\Extensions.cs" Link="Extensions.cs" />
11+
<Compile Include="..\CSharpMath.SkiaSharp\MathPainter.cs" Link="MathPainter.cs" />
12+
<Compile Include="..\CSharpMath.SkiaSharp\SkiaCanvas.cs" Link="SkiaCanvas.cs" />
13+
<Compile Include="..\CSharpMath.SkiaSharp\SkiaPath.cs" Link="SkiaPath.cs" />
14+
<Compile Include="..\CSharpMath.SkiaSharp\TextPainter.cs" Link="TextPainter.cs" />
15+
</ItemGroup>
16+
17+
<ItemGroup>
18+
<PackageReference Include="Uno.SkiaSharp.Wasm" Version="1.68.0-uno.298" />
19+
<ProjectReference Include="..\CSharpMath.Rendering\CSharpMath.Rendering.csproj" />
20+
</ItemGroup>
21+
22+
</Project>

CSharpMath.Uno/CSharpMath.Uno.csproj

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<Project Sdk="MSBuild.Sdk.Extras/2.0.54">
3+
<PropertyGroup>
4+
<TargetFrameworks>netstandard2.0;xamarinios10;monoandroid90;monoandroid10.0;uap10.0.16299</TargetFrameworks>
5+
<!--xamarinmac20 currently not supported-->
6+
<!-- Ensures the .xr.xml files are generated in a proper layout folder -->
7+
<GenerateLibraryLayout>true</GenerateLibraryLayout>
8+
</PropertyGroup>
9+
<PropertyGroup Condition="'$(TargetFramework)'=='netstandard2.0'">
10+
<DefineConstants>$(DefineConstants);__WASM__</DefineConstants>
11+
</PropertyGroup>
12+
<ItemGroup Condition="'$(TargetFramework)'=='xamarinios10' or '$(TargetFramework)'=='MonoAndroid90' or '$(TargetFramework)'=='monoandroid10.0' or '$(TargetFramework)'=='netstandard2.0'">
13+
<PackageReference Include="Uno.SkiaSharp.Views" Version="1.68.0-uno.298" />
14+
<PackageReference Include="Uno.UI" Version="2.4.0" />
15+
</ItemGroup>
16+
<ItemGroup>
17+
<Page Include="**\*.xaml" Exclude="bin\**\*.xaml;obj\**\*.xaml" />
18+
<Compile Update="**\*.xaml.cs">
19+
<DependentUpon>%(Filename)</DependentUpon>
20+
</Compile>
21+
</ItemGroup>
22+
<ItemGroup>
23+
<UpToDateCheckInput Include="**\*.xaml" Exclude="bin\**\*.xaml;obj\**\*.xaml" />
24+
</ItemGroup>
25+
<ItemGroup Condition="'$(TargetFramework)'=='uap10.0.16299'">
26+
<PackageReference Include="SkiaSharp.Views" Version="1.68.0" />
27+
</ItemGroup>
28+
<ItemGroup Condition="'$(TargetFramework)'=='netstandard2.0'">
29+
<PackageReference Include="Uno.SkiaSharp.Wasm" Version="1.68.0-uno.298" />
30+
<ProjectReference Include="..\CSharpMath.SkiaSharp.Wasm\CSharpMath.SkiaSharp.Wasm.csproj" />
31+
</ItemGroup>
32+
<ItemGroup Condition="'$(TargetFramework)'!='netstandard2.0'">
33+
<ProjectReference Include="..\CSharpMath.SkiaSharp\CSharpMath.SkiaSharp.csproj" />
34+
</ItemGroup>
35+
<ItemGroup>
36+
<ProjectReference Include="..\CSharpMath.Rendering\CSharpMath.Rendering.csproj" />
37+
</ItemGroup>
38+
<Import Project="..\CSharpMath.Xaml\CSharpMath.Xaml.projitems" Label="Shared" />
39+
</Project>

CSharpMath.Xaml/Views.cs

Lines changed: 67 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,19 @@ namespace CSharpMath.Avalonia {
2525
using TextPainter = CSharpMath.SkiaSharp.TextPainter;
2626
namespace CSharpMath.Forms {
2727
[Xamarin.Forms.ContentProperty(nameof(LaTeX))]
28+
#elif HAS_UNO || WINDOWS_UWP
29+
using XCanvas = SkiaSharp.SKCanvas;
30+
using XCanvasColor = SkiaSharp.SKColor;
31+
using XColor = Windows.UI.Color;
32+
using XControl = Windows.UI.Xaml.Controls.Control;
33+
using XInheritControl = SkiaSharp.Views.UWP.SKXamlCanvas;
34+
using XProperty = Windows.UI.Xaml.DependencyProperty;
35+
using MathPainter = CSharpMath.SkiaSharp.MathPainter;
36+
using TextPainter = CSharpMath.SkiaSharp.TextPainter;
37+
namespace CSharpMath.Uno {
38+
[global::Windows.UI.Xaml.Markup.ContentProperty(Name = nameof(LaTeX))]
2839
#endif
29-
public class BaseView<TPainter, TContent> : XInheritControl, ICSharpMathAPI<TContent, XColor>
40+
public partial class BaseView<TPainter, TContent> : XInheritControl, ICSharpMathAPI<TContent, XColor>
3041
where TPainter : Painter<XCanvas, TContent, XCanvasColor>, new() where TContent : class {
3142
public TPainter Painter { get; } = new TPainter();
3243

@@ -158,9 +169,61 @@ protected sealed override void OnPaintSurface(global::SkiaSharp.Views.Forms.SKPa
158169
base.OnPaintSurface(e);
159170
e.Surface.Canvas.Clear();
160171
var canvas = e.Surface.Canvas;
172+
#elif HAS_UNO || WINDOWS_UWP
173+
@this.Invalidate();
174+
}
175+
return XProperty.Register(propertyName, typeof(TValue), typeof(TThis),
176+
new Windows.UI.Xaml.PropertyMetadata(defaultValue, (d, e) => PropertyChanged((TThis)d, e.NewValue)));
177+
}
178+
protected override global::Windows.Foundation.Size MeasureOverride(global::Windows.Foundation.Size availableSize) =>
179+
Painter.Measure((float)availableSize.Width) is { } rect
180+
? new global::Windows.Foundation.Size(rect.Width, rect.Height)
181+
: base.MeasureOverride(availableSize);
182+
struct ReadOnlyProperty<TThis, TValue> where TThis : BaseView<TPainter, TContent> {
183+
public ReadOnlyProperty(string propertyName,
184+
Func<TPainter, TValue> getter) {
185+
Property = XProperty.Register(propertyName, typeof(TValue), typeof(TThis), new Windows.UI.Xaml.PropertyMetadata(getter(staticPainter)));
186+
}
187+
public XProperty Property { get; }
188+
public void SetValue(TThis @this, TValue value) => @this.SetValue(Property, value);
189+
}
190+
private protected static XCanvasColor XColorToXCanvasColor(XColor color) => new XCanvasColor(color.R, color.G, color.B, color.A);
191+
private protected static XColor XCanvasColorToXColor(XCanvasColor color) => XColor.FromArgb(color.Alpha, color.Red, color.Green, color.Blue);
192+
global::SkiaSharp.SKPoint _origin;
193+
//protected override void OnTouch(global::SkiaSharp.Views.Forms.SKTouchEventArgs e) {
194+
// if (e.InContact && EnablePanning) {
195+
// switch (e.ActionType) {
196+
// case global::SkiaSharp.Views.Forms.SKTouchAction.Pressed:
197+
// _origin = e.Location;
198+
// e.Handled = true;
199+
// break;
200+
// case global::SkiaSharp.Views.Forms.SKTouchAction.Moved:
201+
// var displacement = e.Location - _origin;
202+
// _origin = e.Location;
203+
// DisplacementX += displacement.X;
204+
// DisplacementY += displacement.Y;
205+
// e.Handled = true;
206+
// break;
207+
// case global::SkiaSharp.Views.Forms.SKTouchAction.Released:
208+
// _origin = e.Location;
209+
// e.Handled = true;
210+
// break;
211+
// case global::SkiaSharp.Views.Forms.SKTouchAction.Entered:
212+
// case global::SkiaSharp.Views.Forms.SKTouchAction.Cancelled:
213+
// case global::SkiaSharp.Views.Forms.SKTouchAction.Exited:
214+
// default:
215+
// break;
216+
// }
217+
// }
218+
// base.OnTouch(e);
219+
//}
220+
protected sealed override void OnPaintSurface(global::SkiaSharp.Views.UWP.SKPaintSurfaceEventArgs e) {
221+
base.OnPaintSurface(e);
222+
e.Surface.Canvas.Clear();
223+
var canvas = e.Surface.Canvas;
161224
#endif
162225
Painter.Draw(canvas, TextAlignment, Padding, DisplacementX, DisplacementY);
163-
}
226+
}
164227
/// <summary>Requires touch events to be enabled in SkiaSharp/Xamarin.Forms</summary>
165228
public bool EnablePanning { get => (bool)GetValue(DisablePanningProperty); set => SetValue(DisablePanningProperty, value); }
166229
public static readonly XProperty DisablePanningProperty = CreateProperty<BaseView<TPainter, TContent>, bool>(nameof(EnablePanning), false, _ => false, (_, __) => { });
@@ -214,6 +277,6 @@ protected sealed override void OnPaintSurface(global::SkiaSharp.Views.Forms.SKPa
214277
private static readonly ReadOnlyProperty<BaseView<TPainter, TContent>, string?> ErrorMessagePropertyKey = new ReadOnlyProperty<BaseView<TPainter, TContent>, string?>(nameof(ErrorMessage), p => p.ErrorMessage);
215278
public static readonly XProperty ErrorMessageProperty = ErrorMessagePropertyKey.Property;
216279
}
217-
public class MathView : BaseView<MathPainter, MathList> { }
218-
public class TextView : BaseView<TextPainter, Rendering.Text.TextAtom> { }
280+
public partial class MathView : BaseView<MathPainter, MathList> { }
281+
public partial class TextView : BaseView<TextPainter, Rendering.Text.TextAtom> { }
219282
}

0 commit comments

Comments
 (0)