From 4a42a9e692a29fb89887f4e0eb27f9dabadcb4b7 Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Thu, 18 Sep 2014 20:39:22 +0200 Subject: [PATCH] TabStrip rendering again now at least. --- .../ContentControlTests.cs | 16 +++++++------ Perspex.Controls.UnitTests/ControlTests.cs | 11 +++++++-- Perspex.Controls/ItemsPresenter.cs | 5 ++++ Perspex.Direct2D1/Direct2D1Platform.cs | 1 + Perspex.SceneGraph.UnitTests/TestVisual.cs | 5 ++++ Perspex.SceneGraph.UnitTests/VisualTests.cs | 23 +++++++++++++++++++ .../Rendering/IRenderManager.cs | 2 ++ Perspex.SceneGraph/Visual.cs | 2 ++ Perspex.Windows/Window.cs | 13 +++-------- TestApplication/Program.cs | 2 ++ TestApplication/TestApplication.csproj | 4 ++++ 11 files changed, 65 insertions(+), 19 deletions(-) diff --git a/Perspex.Controls.UnitTests/ContentControlTests.cs b/Perspex.Controls.UnitTests/ContentControlTests.cs index 39de448618..79af0de7b3 100644 --- a/Perspex.Controls.UnitTests/ContentControlTests.cs +++ b/Perspex.Controls.UnitTests/ContentControlTests.cs @@ -144,14 +144,16 @@ namespace Perspex.Controls.UnitTests private ControlTemplate GetTemplate() { - return new ControlTemplate(parent => + return ControlTemplate.Create(parent => { - Border border = new Border(); - border.Background = new Perspex.Media.SolidColorBrush(0xffffffff); - ContentPresenter contentPresenter = new ContentPresenter(); - ////contentPresenter[~ContentPresenter.ContentProperty] = parent[~ContentPresenter.ContentProperty]; - border.Content = contentPresenter; - return border; + return new Border + { + Background = new Perspex.Media.SolidColorBrush(0xffffffff), + Content = new ContentPresenter + { + [~ContentPresenter.ContentProperty] = parent[~ContentControl.ContentProperty], + } + }; }); } } diff --git a/Perspex.Controls.UnitTests/ControlTests.cs b/Perspex.Controls.UnitTests/ControlTests.cs index 48be41d952..e4b30be752 100644 --- a/Perspex.Controls.UnitTests/ControlTests.cs +++ b/Perspex.Controls.UnitTests/ControlTests.cs @@ -6,11 +6,13 @@ namespace Perspex.Controls.UnitTests { + using System; using System.Linq; using Microsoft.VisualStudio.TestTools.UnitTesting; using Moq; using Perspex.Controls; using Perspex.Layout; + using Perspex.Rendering; using Perspex.Styling; using Splat; @@ -26,7 +28,7 @@ namespace Perspex.Controls.UnitTests } [TestMethod] - public void Adding_Control_To_ILayoutRoot_Should_Style_Control() + public void Adding_Control_To_IRenderRoot_Should_Style_Control() { using (Locator.CurrentMutable.WithResolver()) { @@ -68,7 +70,7 @@ namespace Perspex.Controls.UnitTests } } - private class TestRoot : Decorator, ILayoutRoot + private class TestRoot : Decorator, ILayoutRoot, IRenderRoot { public Size ClientSize { @@ -79,6 +81,11 @@ namespace Perspex.Controls.UnitTests { get { throw new System.NotImplementedException(); } } + + public IRenderManager RenderManager + { + get { throw new NotImplementedException(); } + } } } } diff --git a/Perspex.Controls/ItemsPresenter.cs b/Perspex.Controls/ItemsPresenter.cs index 6d5a4d4e40..a1600dfb98 100644 --- a/Perspex.Controls/ItemsPresenter.cs +++ b/Perspex.Controls/ItemsPresenter.cs @@ -52,6 +52,11 @@ namespace Perspex.Controls return finalSize; } + protected override IEnumerable CreateVisualChildren() + { + return Enumerable.Repeat(this.GetPanel(), 1); + } + private Control CreateItemControl(object item) { ItemsControl i = this.TemplatedParent as ItemsControl; diff --git a/Perspex.Direct2D1/Direct2D1Platform.cs b/Perspex.Direct2D1/Direct2D1Platform.cs index d997bf5787..f748c48a6b 100644 --- a/Perspex.Direct2D1/Direct2D1Platform.cs +++ b/Perspex.Direct2D1/Direct2D1Platform.cs @@ -28,6 +28,7 @@ namespace Perspex.Direct2D1 { var locator = Locator.CurrentMutable; locator.Register(() => instance, typeof(IPlatformRenderInterface)); + locator.Register(() => textService, typeof(ITextService)); locator.Register(() => d2d1Factory, typeof(SharpDX.Direct2D1.Factory)); locator.Register(() => dwFactory, typeof(SharpDX.DirectWrite.Factory)); locator.Register(() => imagingFactory, typeof(SharpDX.WIC.ImagingFactory)); diff --git a/Perspex.SceneGraph.UnitTests/TestVisual.cs b/Perspex.SceneGraph.UnitTests/TestVisual.cs index 889f486ebe..a780cf6a18 100644 --- a/Perspex.SceneGraph.UnitTests/TestVisual.cs +++ b/Perspex.SceneGraph.UnitTests/TestVisual.cs @@ -22,6 +22,11 @@ namespace Perspex.SceneGraph.UnitTests public class TestVisual : Visual { + public new PerspexObject InheritanceParent + { + get { return base.InheritanceParent; } + } + public Visual[] InitialChildren { get; set; } public event EventHandler> VisualParentChangedCalled; diff --git a/Perspex.SceneGraph.UnitTests/VisualTests.cs b/Perspex.SceneGraph.UnitTests/VisualTests.cs index e24c23962a..3338f858b3 100644 --- a/Perspex.SceneGraph.UnitTests/VisualTests.cs +++ b/Perspex.SceneGraph.UnitTests/VisualTests.cs @@ -49,6 +49,17 @@ namespace Perspex.SceneGraph.UnitTests Assert.AreEqual(target, child.GetVisualParent()); } + [TestMethod] + public void Added_Child_Should_Have_InheritanceParent_Set() + { + var target = new TestVisual(); + var child = new TestVisual(); + + target.AddChild(child); + + Assert.AreEqual(target, child.InheritanceParent); + } + [TestMethod] public void Removed_Child_Should_Have_VisualParent_Cleared() { @@ -61,6 +72,18 @@ namespace Perspex.SceneGraph.UnitTests Assert.IsNull(child.GetVisualParent()); } + [TestMethod] + public void Removed_Child_Should_Have_InheritanceParent_Cleared() + { + var target = new TestVisual(); + var child = new TestVisual(); + + target.AddChild(child); + target.RemoveChild(child); + + Assert.IsNull(child.InheritanceParent); + } + [TestMethod] public void Clearing_Children_Should_Clear_VisualParent() { diff --git a/Perspex.SceneGraph/Rendering/IRenderManager.cs b/Perspex.SceneGraph/Rendering/IRenderManager.cs index f239f7d7e5..72827e4080 100644 --- a/Perspex.SceneGraph/Rendering/IRenderManager.cs +++ b/Perspex.SceneGraph/Rendering/IRenderManager.cs @@ -14,5 +14,7 @@ namespace Perspex.Rendering IObservable RenderNeeded { get; } void InvalidateRender(IVisual visual); + + void RenderFinished(); } } diff --git a/Perspex.SceneGraph/Visual.cs b/Perspex.SceneGraph/Visual.cs index 105c8db50a..db706eb3d7 100644 --- a/Perspex.SceneGraph/Visual.cs +++ b/Perspex.SceneGraph/Visual.cs @@ -214,6 +214,7 @@ namespace Perspex case NotifyCollectionChangedAction.Add: foreach (Visual v in e.NewItems) { + v.InheritanceParent = this; v.SetVisualParent(this); } break; @@ -221,6 +222,7 @@ namespace Perspex case NotifyCollectionChangedAction.Remove: foreach (Visual v in e.OldItems) { + v.InheritanceParent = null; v.SetVisualParent(null); } break; diff --git a/Perspex.Windows/Window.cs b/Perspex.Windows/Window.cs index 2b33fdd62e..27e5710f9e 100644 --- a/Perspex.Windows/Window.cs +++ b/Perspex.Windows/Window.cs @@ -35,8 +35,6 @@ namespace Perspex.Windows private bool layoutPending; - private bool renderPending; - public Window() { IPlatformRenderInterface factory = Locator.Current.GetService(); @@ -62,20 +60,15 @@ namespace Perspex.Windows }); }); - this.RenderManager.RenderNeeded.Where(_ => !layoutPending && !renderPending) + this.RenderManager.RenderNeeded.Where(_ => !layoutPending) .Subscribe(x => { - this.renderPending = true; WindowsDispatcher.CurrentDispatcher.BeginInvoke( DispatcherPriority.Render, () => { - if (!this.layoutPending) - { - this.renderer.Render(this); - } - - this.renderPending = false; + this.renderer.Render(this); + this.RenderManager.RenderFinished(); }); }); } diff --git a/TestApplication/Program.cs b/TestApplication/Program.cs index 6155c97be8..d4bf86947f 100644 --- a/TestApplication/Program.cs +++ b/TestApplication/Program.cs @@ -218,6 +218,8 @@ namespace TestApplication } }; + System.Console.Write(Perspex.Diagnostics.Debug.PrintVisualTree(window)); + ////var treeView = window.FindControl("treeView"); ////var newTreeViewItemText = window.FindControl("newTreeViewItemText"); ////var addTreeViewItem = window.FindControl