From a96149842080ce4215f01eda8f2613449b695db0 Mon Sep 17 00:00:00 2001 From: Nikita Tsukanov Date: Fri, 27 Nov 2015 00:01:00 +0300 Subject: [PATCH] Implemented designer scaling --- src/Perspex.Application/Designer/Designer.cs | 9 ++++++- .../Designer/DesignerApi.cs | 5 ++++ .../Platform/PlatformManager.cs | 13 ++++++++-- .../AppHost/HostedAppModel.cs | 20 ++++++++++++++++ .../AppHost/PerspexAppHost.cs | 3 ++- .../Perspex.Designer/Comm/CommChannel.cs | 2 +- .../InProcDesigner/InProcDesignerView.xaml | 24 +++++++++++++------ 7 files changed, 64 insertions(+), 12 deletions(-) diff --git a/src/Perspex.Application/Designer/Designer.cs b/src/Perspex.Application/Designer/Designer.cs index 665eb3447f..a04e1d1fef 100644 --- a/src/Perspex.Application/Designer/Designer.cs +++ b/src/Perspex.Application/Designer/Designer.cs @@ -29,10 +29,17 @@ namespace Perspex.Designer public static void Init(Dictionary shared) { - Api = new DesignerApi(shared) {UpdateXaml = UpdateXaml}; + Api = new DesignerApi(shared) {UpdateXaml = UpdateXaml, SetScalingFactor = SetScalingFactor}; new DesignerApp(); } + private static void SetScalingFactor(double factor) + { + PlatformManager.SetDesignerScalingFactor(factor); + if (s_currentWindow != null) + s_currentWindow.PlatformImpl.ClientSize = s_currentWindow.ClientSize; + } + static Window s_currentWindow; private static void UpdateXaml(string xaml) diff --git a/src/Perspex.Application/Designer/DesignerApi.cs b/src/Perspex.Application/Designer/DesignerApi.cs index 944bd86705..aebc621786 100644 --- a/src/Perspex.Application/Designer/DesignerApi.cs +++ b/src/Perspex.Application/Designer/DesignerApi.cs @@ -46,6 +46,11 @@ namespace Perspex.Designer get { return (Action) Get(); } } + public Action SetScalingFactor + { + set { Set(value);} + get { return (Action) Get(); } + } } } diff --git a/src/Perspex.Controls/Platform/PlatformManager.cs b/src/Perspex.Controls/Platform/PlatformManager.cs index 4983fc0483..383eecd5c7 100644 --- a/src/Perspex.Controls/Platform/PlatformManager.cs +++ b/src/Perspex.Controls/Platform/PlatformManager.cs @@ -19,6 +19,7 @@ namespace Perspex.Controls.Platform => PerspexLocator.Current.GetService(); static bool s_designerMode; + private static double _designerScalingFactor = 1; public static IRenderTarget CreateRenderTarget(ITopLevelImpl window) { @@ -33,6 +34,14 @@ namespace Perspex.Controls.Platform return Disposable.Create(() => s_designerMode = false); } + public static void SetDesignerScalingFactor(double factor) + { + _designerScalingFactor = factor; + } + + static double RenderScalingFactor => (GetSettings()?.RenderScalingFactor ?? 1)*_designerScalingFactor; + static double LayoutScalingFactor => (GetSettings()?.LayoutScalingFactor ?? 1) * _designerScalingFactor; + class RenderTargetDecorator : IRenderTarget { private readonly IRenderTarget _target; @@ -53,7 +62,7 @@ namespace Perspex.Controls.Platform { var cs = _window.ClientSize; var ctx = _target.CreateDrawingContext(); - var factor = GetSettings()?.RenderScalingFactor ?? 1; + var factor = RenderScalingFactor; if (factor != 1) { ctx.PushPostTransform(Matrix.CreateScale(factor, factor)); @@ -70,7 +79,7 @@ namespace Perspex.Controls.Platform private readonly IPopupImpl _popup; public ITopLevelImpl TopLevel => _tl; - double ScalingFactor => GetSettings()?.LayoutScalingFactor ?? 1; + double ScalingFactor => LayoutScalingFactor; public WindowDecorator(ITopLevelImpl tl) { diff --git a/src/Windows/Perspex.Designer/AppHost/HostedAppModel.cs b/src/Windows/Perspex.Designer/AppHost/HostedAppModel.cs index 649b5d48ee..1be709216a 100644 --- a/src/Windows/Perspex.Designer/AppHost/HostedAppModel.cs +++ b/src/Windows/Perspex.Designer/AppHost/HostedAppModel.cs @@ -11,10 +11,16 @@ namespace Perspex.Designer.AppHost { public class HostedAppModel : INotifyPropertyChanged { + private readonly PerspexAppHost _host; private IntPtr _nativeWindowHandle; private string _error; private string _errorDetails; + internal HostedAppModel(PerspexAppHost host) + { + _host = host; + } + public IntPtr NativeWindowHandle { get { return _nativeWindowHandle; } @@ -48,12 +54,26 @@ namespace Perspex.Designer.AppHost } } + public IReadOnlyList AvailableScalingFactors => new List() {1, 2, 4, 8}; + + public double CurrentScalingFactor + { + get { return _currentScalingFactor; } + set + { + _currentScalingFactor = value; + _host.Api.SetScalingFactor(value); + } + } + public void SetError(string error, string details = null) { Error = error; ErrorDetails = details; } + double _currentScalingFactor = 1; + public event PropertyChangedEventHandler PropertyChanged; [NotifyPropertyChangedInvocator] diff --git a/src/Windows/Perspex.Designer/AppHost/PerspexAppHost.cs b/src/Windows/Perspex.Designer/AppHost/PerspexAppHost.cs index 0def6e0f3e..b855019f4c 100644 --- a/src/Windows/Perspex.Designer/AppHost/PerspexAppHost.cs +++ b/src/Windows/Perspex.Designer/AppHost/PerspexAppHost.cs @@ -22,12 +22,13 @@ namespace Perspex.Designer.AppHost private string _lastXaml; private string _currentXaml; private bool _initSuccess; - private readonly HostedAppModel _appModel = new HostedAppModel(); + private HostedAppModel _appModel; private Control _window; public PerspexAppHost(CommChannel channel) { _comm = channel; + _appModel = new HostedAppModel(this); } public void Start() diff --git a/src/Windows/Perspex.Designer/Comm/CommChannel.cs b/src/Windows/Perspex.Designer/Comm/CommChannel.cs index 4e7bc641c9..a2608c88db 100644 --- a/src/Windows/Perspex.Designer/Comm/CommChannel.cs +++ b/src/Windows/Perspex.Designer/Comm/CommChannel.cs @@ -13,7 +13,7 @@ using System.Windows.Threading; namespace Perspex.Designer.Comm { - internal class CommChannel : IDisposable + class CommChannel : IDisposable { private readonly BinaryReader _input; private readonly BinaryWriter _output; diff --git a/src/Windows/Perspex.Designer/InProcDesigner/InProcDesignerView.xaml b/src/Windows/Perspex.Designer/InProcDesigner/InProcDesignerView.xaml index 38e09688cb..795749e6f6 100644 --- a/src/Windows/Perspex.Designer/InProcDesigner/InProcDesignerView.xaml +++ b/src/Windows/Perspex.Designer/InProcDesigner/InProcDesignerView.xaml @@ -4,17 +4,27 @@ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:appHost="clr-namespace:Perspex.Designer.AppHost" + xmlns:system="clr-namespace:System;assembly=mscorlib" mc:Ignorable="d" d:DesignHeight="300" d:DesignWidth="300" d:DataContext="{d:DesignInstance appHost:HostedAppModel}"> - - - - + + + + + 00% + + + + + + + (View details) - - - + + + +