diff --git a/Perspex.Diagnostics/LogManager.cs b/Perspex.Diagnostics/LogManager.cs new file mode 100644 index 0000000000..61dcd3eef3 --- /dev/null +++ b/Perspex.Diagnostics/LogManager.cs @@ -0,0 +1,67 @@ +// ----------------------------------------------------------------------- +// +// Copyright 2014 MIT Licence. See licence.md for more information. +// +// ----------------------------------------------------------------------- + +namespace Perspex.Diagnostics +{ + using System; + using Perspex.Layout; + using Splat; + + public class LogManager : ILogManager + { + private static LogManager instance; + + public static LogManager Instance + { + get + { + if (instance == null) + { + instance = new LogManager(); + } + + return instance; + } + } + + public ILogger Logger + { + get; + set; + } + + public bool LogPropertyMessages + { + get; + set; + } + + public bool LogLayoutMessages + { + get; + set; + } + + public static void Enable(ILogger logger) + { + Instance.Logger = logger; + Locator.CurrentMutable.Register(() => Instance, typeof(ILogManager)); + } + + public IFullLogger GetLogger(Type type) + { + if ((type == typeof(PerspexObject) && LogPropertyMessages) || + (type == typeof(Layoutable) && LogLayoutMessages)) + { + return new WrappingFullLogger(this.Logger, type); + } + else + { + return new WrappingFullLogger(new NullLogger(), type); + } + } + } +} diff --git a/Perspex.Diagnostics/Perspex.Diagnostics.csproj b/Perspex.Diagnostics/Perspex.Diagnostics.csproj index b42aa091ab..ecf90a5d76 100644 --- a/Perspex.Diagnostics/Perspex.Diagnostics.csproj +++ b/Perspex.Diagnostics/Perspex.Diagnostics.csproj @@ -21,7 +21,7 @@ full false bin\Debug\ - DEBUG;TRACE + TRACE;DEBUG prompt 4 @@ -65,11 +65,15 @@ + + + ..\packages\Splat.1.3.3\lib\Portable-net45+win+wpa81+wp80\Splat.dll + ..\packages\Rx-Core.2.1.30214.0\lib\Portable-Net45+WinRT45+WP8\System.Reactive.Core.dll diff --git a/Perspex.Diagnostics/packages.config b/Perspex.Diagnostics/packages.config index 62f970e8dd..6567db553e 100644 --- a/Perspex.Diagnostics/packages.config +++ b/Perspex.Diagnostics/packages.config @@ -5,4 +5,5 @@ + \ No newline at end of file diff --git a/Perspex.Layout/ILayoutManager.cs b/Perspex.Layout/ILayoutManager.cs index 04af09578b..0e8a84e92b 100644 --- a/Perspex.Layout/ILayoutManager.cs +++ b/Perspex.Layout/ILayoutManager.cs @@ -13,6 +13,8 @@ namespace Perspex.Layout { IObservable LayoutNeeded { get; } + bool LayoutQueued { get; } + void ExecuteLayoutPass(); void InvalidateMeasure(ILayoutable item); diff --git a/Perspex.Layout/LayoutManager.cs b/Perspex.Layout/LayoutManager.cs index 478e07f94e..8c25c127d2 100644 --- a/Perspex.Layout/LayoutManager.cs +++ b/Perspex.Layout/LayoutManager.cs @@ -7,7 +7,6 @@ namespace Perspex.Layout { using System; - using System.Linq; using System.Reactive; using System.Reactive.Subjects; @@ -30,25 +29,42 @@ namespace Perspex.Layout get { return this.layoutNeeded; } } + public bool LayoutQueued + { + get; + private set; + } + public void ExecuteLayoutPass() { - if (this.root != null) - { - this.root.Measure(this.root.ClientSize); - this.root.Arrange(new Rect(this.root.ClientSize)); - } + this.root.Measure(this.root.ClientSize); + this.root.Arrange(new Rect(this.root.ClientSize)); + this.LayoutQueued = false; } public void InvalidateMeasure(ILayoutable item) { - IVisual visual = item as IVisual; - this.layoutNeeded.OnNext(Unit.Default); + if (!this.LayoutQueued) + { + IVisual visual = item as IVisual; + this.layoutNeeded.OnNext(Unit.Default); + this.LayoutQueued = true; + } } public void InvalidateArrange(ILayoutable item) { - IVisual visual = item as IVisual; - this.layoutNeeded.OnNext(Unit.Default); + if (!this.LayoutQueued) + { + IVisual visual = item as IVisual; + this.layoutNeeded.OnNext(Unit.Default); + this.LayoutQueued = true; + } + } + + public void LayoutFinished() + { + this.LayoutQueued = false; } } } diff --git a/Perspex.Windows/Window.cs b/Perspex.Windows/Window.cs index b414e4bff7..b583691fba 100644 --- a/Perspex.Windows/Window.cs +++ b/Perspex.Windows/Window.cs @@ -59,14 +59,18 @@ namespace Perspex.Windows }); this.RenderManager.RenderNeeded + .Where(_ => !this.LayoutManager.LayoutQueued) .Subscribe(x => { WindowsDispatcher.CurrentDispatcher.BeginInvoke( DispatcherPriority.Render, () => { - this.renderer.Render(this); - this.RenderManager.RenderFinished(); + if (!this.LayoutManager.LayoutQueued) + { + this.renderer.Render(this); + this.RenderManager.RenderFinished(); + } }); }); } diff --git a/TestApplication/Program.cs b/TestApplication/Program.cs index d738dff190..d2405ce871 100644 --- a/TestApplication/Program.cs +++ b/TestApplication/Program.cs @@ -1,12 +1,8 @@ -using System.Collections; -using System.Collections.Generic; -using System.Linq; -using Perspex; +using Perspex; using Perspex.Controls; using Perspex.Layout; using Perspex.Media; using Perspex.Media.Imaging; -using Perspex.Threading; using Perspex.Windows; using Splat; @@ -86,7 +82,8 @@ namespace TestApplication static void Main(string[] args) { - //Locator.CurrentMutable.Register(() => new TestLogger { Level = LogLevel.Debug } , typeof(ILogger)); + //LogManager.Enable(new TestLogger()); + //LogManager.Instance.LogLayoutMessages = true; App application = new App {