Browse Source

Merge remote-tracking branch 'origin/master' into binding-debug

pull/58/head
Steven Kirk 11 years ago
parent
commit
dc6f48d697
  1. 6
      Perspex.Base/Collections/PerspexReadOnlyListView.cs
  2. 9
      Perspex.Controls/TopLevel.cs
  3. 5
      Perspex.Layout/ILayoutManager.cs
  4. 18
      Perspex.Layout/LayoutManager.cs
  5. 16
      TestApplication/Program.cs
  6. 23
      Tests/Perspex.Controls.UnitTests/TopLevelTests.cs

6
Perspex.Base/Collections/PerspexReadOnlyListView.cs

@ -122,7 +122,7 @@ namespace Perspex.Collections
ev = new NotifyCollectionChangedEventArgs(
NotifyCollectionChangedAction.Remove,
e.OldItems,
e.NewStartingIndex);
e.OldStartingIndex);
break;
case NotifyCollectionChangedAction.Replace:
ev = new NotifyCollectionChangedEventArgs(
@ -248,7 +248,7 @@ namespace Perspex.Collections
return this.GetEnumerator();
}
private IList<TOut> ConvertList(IEnumerable list)
private IList ConvertList(IEnumerable list)
{
return list.Cast<TIn>().Select(this.convert).ToList();
}
@ -271,7 +271,7 @@ namespace Perspex.Collections
ev = new NotifyCollectionChangedEventArgs(
NotifyCollectionChangedAction.Remove,
this.ConvertList(e.OldItems),
e.NewStartingIndex);
e.OldStartingIndex);
break;
case NotifyCollectionChangedAction.Replace:
ev = new NotifyCollectionChangedEventArgs(

9
Perspex.Controls/TopLevel.cs

@ -128,6 +128,7 @@ namespace Perspex.Controls
this.LayoutManager.Root = this;
this.LayoutManager.LayoutNeeded.Subscribe(_ => this.HandleLayoutNeeded());
this.LayoutManager.LayoutCompleted.Subscribe(_ => this.HandleLayoutCompleted());
this.renderManager.RenderNeeded.Subscribe(_ => this.HandleRenderNeeded());
IStyler styler = Locator.Current.GetService<IStyler>();
@ -296,6 +297,14 @@ namespace Perspex.Controls
this.dispatcher.InvokeAsync(LayoutManager.ExecuteLayoutPass, DispatcherPriority.Render);
}
/// <summary>
/// Handles a layout completion request from <see cref="LayoutManager.LayoutCompleted"/>.
/// </summary>
private void HandleLayoutCompleted()
{
this.renderManager.InvalidateRender(this);
}
/// <summary>
/// Handles a render request from <see cref="RenderManager.RenderNeeded"/>.
/// </summary>

5
Perspex.Layout/ILayoutManager.cs

@ -33,6 +33,11 @@ namespace Perspex.Layout
/// </summary>
IObservable<Unit> LayoutNeeded { get; }
/// <summary>
/// Gets an observable that is fired when a layout pass is completed.
/// </summary>
IObservable<Unit> LayoutCompleted { get; }
/// <summary>
/// Gets a value indicating whether a layout is queued.
/// </summary>

18
Perspex.Layout/LayoutManager.cs

@ -33,6 +33,11 @@ namespace Perspex.Layout
/// </summary>
private Subject<Unit> layoutNeeded;
/// <summary>
/// Called when a layout is completed.
/// </summary>
private Subject<Unit> layoutCompleted;
/// <summary>
/// Whether a measure is needed on the next layout pass.
/// </summary>
@ -54,6 +59,7 @@ namespace Perspex.Layout
public LayoutManager()
{
this.layoutNeeded = new Subject<Unit>();
this.layoutCompleted = new Subject<Unit>();
}
/// <summary>
@ -71,10 +77,12 @@ namespace Perspex.Layout
/// <summary>
/// Gets an observable that is fired when a layout pass is needed.
/// </summary>
public IObservable<Unit> LayoutNeeded
{
get { return this.layoutNeeded; }
}
public IObservable<Unit> LayoutNeeded => this.layoutNeeded;
/// <summary>
/// Gets an observable that is fired when a layout pass is completed.
/// </summary>
public IObservable<Unit> LayoutCompleted => this.layoutCompleted;
/// <summary>
/// Gets a value indicating whether a layout is queued.
@ -111,6 +119,8 @@ namespace Perspex.Layout
break;
}
}
this.layoutCompleted.OnNext(Unit.Default);
}
/// <summary>

16
TestApplication/Program.cs

@ -178,14 +178,14 @@ namespace TestApplication
DevTools.Attach(window);
var renderer = ((IRenderRoot)window).Renderer;
var last = renderer.RenderCount;
DispatcherTimer.Run(() =>
{
fps.Text = "FPS: " + (renderer.RenderCount - last);
last = renderer.RenderCount;
return true;
}, TimeSpan.FromSeconds(1));
//var renderer = ((IRenderRoot)window).Renderer;
//var last = renderer.RenderCount;
//DispatcherTimer.Run(() =>
//{
// fps.Text = "FPS: " + (renderer.RenderCount - last);
// last = renderer.RenderCount;
// return true;
//}, TimeSpan.FromSeconds(1));
window.Show();
Application.Current.Run(window);

23
Tests/Perspex.Controls.UnitTests/TopLevelTests.cs

@ -17,6 +17,8 @@ namespace Perspex.Controls.UnitTests
using Ploeh.AutoFixture;
using Ploeh.AutoFixture.AutoMoq;
using Splat;
using System.Reactive;
using System.Reactive.Subjects;
using Xunit;
public class TopLevelTests
@ -163,6 +165,27 @@ namespace Perspex.Controls.UnitTests
}
}
[Fact]
public void Render_Should_Be_Scheduled_After_Layout_Pass()
{
using (Locator.CurrentMutable.WithResolver())
{
this.RegisterServices();
var completed = new Subject<Unit>();
var layoutManagerMock = Mock.Get(Locator.Current.GetService<ILayoutManager>());
layoutManagerMock.Setup(x => x.LayoutCompleted).Returns(completed);
var impl = new Mock<ITopLevelImpl>();
impl.Setup(x => x.ClientSize).Returns(new Size(123, 456));
var target = new TestTopLevel(impl.Object);
completed.OnNext(Unit.Default);
var renderManagerMock = Mock.Get(Locator.Current.GetService<IRenderManager>());
renderManagerMock.Verify(x => x.InvalidateRender(target));
}
}
[Fact]
public void Width_And_Height_Should_Be_Set_After_Window_Resize_Notification()
{

Loading…
Cancel
Save