-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathTopLevelImpl.cs
157 lines (133 loc) · 4.22 KB
/
TopLevelImpl.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
using System;
using System.Collections.Generic;
using Avalonia;
using Avalonia.Controls;
using Avalonia.Controls.Embedding;
using Avalonia.Input;
using Avalonia.Input.Raw;
using Avalonia.Media;
using Avalonia.Platform;
using Avalonia.Rendering;
using Avalonia.Threading;
using Unilonia.Input;
using UnityEngine;
using Rect = Avalonia.Rect;
namespace Unilonia
{
internal class TopLevelImpl : ITopLevelImpl
{
public Size ClientSize { get; private set; }
public double RenderScaling => 1;
public IEnumerable<object> Surfaces { get; private set; }
public Action<RawInputEventArgs> Input { get; set; }
public Action<Rect> Paint { get; set; }
public Action<Size> Resized { get; set; }
public Action<double> ScalingChanged { get; set; }
public Action<WindowTransparencyLevel> TransparencyLevelChanged { get; set; }
public Action Closed { get; set; }
public Action LostFocus { get; set; }
public IMouseDevice MouseDevice { get; }
public IInputRoot InputRoot { get; private set; }
public WindowTransparencyLevel TransparencyLevel => WindowTransparencyLevel.Transparent;
public AcrylicPlatformCompensationLevels AcrylicCompensationLevels => new AcrylicPlatformCompensationLevels();
private readonly bool useDeferredRenderer;
private readonly ExternalRenderTarget target;
private EmbeddableControlRoot _root;
public Control Content
{
get => (Control)_root.Content;
set => _root.Content = value;
}
public bool DrawFPS
{
get => _root.Renderer.DrawFps;
set => _root.Renderer.DrawFps = value;
}
public Texture Texture => target.Texture;
public TopLevelImpl(Size clientSize, bool useDeferredRenderer)
{
MouseDevice = new UnityMouseDevice();
ClientSize = clientSize;
this.useDeferredRenderer = useDeferredRenderer;
target = new ExternalRenderTarget()
{
ClientSize = ClientSize
};
Surfaces = new object[] { target };
}
public void Init()
{
_root = new EmbeddableControlRoot(this)
{
TransparencyLevelHint = WindowTransparencyLevel.Transparent,
Background = new SolidColorBrush(Colors.Transparent)
};
_root.Prepare();
_root.Renderer.Start();
}
public IPopupImpl CreatePopup()
{
return null;
}
public IRenderer CreateRenderer(IRenderRoot root)
{
if (useDeferredRenderer)
{
return new DeferredRenderer(root, AvaloniaLocator.Current.GetService<IRenderLoop>());
}
else
{
return new ImmediateRenderer(root);
}
}
public void Invalidate(Rect rect)
{
Dispatcher.UIThread.Post(() =>
{
Paint?.Invoke(rect);
}, DispatcherPriority.Render);
}
public Point PointToClient(PixelPoint point)
{
return point.ToPoint(1);
}
public PixelPoint PointToScreen(Point point)
{
return new PixelPoint((int)point.X, (int)point.Y);
}
public void SetCursor(IPlatformHandle cursor)
{
//NO-OP
}
public void SetInputRoot(IInputRoot inputRoot)
{
InputRoot = inputRoot;
}
public void SetTransparencyLevelHint(WindowTransparencyLevel transparencyLevel)
{
//NO-OP
}
internal void Resize(Size size)
{
target.DestroyRenderTarget();
target.ClientSize = size;
Dispatcher.UIThread.Post(() =>
{
Resized?.Invoke(size);
});
}
internal void Close()
{
target.DestroyRenderTarget();
Dispatcher.UIThread.InvokeAsync(() =>
{
Closed?.Invoke();
}).Wait();
}
public void Dispose()
{
target.Dispose();
_root.Dispose();
}
}
}