27 changed files with 130 additions and 103 deletions
@ -0,0 +1,62 @@ |
|||
using System; |
|||
using System.Collections.Generic; |
|||
using System.Linq; |
|||
using System.Text; |
|||
using System.Threading.Tasks; |
|||
using Perspex.Platform; |
|||
using Perspex.Rendering; |
|||
|
|||
namespace Perspex.Controls.Platform |
|||
{ |
|||
public interface ITopLevelRenderer |
|||
{ |
|||
void Attach(TopLevel topLevel); |
|||
} |
|||
|
|||
|
|||
class DefaultTopLevelRenderer : ITopLevelRenderer |
|||
{ |
|||
|
|||
public void Attach(TopLevel topLevel) |
|||
{ |
|||
var resources = new List<IDisposable>(); |
|||
var initialClientSize = topLevel.PlatformImpl.ClientSize; |
|||
|
|||
|
|||
var queueManager = ((IRenderRoot)topLevel).RenderQueueManager; |
|||
|
|||
if (queueManager == null) |
|||
return; |
|||
|
|||
var platformRender = PerspexLocator.Current.GetService<IPlatformRenderInterface>(); |
|||
if(platformRender == null) |
|||
return; |
|||
|
|||
var viewport = platformRender |
|||
.CreateRenderer(topLevel.PlatformImpl.Handle, initialClientSize.Width, initialClientSize.Height); |
|||
resources.Add(viewport); |
|||
|
|||
|
|||
resources.Add(topLevel.GetObservable(TopLevel.ClientSizeProperty).Subscribe(clientSize => |
|||
{ |
|||
viewport.Resize((int) clientSize.Width, (int) clientSize.Height); |
|||
})); |
|||
resources.Add(queueManager.RenderNeeded.Subscribe(_ |
|||
=> topLevel.PlatformImpl.Invalidate(new Rect(topLevel.ClientSize)))); |
|||
|
|||
topLevel.PlatformImpl.Paint = (rect, handle) => |
|||
{ |
|||
viewport.Render(topLevel, handle); |
|||
queueManager.RenderFinished(); |
|||
}; |
|||
|
|||
topLevel.Closed += delegate |
|||
{ |
|||
foreach (var disposable in resources) |
|||
disposable.Dispose(); |
|||
resources.Clear(); |
|||
}; |
|||
|
|||
} |
|||
} |
|||
} |
|||
Loading…
Reference in new issue