Browse Source

Added RenderManager

pull/4/head
Steven Kirk 12 years ago
parent
commit
4a43bbbb78
  1. 23
      Perspex.Windows/Window.cs
  2. 3
      Perspex/Perspex.csproj
  3. 18
      Perspex/Rendering/IRenderManager.cs
  4. 13
      Perspex/Rendering/IRendered.cs
  5. 27
      Perspex/Rendering/RenderManager.cs
  6. 8
      Perspex/Visual.cs

23
Perspex.Windows/Window.cs

@ -16,16 +16,14 @@ namespace Perspex.Windows
using Perspex.Input.Raw;
using Perspex.Layout;
using Perspex.Platform;
using Perspex.Rendering;
using Perspex.Windows.Input;
using Perspex.Windows.Interop;
using Perspex.Windows.Threading;
using Splat;
public class Window : ContentControl, ILayoutRoot
public class Window : ContentControl, ILayoutRoot, IRendered
{
public static readonly PerspexProperty<double> FontSizeProperty =
TextBlock.FontSizeProperty.AddOwner<Window>();
private UnmanagedMethods.WndProc wndProcDelegate;
private string className;
@ -46,6 +44,7 @@ namespace Perspex.Windows
this.CreateWindow();
Size clientSize = this.ClientSize;
this.LayoutManager = new LayoutManager();
this.RenderManager = new RenderManager();
this.renderer = factory.CreateRenderer(this.Handle, (int)clientSize.Width, (int)clientSize.Height);
this.inputManager = Locator.Current.GetService<IInputManager>();
this.Template = ControlTemplate.Create<Window>(this.DefaultTemplate);
@ -60,6 +59,16 @@ namespace Perspex.Windows
this.renderer.Render(this);
});
});
this.RenderManager.RenderNeeded.Subscribe(x =>
{
Dispatcher.CurrentDispatcher.BeginInvoke(
DispatcherPriority.Render,
() =>
{
this.renderer.Render(this);
});
});
}
public Size ClientSize
@ -84,6 +93,12 @@ namespace Perspex.Windows
private set;
}
public IRenderManager RenderManager
{
get;
private set;
}
public void Show()
{
UnmanagedMethods.ShowWindow(this.Handle, 4);

3
Perspex/Perspex.csproj

@ -105,6 +105,9 @@
<Compile Include="Media\StreamGeometry.cs" />
<Compile Include="Media\Geometry.cs" />
<Compile Include="Media\Stretch.cs" />
<Compile Include="Rendering\RenderManager.cs" />
<Compile Include="Rendering\IRenderManager.cs" />
<Compile Include="Rendering\IRendered.cs" />
<Compile Include="Shapes\Rectangle.cs" />
<Compile Include="Shapes\Path.cs" />
<Compile Include="Shapes\Shape.cs" />

18
Perspex/Rendering/IRenderManager.cs

@ -0,0 +1,18 @@
// -----------------------------------------------------------------------
// <copyright file="IRenderManager.cs" company="Steven Kirk">
// Copyright 2013 MIT Licence. See licence.md for more information.
// </copyright>
// -----------------------------------------------------------------------
namespace Perspex.Rendering
{
using System;
using System.Reactive;
public interface IRenderManager
{
IObservable<Unit> RenderNeeded { get; }
void InvalidateRender(IVisual visual);
}
}

13
Perspex/Rendering/IRendered.cs

@ -0,0 +1,13 @@
// -----------------------------------------------------------------------
// <copyright file="IRendered.cs" company="Steven Kirk">
// Copyright 2013 MIT Licence. See licence.md for more information.
// </copyright>
// -----------------------------------------------------------------------
namespace Perspex.Rendering
{
public interface IRendered
{
IRenderManager RenderManager { get; }
}
}

27
Perspex/Rendering/RenderManager.cs

@ -0,0 +1,27 @@
// -----------------------------------------------------------------------
// <copyright file="RenderManager.cs" company="Steven Kirk">
// Copyright 2013 MIT Licence. See licence.md for more information.
// </copyright>
// -----------------------------------------------------------------------
namespace Perspex.Rendering
{
using System;
using System.Reactive;
using System.Reactive.Subjects;
public class RenderManager : IRenderManager
{
private Subject<Unit> renderNeeded = new Subject<Unit>();
public IObservable<Unit> RenderNeeded
{
get { return this.renderNeeded; }
}
public void InvalidateRender(IVisual visual)
{
this.renderNeeded.OnNext(Unit.Default);
}
}
}

8
Perspex/Visual.cs

@ -12,6 +12,7 @@ namespace Perspex
using Perspex.Controls;
using Perspex.Layout;
using Perspex.Media;
using Perspex.Rendering;
using Splat;
public enum Visibility
@ -83,12 +84,11 @@ namespace Perspex
public void InvalidateVisual()
{
ILayoutRoot root = this.GetVisualAncestorOrSelf<ILayoutRoot>();
IRendered root = this.GetVisualAncestorOrSelf<IRendered>();
if (root != null && root.LayoutManager != null)
if (root != null && root.RenderManager != null)
{
// HACK HACK HACK!
root.LayoutManager.InvalidateArrange((ILayoutable)this);
root.RenderManager.InvalidateRender(this);
}
}

Loading…
Cancel
Save