From a2551d505bcc5d4609e33ba8c3556fddced14fae Mon Sep 17 00:00:00 2001 From: Nikita Tsukanov Date: Fri, 18 Aug 2017 18:50:29 +0300 Subject: [PATCH 01/69] Initial effort on Remote --- Avalonia.sln | 90 +++++++++++++++- samples/RemoteTest/Program.cs | 12 +++ samples/RemoteTest/RemoteTest.csproj | 25 +++++ .../Avalonia.Controls.csproj | 1 + .../Embedding/Offscreen/OffscreenTopLevel.cs | 63 +++++++++++ .../Offscreen/OffscreenTopLevelImpl.cs | 65 +++++++++++ src/Avalonia.Controls/Remote/RemoteServer.cs | 21 ++++ .../Remote/Server/RemoteServerTopLevelImpl.cs | 101 ++++++++++++++++++ src/Avalonia.Input/Key.cs | 5 +- .../Avalonia.Remote.Protocol.csproj | 9 ++ .../AvaloniaRemoteMessageGuidAttribute.cs | 19 ++++ .../DefaultMessageTypeResolver.cs | 35 ++++++ .../IMessageTypeResolver.cs | 10 ++ src/Avalonia.Remote.Protocol/ITransport.cs | 15 +++ src/Avalonia.Remote.Protocol/InputMessages.cs | 82 ++++++++++++++ .../ViewportMessages.cs | 54 ++++++++++ .../Platform/LockedFramebuffer.cs | 33 ++++++ 17 files changed, 638 insertions(+), 2 deletions(-) create mode 100644 samples/RemoteTest/Program.cs create mode 100644 samples/RemoteTest/RemoteTest.csproj create mode 100644 src/Avalonia.Controls/Embedding/Offscreen/OffscreenTopLevel.cs create mode 100644 src/Avalonia.Controls/Embedding/Offscreen/OffscreenTopLevelImpl.cs create mode 100644 src/Avalonia.Controls/Remote/RemoteServer.cs create mode 100644 src/Avalonia.Controls/Remote/Server/RemoteServerTopLevelImpl.cs create mode 100644 src/Avalonia.Remote.Protocol/Avalonia.Remote.Protocol.csproj create mode 100644 src/Avalonia.Remote.Protocol/AvaloniaRemoteMessageGuidAttribute.cs create mode 100644 src/Avalonia.Remote.Protocol/DefaultMessageTypeResolver.cs create mode 100644 src/Avalonia.Remote.Protocol/IMessageTypeResolver.cs create mode 100644 src/Avalonia.Remote.Protocol/ITransport.cs create mode 100644 src/Avalonia.Remote.Protocol/InputMessages.cs create mode 100644 src/Avalonia.Remote.Protocol/ViewportMessages.cs create mode 100644 src/Avalonia.Visuals/Platform/LockedFramebuffer.cs diff --git a/Avalonia.sln b/Avalonia.sln index 391d02382e..56c489fd0b 100644 --- a/Avalonia.sln +++ b/Avalonia.sln @@ -1,6 +1,6 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 15 -VisualStudioVersion = 15.0.26228.4 +VisualStudioVersion = 15.0.26730.3 MinimumVisualStudioVersion = 10.0.40219.1 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Avalonia.Base", "src\Avalonia.Base\Avalonia.Base.csproj", "{B09B78D8-9B26-48B0-9149-D64A2F120F3F}" EndProject @@ -185,6 +185,10 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Avalonia.Win32.Interop", "s EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Avalonia.Skia.RenderTests", "tests\Avalonia.RenderTests\Avalonia.Skia.RenderTests.csproj", "{E1582370-37B3-403C-917F-8209551B1634}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Avalonia.Remote.Protocol", "src\Avalonia.Remote.Protocol\Avalonia.Remote.Protocol.csproj", "{D78A720C-C0C6-478B-8564-F167F9BDD01B}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RemoteTest", "samples\RemoteTest\RemoteTest.csproj", "{E2999E4A-9086-401F-898C-AEB0AD38E676}" +EndProject Global GlobalSection(SharedMSBuildProjectFiles) = preSolution src\Shared\RenderHelpers\RenderHelpers.projitems*{3c4c0cb4-0c0f-4450-a37b-148c84ff905f}*SharedItemsImports = 13 @@ -2514,6 +2518,86 @@ Global {E1582370-37B3-403C-917F-8209551B1634}.Release|Mono.Build.0 = Release|Any CPU {E1582370-37B3-403C-917F-8209551B1634}.Release|x86.ActiveCfg = Release|Any CPU {E1582370-37B3-403C-917F-8209551B1634}.Release|x86.Build.0 = Release|Any CPU + {D78A720C-C0C6-478B-8564-F167F9BDD01B}.Ad-Hoc|Any CPU.ActiveCfg = Debug|Any CPU + {D78A720C-C0C6-478B-8564-F167F9BDD01B}.Ad-Hoc|Any CPU.Build.0 = Debug|Any CPU + {D78A720C-C0C6-478B-8564-F167F9BDD01B}.Ad-Hoc|iPhone.ActiveCfg = Debug|Any CPU + {D78A720C-C0C6-478B-8564-F167F9BDD01B}.Ad-Hoc|iPhone.Build.0 = Debug|Any CPU + {D78A720C-C0C6-478B-8564-F167F9BDD01B}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {D78A720C-C0C6-478B-8564-F167F9BDD01B}.Ad-Hoc|iPhoneSimulator.Build.0 = Debug|Any CPU + {D78A720C-C0C6-478B-8564-F167F9BDD01B}.Ad-Hoc|Mono.ActiveCfg = Debug|Any CPU + {D78A720C-C0C6-478B-8564-F167F9BDD01B}.Ad-Hoc|Mono.Build.0 = Debug|Any CPU + {D78A720C-C0C6-478B-8564-F167F9BDD01B}.Ad-Hoc|x86.ActiveCfg = Debug|Any CPU + {D78A720C-C0C6-478B-8564-F167F9BDD01B}.Ad-Hoc|x86.Build.0 = Debug|Any CPU + {D78A720C-C0C6-478B-8564-F167F9BDD01B}.AppStore|Any CPU.ActiveCfg = Debug|Any CPU + {D78A720C-C0C6-478B-8564-F167F9BDD01B}.AppStore|Any CPU.Build.0 = Debug|Any CPU + {D78A720C-C0C6-478B-8564-F167F9BDD01B}.AppStore|iPhone.ActiveCfg = Debug|Any CPU + {D78A720C-C0C6-478B-8564-F167F9BDD01B}.AppStore|iPhone.Build.0 = Debug|Any CPU + {D78A720C-C0C6-478B-8564-F167F9BDD01B}.AppStore|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {D78A720C-C0C6-478B-8564-F167F9BDD01B}.AppStore|iPhoneSimulator.Build.0 = Debug|Any CPU + {D78A720C-C0C6-478B-8564-F167F9BDD01B}.AppStore|Mono.ActiveCfg = Debug|Any CPU + {D78A720C-C0C6-478B-8564-F167F9BDD01B}.AppStore|Mono.Build.0 = Debug|Any CPU + {D78A720C-C0C6-478B-8564-F167F9BDD01B}.AppStore|x86.ActiveCfg = Debug|Any CPU + {D78A720C-C0C6-478B-8564-F167F9BDD01B}.AppStore|x86.Build.0 = Debug|Any CPU + {D78A720C-C0C6-478B-8564-F167F9BDD01B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D78A720C-C0C6-478B-8564-F167F9BDD01B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D78A720C-C0C6-478B-8564-F167F9BDD01B}.Debug|iPhone.ActiveCfg = Debug|Any CPU + {D78A720C-C0C6-478B-8564-F167F9BDD01B}.Debug|iPhone.Build.0 = Debug|Any CPU + {D78A720C-C0C6-478B-8564-F167F9BDD01B}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {D78A720C-C0C6-478B-8564-F167F9BDD01B}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU + {D78A720C-C0C6-478B-8564-F167F9BDD01B}.Debug|Mono.ActiveCfg = Debug|Any CPU + {D78A720C-C0C6-478B-8564-F167F9BDD01B}.Debug|Mono.Build.0 = Debug|Any CPU + {D78A720C-C0C6-478B-8564-F167F9BDD01B}.Debug|x86.ActiveCfg = Debug|Any CPU + {D78A720C-C0C6-478B-8564-F167F9BDD01B}.Debug|x86.Build.0 = Debug|Any CPU + {D78A720C-C0C6-478B-8564-F167F9BDD01B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D78A720C-C0C6-478B-8564-F167F9BDD01B}.Release|Any CPU.Build.0 = Release|Any CPU + {D78A720C-C0C6-478B-8564-F167F9BDD01B}.Release|iPhone.ActiveCfg = Release|Any CPU + {D78A720C-C0C6-478B-8564-F167F9BDD01B}.Release|iPhone.Build.0 = Release|Any CPU + {D78A720C-C0C6-478B-8564-F167F9BDD01B}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU + {D78A720C-C0C6-478B-8564-F167F9BDD01B}.Release|iPhoneSimulator.Build.0 = Release|Any CPU + {D78A720C-C0C6-478B-8564-F167F9BDD01B}.Release|Mono.ActiveCfg = Release|Any CPU + {D78A720C-C0C6-478B-8564-F167F9BDD01B}.Release|Mono.Build.0 = Release|Any CPU + {D78A720C-C0C6-478B-8564-F167F9BDD01B}.Release|x86.ActiveCfg = Release|Any CPU + {D78A720C-C0C6-478B-8564-F167F9BDD01B}.Release|x86.Build.0 = Release|Any CPU + {E2999E4A-9086-401F-898C-AEB0AD38E676}.Ad-Hoc|Any CPU.ActiveCfg = Debug|Any CPU + {E2999E4A-9086-401F-898C-AEB0AD38E676}.Ad-Hoc|Any CPU.Build.0 = Debug|Any CPU + {E2999E4A-9086-401F-898C-AEB0AD38E676}.Ad-Hoc|iPhone.ActiveCfg = Debug|Any CPU + {E2999E4A-9086-401F-898C-AEB0AD38E676}.Ad-Hoc|iPhone.Build.0 = Debug|Any CPU + {E2999E4A-9086-401F-898C-AEB0AD38E676}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {E2999E4A-9086-401F-898C-AEB0AD38E676}.Ad-Hoc|iPhoneSimulator.Build.0 = Debug|Any CPU + {E2999E4A-9086-401F-898C-AEB0AD38E676}.Ad-Hoc|Mono.ActiveCfg = Debug|Any CPU + {E2999E4A-9086-401F-898C-AEB0AD38E676}.Ad-Hoc|Mono.Build.0 = Debug|Any CPU + {E2999E4A-9086-401F-898C-AEB0AD38E676}.Ad-Hoc|x86.ActiveCfg = Debug|Any CPU + {E2999E4A-9086-401F-898C-AEB0AD38E676}.Ad-Hoc|x86.Build.0 = Debug|Any CPU + {E2999E4A-9086-401F-898C-AEB0AD38E676}.AppStore|Any CPU.ActiveCfg = Debug|Any CPU + {E2999E4A-9086-401F-898C-AEB0AD38E676}.AppStore|Any CPU.Build.0 = Debug|Any CPU + {E2999E4A-9086-401F-898C-AEB0AD38E676}.AppStore|iPhone.ActiveCfg = Debug|Any CPU + {E2999E4A-9086-401F-898C-AEB0AD38E676}.AppStore|iPhone.Build.0 = Debug|Any CPU + {E2999E4A-9086-401F-898C-AEB0AD38E676}.AppStore|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {E2999E4A-9086-401F-898C-AEB0AD38E676}.AppStore|iPhoneSimulator.Build.0 = Debug|Any CPU + {E2999E4A-9086-401F-898C-AEB0AD38E676}.AppStore|Mono.ActiveCfg = Debug|Any CPU + {E2999E4A-9086-401F-898C-AEB0AD38E676}.AppStore|Mono.Build.0 = Debug|Any CPU + {E2999E4A-9086-401F-898C-AEB0AD38E676}.AppStore|x86.ActiveCfg = Debug|Any CPU + {E2999E4A-9086-401F-898C-AEB0AD38E676}.AppStore|x86.Build.0 = Debug|Any CPU + {E2999E4A-9086-401F-898C-AEB0AD38E676}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E2999E4A-9086-401F-898C-AEB0AD38E676}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E2999E4A-9086-401F-898C-AEB0AD38E676}.Debug|iPhone.ActiveCfg = Debug|Any CPU + {E2999E4A-9086-401F-898C-AEB0AD38E676}.Debug|iPhone.Build.0 = Debug|Any CPU + {E2999E4A-9086-401F-898C-AEB0AD38E676}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {E2999E4A-9086-401F-898C-AEB0AD38E676}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU + {E2999E4A-9086-401F-898C-AEB0AD38E676}.Debug|Mono.ActiveCfg = Debug|Any CPU + {E2999E4A-9086-401F-898C-AEB0AD38E676}.Debug|Mono.Build.0 = Debug|Any CPU + {E2999E4A-9086-401F-898C-AEB0AD38E676}.Debug|x86.ActiveCfg = Debug|Any CPU + {E2999E4A-9086-401F-898C-AEB0AD38E676}.Debug|x86.Build.0 = Debug|Any CPU + {E2999E4A-9086-401F-898C-AEB0AD38E676}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E2999E4A-9086-401F-898C-AEB0AD38E676}.Release|Any CPU.Build.0 = Release|Any CPU + {E2999E4A-9086-401F-898C-AEB0AD38E676}.Release|iPhone.ActiveCfg = Release|Any CPU + {E2999E4A-9086-401F-898C-AEB0AD38E676}.Release|iPhone.Build.0 = Release|Any CPU + {E2999E4A-9086-401F-898C-AEB0AD38E676}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU + {E2999E4A-9086-401F-898C-AEB0AD38E676}.Release|iPhoneSimulator.Build.0 = Release|Any CPU + {E2999E4A-9086-401F-898C-AEB0AD38E676}.Release|Mono.ActiveCfg = Release|Any CPU + {E2999E4A-9086-401F-898C-AEB0AD38E676}.Release|Mono.Build.0 = Release|Any CPU + {E2999E4A-9086-401F-898C-AEB0AD38E676}.Release|x86.ActiveCfg = Release|Any CPU + {E2999E4A-9086-401F-898C-AEB0AD38E676}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -2571,5 +2655,9 @@ Global {638580B0-7910-40EF-B674-DCB34DA308CD} = {A0CC0258-D18C-4AB3-854F-7101680FC3F9} {CBC4FF2F-92D4-420B-BE21-9FE0B930B04E} = {B39A8919-9F95-48FE-AD7B-76E08B509888} {E1582370-37B3-403C-917F-8209551B1634} = {C5A00AC3-B34C-4564-9BDD-2DA473EF4D8B} + {E2999E4A-9086-401F-898C-AEB0AD38E676} = {9B9E3891-2366-4253-A952-D08BCEB71098} + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {1E8CA5AA-707A-4C57-A682-D265A49E10C3} EndGlobalSection EndGlobal diff --git a/samples/RemoteTest/Program.cs b/samples/RemoteTest/Program.cs new file mode 100644 index 0000000000..eb5f388e9e --- /dev/null +++ b/samples/RemoteTest/Program.cs @@ -0,0 +1,12 @@ +using System; + +namespace RemoteTest +{ + class Program + { + static void Main(string[] args) + { + Console.WriteLine("Hello World!"); + } + } +} diff --git a/samples/RemoteTest/RemoteTest.csproj b/samples/RemoteTest/RemoteTest.csproj new file mode 100644 index 0000000000..2487c66e41 --- /dev/null +++ b/samples/RemoteTest/RemoteTest.csproj @@ -0,0 +1,25 @@ + + + + Exe + netcoreapp2.0 + + + + + + + + + + + + + + + + + + + + diff --git a/src/Avalonia.Controls/Avalonia.Controls.csproj b/src/Avalonia.Controls/Avalonia.Controls.csproj index 037546b186..47e0f88341 100644 --- a/src/Avalonia.Controls/Avalonia.Controls.csproj +++ b/src/Avalonia.Controls/Avalonia.Controls.csproj @@ -36,6 +36,7 @@ + diff --git a/src/Avalonia.Controls/Embedding/Offscreen/OffscreenTopLevel.cs b/src/Avalonia.Controls/Embedding/Offscreen/OffscreenTopLevel.cs new file mode 100644 index 0000000000..cd2da692ba --- /dev/null +++ b/src/Avalonia.Controls/Embedding/Offscreen/OffscreenTopLevel.cs @@ -0,0 +1,63 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Avalonia.Layout; +using Avalonia.Styling; + +namespace Avalonia.Controls.Embedding.Offscreen +{ + class OffscreenTopLevel : TopLevel, IStyleable + { + public OffscreenTopLevelImplBase Impl { get; } + + public OffscreenTopLevel(OffscreenTopLevelImplBase impl) : base(impl) + { + Impl = impl; + Prepare(); + } + + public void Prepare() + { + EnsureInitialized(); + ApplyTemplate(); + LayoutManager.Instance.ExecuteInitialLayoutPass(this); + } + + private void EnsureInitialized() + { + if (!this.IsInitialized) + { + var init = (ISupportInitialize)this; + init.BeginInit(); + init.EndInit(); + } + } + + private readonly NameScope _nameScope = new NameScope(); + public event EventHandler Registered + { + add { _nameScope.Registered += value; } + remove { _nameScope.Registered -= value; } + } + + public event EventHandler Unregistered + { + add { _nameScope.Unregistered += value; } + remove { _nameScope.Unregistered -= value; } + } + + public void Register(string name, object element) => _nameScope.Register(name, element); + + public object Find(string name) => _nameScope.Find(name); + + public void Unregister(string name) => _nameScope.Unregister(name); + + Type IStyleable.StyleKey => typeof(EmbeddableControlRoot); + public void Dispose() + { + PlatformImpl.Dispose(); + } + } +} diff --git a/src/Avalonia.Controls/Embedding/Offscreen/OffscreenTopLevelImpl.cs b/src/Avalonia.Controls/Embedding/Offscreen/OffscreenTopLevelImpl.cs new file mode 100644 index 0000000000..088f20b270 --- /dev/null +++ b/src/Avalonia.Controls/Embedding/Offscreen/OffscreenTopLevelImpl.cs @@ -0,0 +1,65 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Avalonia.Input; +using Avalonia.Input.Raw; +using Avalonia.Platform; + +namespace Avalonia.Controls.Embedding.Offscreen +{ + abstract class OffscreenTopLevelImplBase : ITopLevelImpl + { + private double _scaling; + private Size _clientSize; + public IInputRoot InputRoot { get; private set; } + + public virtual void Dispose() + { + //No-op + } + + public abstract void Invalidate(Rect rect); + public abstract IEnumerable Surfaces { get; } + + public Size ClientSize + { + get { return _clientSize; } + set + { + _clientSize = value; + Resized?.Invoke(value); + } + } + + public double Scaling + { + get { return _scaling; } + set + { + _scaling = value; + ScalingChanged?.Invoke(value); + } + } + + public Action Input { get; set; } + public Action Paint { get; set; } + public Action Resized { get; set; } + public Action ScalingChanged { get; set; } + public void SetInputRoot(IInputRoot inputRoot) => InputRoot = inputRoot; + + public virtual Point PointToClient(Point point) => point; + + public Point PointToScreen(Point point) + { + throw new NotImplementedException(); + } + + public virtual void SetCursor(IPlatformHandle cursor) + { + } + + public Action Closed { get; set; } + } +} diff --git a/src/Avalonia.Controls/Remote/RemoteServer.cs b/src/Avalonia.Controls/Remote/RemoteServer.cs new file mode 100644 index 0000000000..8c0509c5ba --- /dev/null +++ b/src/Avalonia.Controls/Remote/RemoteServer.cs @@ -0,0 +1,21 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Avalonia.Remote.Protocol; + +namespace Avalonia.Controls.Remote +{ + public class RemoteServer + { + private readonly IAvaloniaRemoteTransport _transport; + + public RemoteServer(IAvaloniaRemoteTransport transport) + { + _transport = transport; + } + + public object Content { get; set; } + } +} diff --git a/src/Avalonia.Controls/Remote/Server/RemoteServerTopLevelImpl.cs b/src/Avalonia.Controls/Remote/Server/RemoteServerTopLevelImpl.cs new file mode 100644 index 0000000000..6c89264c64 --- /dev/null +++ b/src/Avalonia.Controls/Remote/Server/RemoteServerTopLevelImpl.cs @@ -0,0 +1,101 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.InteropServices; +using System.Text; +using System.Threading.Tasks; +using Avalonia.Controls.Embedding.Offscreen; +using Avalonia.Controls.Platform.Surfaces; +using Avalonia.Platform; +using Avalonia.Remote.Protocol; +using Avalonia.Remote.Protocol.Viewport; +using Avalonia.Threading; +using PixelFormat = Avalonia.Platform.PixelFormat; +using ProtocolPixelFormat = Avalonia.Remote.Protocol.Viewport.PixelFormat; + +namespace Avalonia.Controls.Remote.Server +{ + class RemoteServerTopLevelImpl : OffscreenTopLevelImplBase, IFramebufferPlatformSurface + { + private readonly IAvaloniaRemoteTransport _transport; + private LockedFramebuffer _framebuffer; + private object _lock = new object(); + private long _lastSentFrame; + private long _lastReceivedFrame = -1; + private bool _invalidated; + private ProtocolPixelFormat[] _supportedFormats; + + public RemoteServerTopLevelImpl(IAvaloniaRemoteTransport transport) + { + _transport = transport; + _transport.OnMessage += OnMessage; + } + + private void OnMessage(object obj) + { + lock (_lock) + { + var lastFrame = obj as FrameReceivedMessage; + if (lastFrame != null) + { + lock (_lock) + { + _lastReceivedFrame = lastFrame.SequenceId; + } + Dispatcher.UIThread.InvokeAsync(CheckNeedsRender); + } + var supportedFormats = obj as ClientSupportedPixelFormatsMessage; + if (supportedFormats != null) + _supportedFormats = supportedFormats.Formats; + } + } + + public override IEnumerable Surfaces => new[] { this }; + + FrameMessage RenderFrame(int width, int height, Size dpi, ProtocolPixelFormat? format) + { + var fmt = format ?? ProtocolPixelFormat.Rgba8888; + var bpp = fmt == ProtocolPixelFormat.Rgb565 ? 2 : 4; + var data = new byte[width * height * bpp]; + var handle = GCHandle.Alloc(data, GCHandleType.Pinned); + try + { + _framebuffer = new LockedFramebuffer(handle.AddrOfPinnedObject(), width, height, width * bpp, dpi, (PixelFormat)fmt, + null); + Paint?.Invoke(new Rect(0, 0, width, height)); + } + finally + { + _framebuffer = null; + handle.Free(); + } + return new FrameMessage(); + } + + public ILockedFramebuffer Lock() + { + if (_framebuffer == null) + throw new InvalidOperationException("Paint was not requested, wait for Paint event"); + return _framebuffer; + } + + void CheckNeedsRender() + { + ProtocolPixelFormat[] formats; + lock (_lock) + { + if (_lastReceivedFrame != _lastSentFrame && !_invalidated) + return; + formats = _supportedFormats; + } + + //var frame = RenderFrame() + } + + public override void Invalidate(Rect rect) + { + _invalidated = true; + Dispatcher.UIThread.InvokeAsync(CheckNeedsRender); + } + } +} diff --git a/src/Avalonia.Input/Key.cs b/src/Avalonia.Input/Key.cs index 3ea506d79e..c10cbc0a6c 100644 --- a/src/Avalonia.Input/Key.cs +++ b/src/Avalonia.Input/Key.cs @@ -1,7 +1,10 @@ // Copyright (c) The Avalonia Project. All rights reserved. // Licensed under the MIT license. See licence.md file in the project root for full license information. - +#if AVALONIA_REMOTE_PROTOCOL +namespace Avalonia.Remote.Protocol.Input +#else namespace Avalonia.Input +#endif { /// /// Defines the keys available on a keyboard. diff --git a/src/Avalonia.Remote.Protocol/Avalonia.Remote.Protocol.csproj b/src/Avalonia.Remote.Protocol/Avalonia.Remote.Protocol.csproj new file mode 100644 index 0000000000..1ac7ab3a8b --- /dev/null +++ b/src/Avalonia.Remote.Protocol/Avalonia.Remote.Protocol.csproj @@ -0,0 +1,9 @@ + + + netstandard1.3 + AVALONIA_REMOTE_PROTOCOL;$(DefineConstants) + + + + + diff --git a/src/Avalonia.Remote.Protocol/AvaloniaRemoteMessageGuidAttribute.cs b/src/Avalonia.Remote.Protocol/AvaloniaRemoteMessageGuidAttribute.cs new file mode 100644 index 0000000000..12ee3178d3 --- /dev/null +++ b/src/Avalonia.Remote.Protocol/AvaloniaRemoteMessageGuidAttribute.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Avalonia.Remote.Protocol +{ + [AttributeUsage(AttributeTargets.Class)] + public class AvaloniaRemoteMessageGuidAttribute : Attribute + { + public Guid Guid { get; } + + public AvaloniaRemoteMessageGuidAttribute(string guid) + { + Guid = Guid.Parse(guid); + } + } +} diff --git a/src/Avalonia.Remote.Protocol/DefaultMessageTypeResolver.cs b/src/Avalonia.Remote.Protocol/DefaultMessageTypeResolver.cs new file mode 100644 index 0000000000..9d44f33627 --- /dev/null +++ b/src/Avalonia.Remote.Protocol/DefaultMessageTypeResolver.cs @@ -0,0 +1,35 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Text; +using System.Threading.Tasks; + +namespace Avalonia.Remote.Protocol +{ + public class DefaultMessageTypeResolver : IMessageTypeResolver + { + private readonly Dictionary _guidsToTypes = new Dictionary(); + private readonly Dictionary _typesToGuids = new Dictionary(); + public DefaultMessageTypeResolver(params Assembly[] assemblies) + { + foreach (var asm in + (assemblies ?? new Assembly[0]).Concat(new[] + {typeof(AvaloniaRemoteMessageGuidAttribute).GetTypeInfo().Assembly})) + { + foreach (var t in asm.ExportedTypes) + { + var attr = t.GetTypeInfo().GetCustomAttribute(); + if (attr != null) + { + _guidsToTypes[attr.Guid] = t; + _typesToGuids[t] = attr.Guid; + } + } + } + } + + public Type GetByGuid(Guid id) => _guidsToTypes[id]; + public Guid GetGuid(Type type) => _typesToGuids[type]; + } +} diff --git a/src/Avalonia.Remote.Protocol/IMessageTypeResolver.cs b/src/Avalonia.Remote.Protocol/IMessageTypeResolver.cs new file mode 100644 index 0000000000..2e2234b0d6 --- /dev/null +++ b/src/Avalonia.Remote.Protocol/IMessageTypeResolver.cs @@ -0,0 +1,10 @@ +using System; + +namespace Avalonia.Remote.Protocol +{ + public interface IMessageTypeResolver + { + Type GetByGuid(Guid id); + Guid GetGuid(Type type); + } +} \ No newline at end of file diff --git a/src/Avalonia.Remote.Protocol/ITransport.cs b/src/Avalonia.Remote.Protocol/ITransport.cs new file mode 100644 index 0000000000..e90a49ac71 --- /dev/null +++ b/src/Avalonia.Remote.Protocol/ITransport.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Avalonia.Remote.Protocol +{ + public interface IAvaloniaRemoteTransport + { + Task Send(object data); + event Action OnMessage; + event Action OnException; + } +} diff --git a/src/Avalonia.Remote.Protocol/InputMessages.cs b/src/Avalonia.Remote.Protocol/InputMessages.cs new file mode 100644 index 0000000000..f1996372fc --- /dev/null +++ b/src/Avalonia.Remote.Protocol/InputMessages.cs @@ -0,0 +1,82 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +/* + We are keeping copies of core events here, so they can be used + without referencing Avalonia itself, e. g. from projects that + are using WPF, GTK#, etc + */ +namespace Avalonia.Remote.Protocol.Input +{ + /// + /// Keep this in sync with InputModifiers in the main library + /// + [Flags] + public enum InputModifiers + { + Alt, + Control, + Shift, + Windows, + LeftMouseButton, + RightMouseButton, + MiddleMouseButton + } + + /// + /// Keep this in sync with InputModifiers in the main library + /// + public enum MouseButton + { + None, + Left, + Right, + Middle + } + + public abstract class InputEventMessageBase + { + public InputModifiers[] Modifiers { get; set; } + } + + public abstract class PointerEventMessageBase : InputEventMessageBase + { + public double X { get; set; } + public double Y { get; set; } + } + + [AvaloniaRemoteMessageGuid("6228F0B9-99F2-4F62-A621-414DA2881648")] + public class PointerMovedEventMessage : PointerEventMessageBase + { + + } + + [AvaloniaRemoteMessageGuid("7E9E2818-F93F-411A-800E-6B1AEB11DA46")] + public class PointerPressedEventMessage : PointerEventMessageBase + { + public MouseButton Button { get; set; } + } + + [AvaloniaRemoteMessageGuid("4ADC84EE-E7C8-4BCF-986C-DE3A2F78EDE4")] + public class PointerReleasedEventMessage : PointerEventMessageBase + { + public MouseButton Button { get; set; } + } + + [AvaloniaRemoteMessageGuid("79301A05-F02D-4B90-BB39-472563B504AE")] + public class ScrollEventMessage : PointerEventMessageBase + { + public double DeltaX { get; set; } + public double DeltaY { get; set; } + } + + [AvaloniaRemoteMessageGuid("1C3B691E-3D54-4237-BFB0-9FEA83BC1DB8")] + public class KeyEventMessage : InputEventMessageBase + { + public bool IsDown { get; set; } + public Key Key { get; set; } + } + +} diff --git a/src/Avalonia.Remote.Protocol/ViewportMessages.cs b/src/Avalonia.Remote.Protocol/ViewportMessages.cs new file mode 100644 index 0000000000..8e1b0bd99e --- /dev/null +++ b/src/Avalonia.Remote.Protocol/ViewportMessages.cs @@ -0,0 +1,54 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Avalonia.Remote.Protocol.Viewport +{ + public enum PixelFormat + { + Rgb565, + Rgba8888, + Bgra8888 + } + + [AvaloniaRemoteMessageGuid("6E3C5310-E2B1-4C3D-8688-01183AA48C5B")] + public class MeasureViewportMessage + { + public double Width { get; set; } + public double Height { get; set; } + } + + [AvaloniaRemoteMessageGuid("BD7A8DE6-3DB8-4A13-8583-D6D4AB189A31")] + public class ClientViewportAllocatedMessage + { + public double Width { get; set; } + public double Height { get; set; } + } + + [AvaloniaRemoteMessageGuid("63481025-7016-43FE-BADC-F2FD0F88609E")] + public class ClientSupportedPixelFormatsMessage + { + public PixelFormat[] Formats { get; set; } + } + + [AvaloniaRemoteMessageGuid("68014F8A-289D-4851-8D34-5367EDA7F827")] + public class FrameReceivedMessage + { + public long SequenceId { get; set; } + } + + + [AvaloniaRemoteMessageGuid("F58313EE-FE69-4536-819D-F52EDF201A0E")] + public class FrameMessage + { + public long SequenceId { get; set; } + public PixelFormat Format { get; set; } + public byte[] Data { get; set; } + public int Width { get; set; } + public int Height { get; set; } + public int Stride { get; set; } + } + +} diff --git a/src/Avalonia.Visuals/Platform/LockedFramebuffer.cs b/src/Avalonia.Visuals/Platform/LockedFramebuffer.cs new file mode 100644 index 0000000000..c03b714956 --- /dev/null +++ b/src/Avalonia.Visuals/Platform/LockedFramebuffer.cs @@ -0,0 +1,33 @@ +using System; + +namespace Avalonia.Platform +{ + public class LockedFramebuffer : ILockedFramebuffer + { + private readonly Action _onDispose; + + public LockedFramebuffer(IntPtr address, int width, int height, int rowBytes, Vector dpi, PixelFormat format, + Action onDispose) + { + _onDispose = onDispose; + Address = address; + Width = width; + Height = height; + RowBytes = rowBytes; + Dpi = dpi; + Format = format; + } + + public IntPtr Address { get; } + public int Width { get; } + public int Height { get; } + public int RowBytes { get; } + public Vector Dpi { get; } + public PixelFormat Format { get; } + + public void Dispose() + { + _onDispose?.Invoke(); + } + } +} \ No newline at end of file From fe6e8a4d2b9f076d463b87d38e5f1451f83cb194 Mon Sep 17 00:00:00 2001 From: Nikita Tsukanov Date: Sat, 19 Aug 2017 10:53:29 +0300 Subject: [PATCH 02/69] [GTK3] Use lower priority for timers created by Signal() --- src/Gtk/Avalonia.Gtk3/Gtk3Platform.cs | 2 +- src/Gtk/Avalonia.Gtk3/Interop/GlibTimeout.cs | 6 ++++++ src/Gtk/Avalonia.Gtk3/Interop/Native.cs | 3 +++ 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/Gtk/Avalonia.Gtk3/Gtk3Platform.cs b/src/Gtk/Avalonia.Gtk3/Gtk3Platform.cs index 4ea1a5af56..474f29733e 100644 --- a/src/Gtk/Avalonia.Gtk3/Gtk3Platform.cs +++ b/src/Gtk/Avalonia.Gtk3/Gtk3Platform.cs @@ -77,7 +77,7 @@ namespace Avalonia.Gtk3 if (!_signaled) { _signaled = true; - GlibTimeout.Add(0, () => + GlibTimeout.Add(100, 0, () => { lock (_lock) { diff --git a/src/Gtk/Avalonia.Gtk3/Interop/GlibTimeout.cs b/src/Gtk/Avalonia.Gtk3/Interop/GlibTimeout.cs index 9971d8881d..1936d40086 100644 --- a/src/Gtk/Avalonia.Gtk3/Interop/GlibTimeout.cs +++ b/src/Gtk/Avalonia.Gtk3/Interop/GlibTimeout.cs @@ -35,6 +35,12 @@ namespace Avalonia.Gtk3.Interop var handle = GCHandle.Alloc(callback); Native.GTimeoutAdd(interval, PinnedHandler, GCHandle.ToIntPtr(handle)); } + + public static void Add(int priority, uint interval, Func callback) + { + var handle = GCHandle.Alloc(callback); + Native.GTimeoutAddFull(priority, interval, PinnedHandler, GCHandle.ToIntPtr(handle), IntPtr.Zero); + } class Timer : IDisposable { diff --git a/src/Gtk/Avalonia.Gtk3/Interop/Native.cs b/src/Gtk/Avalonia.Gtk3/Interop/Native.cs index fb1a9955e3..5ccdf3424c 100644 --- a/src/Gtk/Avalonia.Gtk3/Interop/Native.cs +++ b/src/Gtk/Avalonia.Gtk3/Interop/Native.cs @@ -241,6 +241,8 @@ namespace Avalonia.Gtk3.Interop [UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.Glib)] public delegate ulong g_timeout_add(uint interval, timeout_callback callback, IntPtr data); [UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.Glib)] + public delegate ulong g_timeout_add_full(int prio, uint interval, timeout_callback callback, IntPtr data, IntPtr destroy); + [UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.Glib)] public delegate ulong g_free(IntPtr data); [UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.Glib)] public unsafe delegate void g_slist_free(GSList* data); @@ -302,6 +304,7 @@ namespace Avalonia.Gtk3.Interop public static D.g_signal_connect_object GSignalConnectObject; public static D.g_signal_handler_disconnect GSignalHandlerDisconnect; public static D.g_timeout_add GTimeoutAdd; + public static D.g_timeout_add_full GTimeoutAddFull; public static D.g_free GFree; public static D.g_slist_free GSlistFree; public static D.g_memory_input_stream_new_from_data GMemoryInputStreamNewFromData; From d384a7f61a20a55f31c0766af173fc0a15c6fa12 Mon Sep 17 00:00:00 2001 From: Nikita Tsukanov Date: Sat, 19 Aug 2017 10:54:27 +0300 Subject: [PATCH 03/69] Added .idea/* to .gitignore --- .gitignore | 1 + src/Avalonia.Remote.Protocol/BsonStreamTransport.cs | 7 +++++++ src/Avalonia.Remote.Protocol/TransportConnectionWrapper.cs | 7 +++++++ 3 files changed, 15 insertions(+) create mode 100644 src/Avalonia.Remote.Protocol/BsonStreamTransport.cs create mode 100644 src/Avalonia.Remote.Protocol/TransportConnectionWrapper.cs diff --git a/.gitignore b/.gitignore index 640725fa26..dc3de9e54c 100644 --- a/.gitignore +++ b/.gitignore @@ -169,3 +169,4 @@ artifacts/ nuget Avalonia.XBuild.sln project.lock.json +.idea/* diff --git a/src/Avalonia.Remote.Protocol/BsonStreamTransport.cs b/src/Avalonia.Remote.Protocol/BsonStreamTransport.cs new file mode 100644 index 0000000000..b16966ffd7 --- /dev/null +++ b/src/Avalonia.Remote.Protocol/BsonStreamTransport.cs @@ -0,0 +1,7 @@ +namespace Avalonia.Remote.Protocol +{ + public class BsonStreamTransport + { + + } +} \ No newline at end of file diff --git a/src/Avalonia.Remote.Protocol/TransportConnectionWrapper.cs b/src/Avalonia.Remote.Protocol/TransportConnectionWrapper.cs new file mode 100644 index 0000000000..a1f1df2a2d --- /dev/null +++ b/src/Avalonia.Remote.Protocol/TransportConnectionWrapper.cs @@ -0,0 +1,7 @@ +namespace Avalonia.Remote.Protocol +{ + public class TransportConnectionWrapper + { + + } +} \ No newline at end of file From 646db5b91472e40b405728396c2d68e4d118a9e2 Mon Sep 17 00:00:00 2001 From: Nikita Tsukanov Date: Sat, 19 Aug 2017 10:55:51 +0300 Subject: [PATCH 04/69] Initial working version of remoting --- samples/ControlCatalog/MainWindow.xaml.cs | 3 +- samples/RemoteTest/Program.cs | 43 ++++- samples/RemoteTest/RemoteTest.csproj | 2 +- src/Avalonia.Base/AvaloniaObject.cs | 1 + .../Offscreen/OffscreenTopLevelImpl.cs | 13 +- src/Avalonia.Controls/Remote/RemoteServer.cs | 26 ++- src/Avalonia.Controls/Remote/RemoteWidget.cs | 79 +++++++++ .../Remote/Server/RemoteServerTopLevelImpl.cs | 107 +++++++++--- .../Avalonia.Remote.Protocol.csproj | 19 ++- .../BsonStreamTransport.cs | 157 +++++++++++++++++- .../BsonTcpTransport.cs | 27 +++ src/Avalonia.Remote.Protocol/EventStash.cs | 72 ++++++++ src/Avalonia.Remote.Protocol/ITransport.cs | 2 +- .../TcpTransportBase.cs | 84 ++++++++++ .../TransportConnectionWrapper.cs | 98 ++++++++++- .../ViewportMessages.cs | 5 +- 16 files changed, 691 insertions(+), 47 deletions(-) create mode 100644 src/Avalonia.Controls/Remote/RemoteWidget.cs create mode 100644 src/Avalonia.Remote.Protocol/BsonTcpTransport.cs create mode 100644 src/Avalonia.Remote.Protocol/EventStash.cs create mode 100644 src/Avalonia.Remote.Protocol/TcpTransportBase.cs diff --git a/samples/ControlCatalog/MainWindow.xaml.cs b/samples/ControlCatalog/MainWindow.xaml.cs index 413794dfa2..c7ff0a60df 100644 --- a/samples/ControlCatalog/MainWindow.xaml.cs +++ b/samples/ControlCatalog/MainWindow.xaml.cs @@ -6,11 +6,12 @@ namespace ControlCatalog { public class MainWindow : Window { + public static bool DebugMode = false; public MainWindow() { this.InitializeComponent(); this.AttachDevTools(); - Renderer.DrawDirtyRects = Renderer.DrawFps = true; + Renderer.DrawDirtyRects = Renderer.DrawFps = DebugMode; } private void InitializeComponent() diff --git a/samples/RemoteTest/Program.cs b/samples/RemoteTest/Program.cs index eb5f388e9e..dce168c7ea 100644 --- a/samples/RemoteTest/Program.cs +++ b/samples/RemoteTest/Program.cs @@ -1,4 +1,13 @@ using System; +using System.Net; +using System.Net.Sockets; +using System.Threading; +using Avalonia; +using Avalonia.Controls; +using Avalonia.Controls.Remote; +using Avalonia.Remote.Protocol; +using Avalonia.Threading; +using ControlCatalog; namespace RemoteTest { @@ -6,7 +15,39 @@ namespace RemoteTest { static void Main(string[] args) { - Console.WriteLine("Hello World!"); + AppBuilder.Configure().UsePlatformDetect().SetupWithoutStarting(); + + var l = new TcpListener(IPAddress.Loopback, 0); + l.Start(); + var port = ((IPEndPoint) l.LocalEndpoint).Port; + l.Stop(); + + var transport = new BsonTcpTransport(); + transport.Listen(IPAddress.Loopback, port, sc => + { + Dispatcher.UIThread.InvokeAsync(() => + { + new RemoteServer(sc).Content = new MainView(); + }); + }); + + var cts = new CancellationTokenSource(); + transport.Connect(IPAddress.Loopback, port).ContinueWith(t => + { + Dispatcher.UIThread.InvokeAsync(() => + { + var window = new Window() + { + Content = new RemoteWidget(t.Result) + }; + window.Closed += delegate { cts.Cancel(); }; + window.Show(); + }); + }); + Dispatcher.UIThread.MainLoop(cts.Token); + + + } } } diff --git a/samples/RemoteTest/RemoteTest.csproj b/samples/RemoteTest/RemoteTest.csproj index 2487c66e41..8682916503 100644 --- a/samples/RemoteTest/RemoteTest.csproj +++ b/samples/RemoteTest/RemoteTest.csproj @@ -2,7 +2,7 @@ Exe - netcoreapp2.0 + netcoreapp1.1 diff --git a/src/Avalonia.Base/AvaloniaObject.cs b/src/Avalonia.Base/AvaloniaObject.cs index 1bdf1eb5e3..f94b6519d5 100644 --- a/src/Avalonia.Base/AvaloniaObject.cs +++ b/src/Avalonia.Base/AvaloniaObject.cs @@ -56,6 +56,7 @@ namespace Avalonia /// public AvaloniaObject() { + CheckAccess(); foreach (var property in AvaloniaPropertyRegistry.Instance.GetRegistered(this)) { object value = property.IsDirect ? diff --git a/src/Avalonia.Controls/Embedding/Offscreen/OffscreenTopLevelImpl.cs b/src/Avalonia.Controls/Embedding/Offscreen/OffscreenTopLevelImpl.cs index 088f20b270..c986c5d07c 100644 --- a/src/Avalonia.Controls/Embedding/Offscreen/OffscreenTopLevelImpl.cs +++ b/src/Avalonia.Controls/Embedding/Offscreen/OffscreenTopLevelImpl.cs @@ -6,12 +6,13 @@ using System.Threading.Tasks; using Avalonia.Input; using Avalonia.Input.Raw; using Avalonia.Platform; +using Avalonia.Rendering; namespace Avalonia.Controls.Embedding.Offscreen { - abstract class OffscreenTopLevelImplBase : ITopLevelImpl + public abstract class OffscreenTopLevelImplBase : ITopLevelImpl { - private double _scaling; + private double _scaling = 1; private Size _clientSize; public IInputRoot InputRoot { get; private set; } @@ -20,6 +21,8 @@ namespace Avalonia.Controls.Embedding.Offscreen //No-op } + public IRenderer CreateRenderer(IRenderRoot root) => new ImmediateRenderer(root); + public abstract void Invalidate(Rect rect); public abstract IEnumerable Surfaces { get; } @@ -51,15 +54,13 @@ namespace Avalonia.Controls.Embedding.Offscreen public virtual Point PointToClient(Point point) => point; - public Point PointToScreen(Point point) - { - throw new NotImplementedException(); - } + public virtual Point PointToScreen(Point point) => point; public virtual void SetCursor(IPlatformHandle cursor) { } public Action Closed { get; set; } + public abstract IMouseDevice MouseDevice { get; } } } diff --git a/src/Avalonia.Controls/Remote/RemoteServer.cs b/src/Avalonia.Controls/Remote/RemoteServer.cs index 8c0509c5ba..0bc43069e7 100644 --- a/src/Avalonia.Controls/Remote/RemoteServer.cs +++ b/src/Avalonia.Controls/Remote/RemoteServer.cs @@ -3,19 +3,37 @@ using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; +using Avalonia.Controls.Embedding; +using Avalonia.Controls.Remote.Server; +using Avalonia.Platform; using Avalonia.Remote.Protocol; namespace Avalonia.Controls.Remote { public class RemoteServer { - private readonly IAvaloniaRemoteTransport _transport; + private EmbeddableControlRoot _topLevel; - public RemoteServer(IAvaloniaRemoteTransport transport) + class TopLevelImpl : RemoteServerTopLevelImpl, IEmbeddableWindowImpl { - _transport = transport; + public TopLevelImpl(IAvaloniaRemoteTransportConnection transport) : base(transport) + { + } + + public event Action LostFocus; + } + + public RemoteServer(IAvaloniaRemoteTransportConnection transport) + { + _topLevel = new EmbeddableControlRoot(new TopLevelImpl(transport)); + _topLevel.Prepare(); + //TODO: Somehow react on closed connection? } - public object Content { get; set; } + public object Content + { + get => _topLevel.Content; + set => _topLevel.Content = value; + } } } diff --git a/src/Avalonia.Controls/Remote/RemoteWidget.cs b/src/Avalonia.Controls/Remote/RemoteWidget.cs new file mode 100644 index 0000000000..f4bcb37d48 --- /dev/null +++ b/src/Avalonia.Controls/Remote/RemoteWidget.cs @@ -0,0 +1,79 @@ +using System; +using System.Runtime.InteropServices; +using Avalonia.Input; +using Avalonia.Media; +using Avalonia.Media.Imaging; +using Avalonia.Remote.Protocol; +using Avalonia.Remote.Protocol.Viewport; +using Avalonia.Threading; +using PixelFormat = Avalonia.Platform.PixelFormat; + +namespace Avalonia.Controls.Remote +{ + public class RemoteWidget : Control + { + private readonly IAvaloniaRemoteTransportConnection _connection; + private FrameMessage _lastFrame; + private WritableBitmap _bitmap; + public RemoteWidget(IAvaloniaRemoteTransportConnection connection) + { + _connection = connection; + _connection.OnMessage += msg => Dispatcher.UIThread.InvokeAsync(() => OnMessage(msg)); + _connection.Send(new ClientSupportedPixelFormatsMessage + { + Formats = new[] + { + Avalonia.Remote.Protocol.Viewport.PixelFormat.Bgra8888, + Avalonia.Remote.Protocol.Viewport.PixelFormat.Rgba8888, + } + }); + } + + private void OnMessage(object msg) + { + if (msg is FrameMessage frame) + { + _connection.Send(new FrameReceivedMessage + { + SequenceId = frame.SequenceId + }); + _lastFrame = frame; + InvalidateVisual(); + } + + } + + protected override void ArrangeCore(Rect finalRect) + { + _connection.Send(new ClientViewportAllocatedMessage + { + Width = finalRect.Width, + Height = finalRect.Height, + DpiX = 96, + DpiY = 96 //TODO: Somehow detect the actual DPI + }); + base.ArrangeCore(finalRect); + } + + public override void Render(DrawingContext context) + { + if (_lastFrame != null) + { + var fmt = (PixelFormat) _lastFrame.Format; + if (_bitmap == null || _bitmap.PixelWidth != _lastFrame.Width || + _bitmap.PixelHeight != _lastFrame.Height) + _bitmap = new WritableBitmap(_lastFrame.Width, _lastFrame.Height, fmt); + using (var l = _bitmap.Lock()) + { + var lineLen = (fmt == PixelFormat.Rgb565 ? 2 : 4) * _lastFrame.Width; + for (var y = 0; y < _lastFrame.Height; y++) + Marshal.Copy(_lastFrame.Data, y * _lastFrame.Stride, + new IntPtr(l.Address.ToInt64() + l.RowBytes * y), lineLen); + } + context.DrawImage(_bitmap, 1, new Rect(0, 0, _bitmap.PixelWidth, _bitmap.PixelHeight), + new Rect(Bounds.Size)); + } + base.Render(context); + } + } +} \ No newline at end of file diff --git a/src/Avalonia.Controls/Remote/Server/RemoteServerTopLevelImpl.cs b/src/Avalonia.Controls/Remote/Server/RemoteServerTopLevelImpl.cs index 6c89264c64..be97f7caaa 100644 --- a/src/Avalonia.Controls/Remote/Server/RemoteServerTopLevelImpl.cs +++ b/src/Avalonia.Controls/Remote/Server/RemoteServerTopLevelImpl.cs @@ -6,6 +6,8 @@ using System.Text; using System.Threading.Tasks; using Avalonia.Controls.Embedding.Offscreen; using Avalonia.Controls.Platform.Surfaces; +using Avalonia.Input; +using Avalonia.Layout; using Avalonia.Platform; using Avalonia.Remote.Protocol; using Avalonia.Remote.Protocol.Viewport; @@ -15,17 +17,20 @@ using ProtocolPixelFormat = Avalonia.Remote.Protocol.Viewport.PixelFormat; namespace Avalonia.Controls.Remote.Server { - class RemoteServerTopLevelImpl : OffscreenTopLevelImplBase, IFramebufferPlatformSurface + public class RemoteServerTopLevelImpl : OffscreenTopLevelImplBase, IFramebufferPlatformSurface { - private readonly IAvaloniaRemoteTransport _transport; + private readonly IAvaloniaRemoteTransportConnection _transport; private LockedFramebuffer _framebuffer; private object _lock = new object(); - private long _lastSentFrame; + private long _lastSentFrame = -1; private long _lastReceivedFrame = -1; + private long _nextFrameNumber = 1; + private ClientViewportAllocatedMessage _pendingAllocation; private bool _invalidated; + private Vector _dpi = new Vector(96, 96); private ProtocolPixelFormat[] _supportedFormats; - public RemoteServerTopLevelImpl(IAvaloniaRemoteTransport transport) + public RemoteServerTopLevelImpl(IAvaloniaRemoteTransportConnection transport) { _transport = transport; _transport.OnMessage += OnMessage; @@ -35,24 +40,64 @@ namespace Avalonia.Controls.Remote.Server { lock (_lock) { - var lastFrame = obj as FrameReceivedMessage; - if (lastFrame != null) + if (obj is FrameReceivedMessage lastFrame) { lock (_lock) { _lastReceivedFrame = lastFrame.SequenceId; } - Dispatcher.UIThread.InvokeAsync(CheckNeedsRender); + Dispatcher.UIThread.InvokeAsync(RenderIfNeeded); + } + if (obj is ClientSupportedPixelFormatsMessage supportedFormats) + { + lock (_lock) + _supportedFormats = supportedFormats.Formats; + Dispatcher.UIThread.InvokeAsync(RenderIfNeeded); + } + if (obj is MeasureViewportMessage measure) + Dispatcher.UIThread.InvokeAsync(() => + { + var m = Measure(new Size(measure.Width, measure.Height)); + _transport.Send(new MeasureViewportMessage + { + Width = m.Width, + Height = m.Height + }); + }); + if (obj is ClientViewportAllocatedMessage allocated) + { + lock (_lock) + { + if (_pendingAllocation == null) + Dispatcher.UIThread.InvokeAsync(() => + { + ClientViewportAllocatedMessage allocation; + lock (_lock) + { + allocation = _pendingAllocation; + _pendingAllocation = null; + } + _dpi = new Vector(allocation.DpiX, allocation.DpiY); + ClientSize = new Size(allocation.Width, allocation.Height); + RenderIfNeeded(); + }); + + _pendingAllocation = allocated; + } } - var supportedFormats = obj as ClientSupportedPixelFormatsMessage; - if (supportedFormats != null) - _supportedFormats = supportedFormats.Formats; } } + protected virtual Size Measure(Size constaint) + { + var l = (ILayoutable) InputRoot; + l.Measure(constaint); + return l.DesiredSize; + } + public override IEnumerable Surfaces => new[] { this }; - FrameMessage RenderFrame(int width, int height, Size dpi, ProtocolPixelFormat? format) + FrameMessage RenderFrame(int width, int height, ProtocolPixelFormat? format) { var fmt = format ?? ProtocolPixelFormat.Rgba8888; var bpp = fmt == ProtocolPixelFormat.Rgb565 ? 2 : 4; @@ -60,7 +105,7 @@ namespace Avalonia.Controls.Remote.Server var handle = GCHandle.Alloc(data, GCHandleType.Pinned); try { - _framebuffer = new LockedFramebuffer(handle.AddrOfPinnedObject(), width, height, width * bpp, dpi, (PixelFormat)fmt, + _framebuffer = new LockedFramebuffer(handle.AddrOfPinnedObject(), width, height, width * bpp, _dpi, (PixelFormat)fmt, null); Paint?.Invoke(new Rect(0, 0, width, height)); } @@ -69,7 +114,14 @@ namespace Avalonia.Controls.Remote.Server _framebuffer = null; handle.Free(); } - return new FrameMessage(); + return new FrameMessage + { + Data = data, + Format = (ProtocolPixelFormat) format, + Width = width, + Height = height, + Stride = width * bpp, + }; } public ILockedFramebuffer Lock() @@ -79,23 +131,40 @@ namespace Avalonia.Controls.Remote.Server return _framebuffer; } - void CheckNeedsRender() + void RenderIfNeeded() { - ProtocolPixelFormat[] formats; lock (_lock) { - if (_lastReceivedFrame != _lastSentFrame && !_invalidated) + if (_lastReceivedFrame != _lastSentFrame || !_invalidated || _supportedFormats == null) return; - formats = _supportedFormats; + } + if (ClientSize.Width < 1 || ClientSize.Height < 1) + return; + var format = ProtocolPixelFormat.Rgba8888; + foreach(var fmt in _supportedFormats) + if (fmt <= ProtocolPixelFormat.MaxValue) + { + format = fmt; + break; + } - //var frame = RenderFrame() + var frame = RenderFrame((int) ClientSize.Width, (int) ClientSize.Height, format); + lock (_lock) + { + _lastSentFrame = _nextFrameNumber++; + frame.SequenceId = _lastSentFrame; + _invalidated = false; + } + _transport.Send(frame); } public override void Invalidate(Rect rect) { _invalidated = true; - Dispatcher.UIThread.InvokeAsync(CheckNeedsRender); + Dispatcher.UIThread.InvokeAsync(RenderIfNeeded); } + + public override IMouseDevice MouseDevice { get; } = new MouseDevice(); } } diff --git a/src/Avalonia.Remote.Protocol/Avalonia.Remote.Protocol.csproj b/src/Avalonia.Remote.Protocol/Avalonia.Remote.Protocol.csproj index 1ac7ab3a8b..a9c6b9e9a0 100644 --- a/src/Avalonia.Remote.Protocol/Avalonia.Remote.Protocol.csproj +++ b/src/Avalonia.Remote.Protocol/Avalonia.Remote.Protocol.csproj @@ -1,9 +1,10 @@ - - - netstandard1.3 - AVALONIA_REMOTE_PROTOCOL;$(DefineConstants) - - - - - + + + netstandard1.3 + AVALONIA_REMOTE_PROTOCOL;$(DefineConstants) + + + + + + \ No newline at end of file diff --git a/src/Avalonia.Remote.Protocol/BsonStreamTransport.cs b/src/Avalonia.Remote.Protocol/BsonStreamTransport.cs index b16966ffd7..8c983c385d 100644 --- a/src/Avalonia.Remote.Protocol/BsonStreamTransport.cs +++ b/src/Avalonia.Remote.Protocol/BsonStreamTransport.cs @@ -1,7 +1,160 @@ -namespace Avalonia.Remote.Protocol +using System; +using System.Collections.Generic; +using System.IO; +using System.Threading; +using Newtonsoft.Json; +using System.Threading.Tasks; +using Newtonsoft.Json.Bson; + +namespace Avalonia.Remote.Protocol { - public class BsonStreamTransport + public class BsonStreamTransportConnection : IAvaloniaRemoteTransportConnection { + private readonly IMessageTypeResolver _resolver; + private readonly Stream _inputStream; + private readonly Stream _outputStream; + private readonly Action _disposeCallback; + private readonly CancellationToken _cancel; + private readonly CancellationTokenSource _cancelSource; + private readonly MemoryStream _outputBlock = new MemoryStream(); + private readonly object _lock = new object(); + private bool _writeOperationPending; + private bool _readingAlreadyStarted; + private bool _writerIsBroken; + static readonly JsonSerializer Serializer = new JsonSerializer(); + private static readonly byte[] ZeroLength = new byte[4]; + + public BsonStreamTransportConnection(IMessageTypeResolver resolver, Stream inputStream, Stream outputStream, Action disposeCallback) + { + _resolver = resolver; + _inputStream = inputStream; + _outputStream = outputStream; + _disposeCallback = disposeCallback; + _cancelSource = new CancellationTokenSource(); + _cancel = _cancelSource.Token; + } + + public void Dispose() + { + _cancelSource.Cancel(); + _disposeCallback?.Invoke(); + } + public void StartReading() + { + lock (_lock) + { + if(_readingAlreadyStarted) + throw new InvalidOperationException("Reading has already started"); + _readingAlreadyStarted = true; + Task.Run(Reader, _cancel); + } + } + + async Task ReadExact(byte[] buffer) + { + int read = 0; + while (read != buffer.Length) + { + var readNow = await _inputStream.ReadAsync(buffer, read, buffer.Length - read, _cancel) + .ConfigureAwait(false); + if (readNow == 0) + throw new EndOfStreamException(); + read += readNow; + } + } + + async Task Reader() + { + Task.Yield(); + try + { + while (true) + { + var infoBlock = new byte[20]; + await ReadExact(infoBlock).ConfigureAwait(false); + var length = BitConverter.ToInt32(infoBlock, 0); + var guidBytes = new byte[16]; + Buffer.BlockCopy(infoBlock, 4, guidBytes, 0, 16); + var guid = new Guid(guidBytes); + var buffer = new byte[length]; + await ReadExact(buffer).ConfigureAwait(false); + if (Environment.GetEnvironmentVariable("WTF") == "WTF") + { + + using (var f = System.IO.File.Create("/tmp/wtf2.bin")) + { + f.Write(infoBlock, 0, infoBlock.Length); + f.Write(buffer, 0, buffer.Length); + } + } + var message = Serializer.Deserialize(new BsonReader(new MemoryStream(buffer)), _resolver.GetByGuid(guid)); + OnMessage?.Invoke(message); + } + } + catch (Exception e) + { + FireException(e); + } + } + + + public async Task Send(object data) + { + lock (_lock) + { + if(_writerIsBroken) //Ignore further calls, since there is no point of writing to "broken" stream + return; + if (_writeOperationPending) + throw new InvalidOperationException("Previous send operation was not finished"); + _writeOperationPending = true; + } + try + { + var guid = _resolver.GetGuid(data.GetType()).ToByteArray(); + _outputBlock.Seek(0, SeekOrigin.Begin); + _outputBlock.SetLength(0); + _outputBlock.Write(ZeroLength, 0, 4); + _outputBlock.Write(guid, 0, guid.Length); + var writer = new BsonWriter(_outputBlock); + Serializer.Serialize(writer, data); + _outputBlock.Seek(0, SeekOrigin.Begin); + var length = BitConverter.GetBytes((int)_outputBlock.Length - 20); + _outputBlock.Write(length, 0, length.Length); + _outputBlock.Seek(0, SeekOrigin.Begin); + + try + { + await _outputBlock.CopyToAsync(_outputStream, 0x1000, _cancel).ConfigureAwait(false); + } + catch (Exception e) //We are only catching "network"-related exceptions here + { + lock (_lock) + { + _writerIsBroken = true; + } + FireException(e); + } + } + finally + { + lock (_lock) + { + _writeOperationPending = false; + } + } + } + + void FireException(Exception e) + { + var cancel = e as OperationCanceledException; + if (cancel?.CancellationToken == _cancel) + return; + OnException?.Invoke(e); + } + + + public event Action OnMessage; + public event Action OnException; } } \ No newline at end of file diff --git a/src/Avalonia.Remote.Protocol/BsonTcpTransport.cs b/src/Avalonia.Remote.Protocol/BsonTcpTransport.cs new file mode 100644 index 0000000000..e647f75997 --- /dev/null +++ b/src/Avalonia.Remote.Protocol/BsonTcpTransport.cs @@ -0,0 +1,27 @@ +using System; +using System.IO; +using System.Reflection; + +namespace Avalonia.Remote.Protocol +{ + public class BsonTcpTransport : TcpTransportBase + { + public BsonTcpTransport(IMessageTypeResolver resolver) : base(resolver) + { + } + + public BsonTcpTransport() : this(new DefaultMessageTypeResolver(typeof(BsonTcpTransport).GetTypeInfo().Assembly)) + { + + } + + protected override IAvaloniaRemoteTransportConnection CreateTransport(IMessageTypeResolver resolver, + Stream stream, Action dispose) + { + var t = new BsonStreamTransportConnection(resolver, stream, stream, dispose); + var wrap = new TransportConnectionWrapper(t); + t.StartReading(); + return wrap; + } + } +} \ No newline at end of file diff --git a/src/Avalonia.Remote.Protocol/EventStash.cs b/src/Avalonia.Remote.Protocol/EventStash.cs new file mode 100644 index 0000000000..06840c8253 --- /dev/null +++ b/src/Avalonia.Remote.Protocol/EventStash.cs @@ -0,0 +1,72 @@ +using System; +using System.Collections.Generic; + +namespace Avalonia.Remote.Protocol +{ + public class EventStash + { + private readonly Action _exceptionHandler; + private List _stash; + private Action _delegate; + + public EventStash(Action exceptionHandler = null) + { + _exceptionHandler = exceptionHandler; + } + + public void Add(Action handler) + { + List stash; + lock (this) + { + var needsReplay = _delegate == null; + _delegate += handler; + if(!needsReplay) + return; + + lock (this) + { + stash = _stash; + if(_stash == null) + return; + _stash = null; + } + } + foreach (var m in stash) + { + if (_exceptionHandler != null) + try + { + _delegate?.Invoke(m); + } + catch (Exception e) + { + _exceptionHandler(e); + } + else + _delegate?.Invoke(m); + } + } + + + public void Remove(Action handler) + { + lock (this) + _delegate -= handler; + } + + public void Fire(T ev) + { + if (_delegate == null) + { + lock (this) + { + _stash = _stash ?? new List(); + _stash.Add(ev); + } + } + else + _delegate?.Invoke(ev); + } + } +} \ No newline at end of file diff --git a/src/Avalonia.Remote.Protocol/ITransport.cs b/src/Avalonia.Remote.Protocol/ITransport.cs index e90a49ac71..d4e5427cb4 100644 --- a/src/Avalonia.Remote.Protocol/ITransport.cs +++ b/src/Avalonia.Remote.Protocol/ITransport.cs @@ -6,7 +6,7 @@ using System.Threading.Tasks; namespace Avalonia.Remote.Protocol { - public interface IAvaloniaRemoteTransport + public interface IAvaloniaRemoteTransportConnection : IDisposable { Task Send(object data); event Action OnMessage; diff --git a/src/Avalonia.Remote.Protocol/TcpTransportBase.cs b/src/Avalonia.Remote.Protocol/TcpTransportBase.cs new file mode 100644 index 0000000000..4278badaae --- /dev/null +++ b/src/Avalonia.Remote.Protocol/TcpTransportBase.cs @@ -0,0 +1,84 @@ +using System; +using System.IO; +using System.Net; +using System.Net.Sockets; +using System.Threading.Tasks; + +namespace Avalonia.Remote.Protocol +{ + public abstract class TcpTransportBase + { + private readonly IMessageTypeResolver _resolver; + + public TcpTransportBase(IMessageTypeResolver resolver) + { + _resolver = resolver; + } + + protected abstract IAvaloniaRemoteTransportConnection CreateTransport(IMessageTypeResolver resolver, + Stream stream, Action disposeCallback); + + class DisposableServer : IDisposable + { + private readonly TcpListener _l; + + public DisposableServer(TcpListener l) + { + _l = l; + } + public void Dispose() + { + try + { + _l.Stop(); + } + catch + { + //Ignore + } + } + } + + public IDisposable Listen(IPAddress address, int port, Action cb) + { + var server = new TcpListener(address, port); + async void AcceptNew() + { + try + { + var cl = await server.AcceptTcpClientAsync(); + AcceptNew(); + Task.Run(async () => + { + try + { + var tcs = new TaskCompletionSource(); + var t = CreateTransport(_resolver, cl.GetStream(), () => tcs.TrySetResult(0)); + cb(t); + await tcs.Task; + } + finally + { + cl.Dispose(); + } + + }); + } + catch + { + //Ignore and stop + } + } + server.Start(); + AcceptNew(); + return new DisposableServer(server); + } + + public async Task Connect(IPAddress address, int port) + { + var c = new TcpClient(); + await c.ConnectAsync(address, port); + return CreateTransport(_resolver, c.GetStream(), c.Dispose); + } + } +} \ No newline at end of file diff --git a/src/Avalonia.Remote.Protocol/TransportConnectionWrapper.cs b/src/Avalonia.Remote.Protocol/TransportConnectionWrapper.cs index a1f1df2a2d..b01b6d7303 100644 --- a/src/Avalonia.Remote.Protocol/TransportConnectionWrapper.cs +++ b/src/Avalonia.Remote.Protocol/TransportConnectionWrapper.cs @@ -1,7 +1,101 @@ -namespace Avalonia.Remote.Protocol +using System; +using System.Collections.Generic; +using System.Threading.Tasks; + +namespace Avalonia.Remote.Protocol { - public class TransportConnectionWrapper + public class TransportConnectionWrapper : IAvaloniaRemoteTransportConnection { + private readonly IAvaloniaRemoteTransportConnection _conn; + private EventStash _onMessage; + private EventStash _onException = new EventStash(); + private Queue _sendQueue = new Queue(); + private object _lock =new object(); + private TaskCompletionSource _signal; + private bool _workerIsAlive; + public TransportConnectionWrapper(IAvaloniaRemoteTransportConnection conn) + { + _conn = conn; + _onMessage = new EventStash(_onException.Fire); + _conn.OnException +=_onException.Fire; + conn.OnMessage += _onMessage.Fire; + + } + + class SendOperation + { + public object Message { get; set; } + public TaskCompletionSource Tcs { get; set; } + } + + public void Dispose() => _conn.Dispose(); + + async void Worker() + { + while (true) + { + SendOperation wi = null; + lock (_lock) + { + if (_sendQueue.Count != 0) + wi = _sendQueue.Dequeue(); + } + if (wi == null) + { + var signal = new TaskCompletionSource(); + lock (_lock) + _signal = signal; + await signal.Task.ConfigureAwait(false); + continue; + } + try + { + await _conn.Send(wi.Message).ConfigureAwait(false); + wi.Tcs.TrySetResult(0); + } + catch (Exception e) + { + wi.Tcs.TrySetException(e); + } + } + + } + + public Task Send(object data) + { + var tcs = new TaskCompletionSource(); + lock (_lock) + { + if (!_workerIsAlive) + { + _workerIsAlive = true; + Worker(); + } + _sendQueue.Enqueue(new SendOperation + { + Message = data, + Tcs = tcs + }); + if (_signal != null) + { + _signal.SetResult(0); + _signal = null; + } + } + return tcs.Task; + } + + public event Action OnMessage + { + add => _onMessage.Add(value); + remove => _onMessage.Remove(value); + } + + public event Action OnException + { + add => _onException.Add(value); + remove => _onException.Remove(value); + } } } \ No newline at end of file diff --git a/src/Avalonia.Remote.Protocol/ViewportMessages.cs b/src/Avalonia.Remote.Protocol/ViewportMessages.cs index 8e1b0bd99e..82a7688f37 100644 --- a/src/Avalonia.Remote.Protocol/ViewportMessages.cs +++ b/src/Avalonia.Remote.Protocol/ViewportMessages.cs @@ -10,7 +10,8 @@ namespace Avalonia.Remote.Protocol.Viewport { Rgb565, Rgba8888, - Bgra8888 + Bgra8888, + MaxValue = Bgra8888 } [AvaloniaRemoteMessageGuid("6E3C5310-E2B1-4C3D-8688-01183AA48C5B")] @@ -25,6 +26,8 @@ namespace Avalonia.Remote.Protocol.Viewport { public double Width { get; set; } public double Height { get; set; } + public double DpiX { get; set; } + public double DpiY { get; set; } } [AvaloniaRemoteMessageGuid("63481025-7016-43FE-BADC-F2FD0F88609E")] From 9a1348b37b87a30048ddb197c5c2f3d6545bfe6e Mon Sep 17 00:00:00 2001 From: Nikita Tsukanov Date: Sun, 24 Sep 2017 00:37:11 +0300 Subject: [PATCH 05/69] Initial remote XAML previewer implementation --- Avalonia.sln | 92 +++++++++- Avalonia.sln.DotSettings | 1 + samples/ControlCatalog.NetCore/Program.cs | 22 ++- samples/Previewer/App.xaml | 6 + samples/Previewer/App.xaml.cs | 14 ++ samples/Previewer/Center.cs | 19 ++ samples/Previewer/MainWindow.xaml | 12 ++ samples/Previewer/MainWindow.xaml.cs | 86 +++++++++ samples/Previewer/Previewer.csproj | 27 +++ samples/Previewer/Program.cs | 13 ++ samples/RemoteTest/RemoteTest.csproj | 2 +- src/Avalonia.Controls/Design.cs | 2 +- .../InternalPlatformThreadingInterface.cs} | 14 +- src/Avalonia.Controls/Remote/RemoteWidget.cs | 2 +- .../Remote/Server/RemoteServerTopLevelImpl.cs | 10 +- .../DesignWindowLoader.cs | 76 ++++++++ .../DesignerAssist.cs | 60 +----- .../Avalonia.DotNetFrameworkRuntime.csproj | 4 +- .../BsonStreamTransport.cs | 19 +- .../DesignMessages.cs | 17 ++ src/Avalonia.Remote.Protocol/EventStash.cs | 20 +- src/Avalonia.Remote.Protocol/ITransport.cs | 4 +- .../TcpTransportBase.cs | 16 +- .../TransportConnectionWrapper.cs | 12 +- .../ViewportMessages.cs | 7 + .../Avalonia.LinuxFramebuffer.csproj | 24 +-- .../LinuxFramebufferPlatform.cs | 7 +- src/Linux/Avalonia.LinuxFramebuffer/Mice.cs | 2 +- .../Avalonia.Designer.HostApp.csproj | 25 +++ .../DetachableTransportConnection.cs | 35 ++++ .../PreviewerWindowImpl.cs | 91 +++++++++ .../PreviewerWindowingPlatform.cs | 66 +++++++ .../Avalonia.Designer.HostApp/Program.cs | 173 ++++++++++++++++++ src/tools/Avalonia.Designer.HostApp/Stubs.cs | 136 ++++++++++++++ 34 files changed, 977 insertions(+), 139 deletions(-) create mode 100644 samples/Previewer/App.xaml create mode 100644 samples/Previewer/App.xaml.cs create mode 100644 samples/Previewer/Center.cs create mode 100644 samples/Previewer/MainWindow.xaml create mode 100644 samples/Previewer/MainWindow.xaml.cs create mode 100644 samples/Previewer/Previewer.csproj create mode 100644 samples/Previewer/Program.cs rename src/{Linux/Avalonia.LinuxFramebuffer/PlatformThreadingInterface.cs => Avalonia.Controls/Platform/InternalPlatformThreadingInterface.cs} (89%) create mode 100644 src/Avalonia.DesignerSupport/DesignWindowLoader.cs create mode 100644 src/Avalonia.Remote.Protocol/DesignMessages.cs create mode 100644 src/tools/Avalonia.Designer.HostApp/Avalonia.Designer.HostApp.csproj create mode 100644 src/tools/Avalonia.Designer.HostApp/DetachableTransportConnection.cs create mode 100644 src/tools/Avalonia.Designer.HostApp/PreviewerWindowImpl.cs create mode 100644 src/tools/Avalonia.Designer.HostApp/PreviewerWindowingPlatform.cs create mode 100644 src/tools/Avalonia.Designer.HostApp/Program.cs create mode 100644 src/tools/Avalonia.Designer.HostApp/Stubs.cs diff --git a/Avalonia.sln b/Avalonia.sln index 56c489fd0b..2f2b175fa3 100644 --- a/Avalonia.sln +++ b/Avalonia.sln @@ -1,4 +1,4 @@ -Microsoft Visual Studio Solution File, Format Version 12.00 +Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 15 VisualStudioVersion = 15.0.26730.3 MinimumVisualStudioVersion = 10.0.40219.1 @@ -189,6 +189,12 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Avalonia.Remote.Protocol", EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RemoteTest", "samples\RemoteTest\RemoteTest.csproj", "{E2999E4A-9086-401F-898C-AEB0AD38E676}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tools", "Tools", "{4ED8B739-6F4E-4CD4-B993-545E6B5CE637}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Avalonia.Designer.HostApp", "src\tools\Avalonia.Designer.HostApp\Avalonia.Designer.HostApp.csproj", "{050CC912-FF49-4A8B-B534-9544017446DD}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Previewer", "samples\Previewer\Previewer.csproj", "{F40FC0A2-1BC3-401C-BFC1-928EC4D4A9CE}" +EndProject Global GlobalSection(SharedMSBuildProjectFiles) = preSolution src\Shared\RenderHelpers\RenderHelpers.projitems*{3c4c0cb4-0c0f-4450-a37b-148c84ff905f}*SharedItemsImports = 13 @@ -2598,6 +2604,86 @@ Global {E2999E4A-9086-401F-898C-AEB0AD38E676}.Release|Mono.Build.0 = Release|Any CPU {E2999E4A-9086-401F-898C-AEB0AD38E676}.Release|x86.ActiveCfg = Release|Any CPU {E2999E4A-9086-401F-898C-AEB0AD38E676}.Release|x86.Build.0 = Release|Any CPU + {050CC912-FF49-4A8B-B534-9544017446DD}.Ad-Hoc|Any CPU.ActiveCfg = Ad-Hoc|Any CPU + {050CC912-FF49-4A8B-B534-9544017446DD}.Ad-Hoc|Any CPU.Build.0 = Ad-Hoc|Any CPU + {050CC912-FF49-4A8B-B534-9544017446DD}.Ad-Hoc|iPhone.ActiveCfg = Ad-Hoc|iPhone + {050CC912-FF49-4A8B-B534-9544017446DD}.Ad-Hoc|iPhone.Build.0 = Ad-Hoc|iPhone + {050CC912-FF49-4A8B-B534-9544017446DD}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Ad-Hoc|iPhoneSimulator + {050CC912-FF49-4A8B-B534-9544017446DD}.Ad-Hoc|iPhoneSimulator.Build.0 = Ad-Hoc|iPhoneSimulator + {050CC912-FF49-4A8B-B534-9544017446DD}.Ad-Hoc|Mono.ActiveCfg = Ad-Hoc|Mono + {050CC912-FF49-4A8B-B534-9544017446DD}.Ad-Hoc|Mono.Build.0 = Ad-Hoc|Mono + {050CC912-FF49-4A8B-B534-9544017446DD}.Ad-Hoc|x86.ActiveCfg = Ad-Hoc|x86 + {050CC912-FF49-4A8B-B534-9544017446DD}.Ad-Hoc|x86.Build.0 = Ad-Hoc|x86 + {050CC912-FF49-4A8B-B534-9544017446DD}.AppStore|Any CPU.ActiveCfg = AppStore|Any CPU + {050CC912-FF49-4A8B-B534-9544017446DD}.AppStore|Any CPU.Build.0 = AppStore|Any CPU + {050CC912-FF49-4A8B-B534-9544017446DD}.AppStore|iPhone.ActiveCfg = AppStore|iPhone + {050CC912-FF49-4A8B-B534-9544017446DD}.AppStore|iPhone.Build.0 = AppStore|iPhone + {050CC912-FF49-4A8B-B534-9544017446DD}.AppStore|iPhoneSimulator.ActiveCfg = AppStore|iPhoneSimulator + {050CC912-FF49-4A8B-B534-9544017446DD}.AppStore|iPhoneSimulator.Build.0 = AppStore|iPhoneSimulator + {050CC912-FF49-4A8B-B534-9544017446DD}.AppStore|Mono.ActiveCfg = AppStore|Mono + {050CC912-FF49-4A8B-B534-9544017446DD}.AppStore|Mono.Build.0 = AppStore|Mono + {050CC912-FF49-4A8B-B534-9544017446DD}.AppStore|x86.ActiveCfg = AppStore|x86 + {050CC912-FF49-4A8B-B534-9544017446DD}.AppStore|x86.Build.0 = AppStore|x86 + {050CC912-FF49-4A8B-B534-9544017446DD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {050CC912-FF49-4A8B-B534-9544017446DD}.Debug|Any CPU.Build.0 = Debug|Any CPU + {050CC912-FF49-4A8B-B534-9544017446DD}.Debug|iPhone.ActiveCfg = Debug|iPhone + {050CC912-FF49-4A8B-B534-9544017446DD}.Debug|iPhone.Build.0 = Debug|iPhone + {050CC912-FF49-4A8B-B534-9544017446DD}.Debug|iPhoneSimulator.ActiveCfg = Debug|iPhoneSimulator + {050CC912-FF49-4A8B-B534-9544017446DD}.Debug|iPhoneSimulator.Build.0 = Debug|iPhoneSimulator + {050CC912-FF49-4A8B-B534-9544017446DD}.Debug|Mono.ActiveCfg = Debug|Mono + {050CC912-FF49-4A8B-B534-9544017446DD}.Debug|Mono.Build.0 = Debug|Mono + {050CC912-FF49-4A8B-B534-9544017446DD}.Debug|x86.ActiveCfg = Debug|x86 + {050CC912-FF49-4A8B-B534-9544017446DD}.Debug|x86.Build.0 = Debug|x86 + {050CC912-FF49-4A8B-B534-9544017446DD}.Release|Any CPU.ActiveCfg = Release|Any CPU + {050CC912-FF49-4A8B-B534-9544017446DD}.Release|Any CPU.Build.0 = Release|Any CPU + {050CC912-FF49-4A8B-B534-9544017446DD}.Release|iPhone.ActiveCfg = Release|iPhone + {050CC912-FF49-4A8B-B534-9544017446DD}.Release|iPhone.Build.0 = Release|iPhone + {050CC912-FF49-4A8B-B534-9544017446DD}.Release|iPhoneSimulator.ActiveCfg = Release|iPhoneSimulator + {050CC912-FF49-4A8B-B534-9544017446DD}.Release|iPhoneSimulator.Build.0 = Release|iPhoneSimulator + {050CC912-FF49-4A8B-B534-9544017446DD}.Release|Mono.ActiveCfg = Release|Mono + {050CC912-FF49-4A8B-B534-9544017446DD}.Release|Mono.Build.0 = Release|Mono + {050CC912-FF49-4A8B-B534-9544017446DD}.Release|x86.ActiveCfg = Release|x86 + {050CC912-FF49-4A8B-B534-9544017446DD}.Release|x86.Build.0 = Release|x86 + {F40FC0A2-1BC3-401C-BFC1-928EC4D4A9CE}.Ad-Hoc|Any CPU.ActiveCfg = Ad-Hoc|Any CPU + {F40FC0A2-1BC3-401C-BFC1-928EC4D4A9CE}.Ad-Hoc|Any CPU.Build.0 = Ad-Hoc|Any CPU + {F40FC0A2-1BC3-401C-BFC1-928EC4D4A9CE}.Ad-Hoc|iPhone.ActiveCfg = Ad-Hoc|iPhone + {F40FC0A2-1BC3-401C-BFC1-928EC4D4A9CE}.Ad-Hoc|iPhone.Build.0 = Ad-Hoc|iPhone + {F40FC0A2-1BC3-401C-BFC1-928EC4D4A9CE}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Ad-Hoc|iPhoneSimulator + {F40FC0A2-1BC3-401C-BFC1-928EC4D4A9CE}.Ad-Hoc|iPhoneSimulator.Build.0 = Ad-Hoc|iPhoneSimulator + {F40FC0A2-1BC3-401C-BFC1-928EC4D4A9CE}.Ad-Hoc|Mono.ActiveCfg = Ad-Hoc|Mono + {F40FC0A2-1BC3-401C-BFC1-928EC4D4A9CE}.Ad-Hoc|Mono.Build.0 = Ad-Hoc|Mono + {F40FC0A2-1BC3-401C-BFC1-928EC4D4A9CE}.Ad-Hoc|x86.ActiveCfg = Ad-Hoc|x86 + {F40FC0A2-1BC3-401C-BFC1-928EC4D4A9CE}.Ad-Hoc|x86.Build.0 = Ad-Hoc|x86 + {F40FC0A2-1BC3-401C-BFC1-928EC4D4A9CE}.AppStore|Any CPU.ActiveCfg = AppStore|Any CPU + {F40FC0A2-1BC3-401C-BFC1-928EC4D4A9CE}.AppStore|Any CPU.Build.0 = AppStore|Any CPU + {F40FC0A2-1BC3-401C-BFC1-928EC4D4A9CE}.AppStore|iPhone.ActiveCfg = AppStore|iPhone + {F40FC0A2-1BC3-401C-BFC1-928EC4D4A9CE}.AppStore|iPhone.Build.0 = AppStore|iPhone + {F40FC0A2-1BC3-401C-BFC1-928EC4D4A9CE}.AppStore|iPhoneSimulator.ActiveCfg = AppStore|iPhoneSimulator + {F40FC0A2-1BC3-401C-BFC1-928EC4D4A9CE}.AppStore|iPhoneSimulator.Build.0 = AppStore|iPhoneSimulator + {F40FC0A2-1BC3-401C-BFC1-928EC4D4A9CE}.AppStore|Mono.ActiveCfg = AppStore|Mono + {F40FC0A2-1BC3-401C-BFC1-928EC4D4A9CE}.AppStore|Mono.Build.0 = AppStore|Mono + {F40FC0A2-1BC3-401C-BFC1-928EC4D4A9CE}.AppStore|x86.ActiveCfg = AppStore|x86 + {F40FC0A2-1BC3-401C-BFC1-928EC4D4A9CE}.AppStore|x86.Build.0 = AppStore|x86 + {F40FC0A2-1BC3-401C-BFC1-928EC4D4A9CE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F40FC0A2-1BC3-401C-BFC1-928EC4D4A9CE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F40FC0A2-1BC3-401C-BFC1-928EC4D4A9CE}.Debug|iPhone.ActiveCfg = Debug|iPhone + {F40FC0A2-1BC3-401C-BFC1-928EC4D4A9CE}.Debug|iPhone.Build.0 = Debug|iPhone + {F40FC0A2-1BC3-401C-BFC1-928EC4D4A9CE}.Debug|iPhoneSimulator.ActiveCfg = Debug|iPhoneSimulator + {F40FC0A2-1BC3-401C-BFC1-928EC4D4A9CE}.Debug|iPhoneSimulator.Build.0 = Debug|iPhoneSimulator + {F40FC0A2-1BC3-401C-BFC1-928EC4D4A9CE}.Debug|Mono.ActiveCfg = Debug|Mono + {F40FC0A2-1BC3-401C-BFC1-928EC4D4A9CE}.Debug|Mono.Build.0 = Debug|Mono + {F40FC0A2-1BC3-401C-BFC1-928EC4D4A9CE}.Debug|x86.ActiveCfg = Debug|x86 + {F40FC0A2-1BC3-401C-BFC1-928EC4D4A9CE}.Debug|x86.Build.0 = Debug|x86 + {F40FC0A2-1BC3-401C-BFC1-928EC4D4A9CE}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F40FC0A2-1BC3-401C-BFC1-928EC4D4A9CE}.Release|Any CPU.Build.0 = Release|Any CPU + {F40FC0A2-1BC3-401C-BFC1-928EC4D4A9CE}.Release|iPhone.ActiveCfg = Release|iPhone + {F40FC0A2-1BC3-401C-BFC1-928EC4D4A9CE}.Release|iPhone.Build.0 = Release|iPhone + {F40FC0A2-1BC3-401C-BFC1-928EC4D4A9CE}.Release|iPhoneSimulator.ActiveCfg = Release|iPhoneSimulator + {F40FC0A2-1BC3-401C-BFC1-928EC4D4A9CE}.Release|iPhoneSimulator.Build.0 = Release|iPhoneSimulator + {F40FC0A2-1BC3-401C-BFC1-928EC4D4A9CE}.Release|Mono.ActiveCfg = Release|Mono + {F40FC0A2-1BC3-401C-BFC1-928EC4D4A9CE}.Release|Mono.Build.0 = Release|Mono + {F40FC0A2-1BC3-401C-BFC1-928EC4D4A9CE}.Release|x86.ActiveCfg = Release|x86 + {F40FC0A2-1BC3-401C-BFC1-928EC4D4A9CE}.Release|x86.Build.0 = Release|x86 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -2656,8 +2742,12 @@ Global {CBC4FF2F-92D4-420B-BE21-9FE0B930B04E} = {B39A8919-9F95-48FE-AD7B-76E08B509888} {E1582370-37B3-403C-917F-8209551B1634} = {C5A00AC3-B34C-4564-9BDD-2DA473EF4D8B} {E2999E4A-9086-401F-898C-AEB0AD38E676} = {9B9E3891-2366-4253-A952-D08BCEB71098} + {050CC912-FF49-4A8B-B534-9544017446DD} = {4ED8B739-6F4E-4CD4-B993-545E6B5CE637} + {F40FC0A2-1BC3-401C-BFC1-928EC4D4A9CE} = {9B9E3891-2366-4253-A952-D08BCEB71098} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {1E8CA5AA-707A-4C57-A682-D265A49E10C3} + {050CC912-FF49-4A8B-B534-9544017446DD} = {4ED8B739-6F4E-4CD4-B993-545E6B5CE637} + {F40FC0A2-1BC3-401C-BFC1-928EC4D4A9CE} = {9B9E3891-2366-4253-A952-D08BCEB71098} EndGlobalSection EndGlobal diff --git a/Avalonia.sln.DotSettings b/Avalonia.sln.DotSettings index 1fd6f8d092..d61208c358 100644 --- a/Avalonia.sln.DotSettings +++ b/Avalonia.sln.DotSettings @@ -1,4 +1,5 @@  + True ExplicitlyExcluded ExplicitlyExcluded ExplicitlyExcluded diff --git a/samples/ControlCatalog.NetCore/Program.cs b/samples/ControlCatalog.NetCore/Program.cs index 7c67a239e6..7e7fb7d2bf 100644 --- a/samples/ControlCatalog.NetCore/Program.cs +++ b/samples/ControlCatalog.NetCore/Program.cs @@ -1,6 +1,7 @@ using System; using System.Linq; using Avalonia; +using Avalonia.Controls; namespace ControlCatalog.NetCore { @@ -8,17 +9,22 @@ namespace ControlCatalog.NetCore { static void Main(string[] args) { - if (args.Contains("--fbdev")) AppBuilder.Configure().InitializeWithLinuxFramebuffer(tl => - { - tl.Content = new MainView(); - System.Threading.ThreadPool.QueueUserWorkItem(_ => ConsoleSilencer()); - }); + if (args.Contains("--fbdev")) + AppBuilder.Configure().InitializeWithLinuxFramebuffer(tl => + { + tl.Content = new MainView(); + System.Threading.ThreadPool.QueueUserWorkItem(_ => ConsoleSilencer()); + }); else - AppBuilder.Configure() - .UsePlatformDetect() - .Start(); + BuildAvaloniaApp().Start(); } + /// + /// This method is needed for IDE previewer infrastructure + /// + public static AppBuilder BuildAvaloniaApp() + => AppBuilder.Configure().UsePlatformDetect(); + static void ConsoleSilencer() { Console.CursorVisible = false; diff --git a/samples/Previewer/App.xaml b/samples/Previewer/App.xaml new file mode 100644 index 0000000000..6bae1955af --- /dev/null +++ b/samples/Previewer/App.xaml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/samples/Previewer/App.xaml.cs b/samples/Previewer/App.xaml.cs new file mode 100644 index 0000000000..fffa987a27 --- /dev/null +++ b/samples/Previewer/App.xaml.cs @@ -0,0 +1,14 @@ +using Avalonia; +using Avalonia.Markup.Xaml; + +namespace Previewer +{ + public class App : Application + { + public override void Initialize() + { + AvaloniaXamlLoader.Load(this); + } + } + +} \ No newline at end of file diff --git a/samples/Previewer/Center.cs b/samples/Previewer/Center.cs new file mode 100644 index 0000000000..7a28827d61 --- /dev/null +++ b/samples/Previewer/Center.cs @@ -0,0 +1,19 @@ +using Avalonia; +using Avalonia.Controls; + +namespace Previewer +{ + public class Center : Decorator + { + protected override Size ArrangeOverride(Size finalSize) + { + if (Child != null) + { + var desired = Child.DesiredSize; + Child.Arrange(new Rect((finalSize.Width - desired.Width) / 2, (finalSize.Height - desired.Height) / 2, + desired.Width, desired.Height)); + } + return finalSize; + } + } +} \ No newline at end of file diff --git a/samples/Previewer/MainWindow.xaml b/samples/Previewer/MainWindow.xaml new file mode 100644 index 0000000000..eb612303f2 --- /dev/null +++ b/samples/Previewer/MainWindow.xaml @@ -0,0 +1,12 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/samples/Previewer/MainWindow.xaml.cs b/samples/Previewer/MainWindow.xaml.cs new file mode 100644 index 0000000000..c72b1f7e55 --- /dev/null +++ b/samples/Previewer/MainWindow.xaml.cs @@ -0,0 +1,86 @@ +using System; +using System.Net; +using Avalonia; +using Avalonia.Controls; +using Avalonia.Controls.Remote; +using Avalonia.Markup.Xaml; +using Avalonia.Remote.Protocol; +using Avalonia.Remote.Protocol.Designer; +using Avalonia.Remote.Protocol.Viewport; +using Avalonia.Threading; + +namespace Previewer +{ + public class MainWindow : Window + { + private const string InitialXaml = @" + Hello world! + + "; + private IAvaloniaRemoteTransportConnection _connection; + private Control _errorsContainer; + private TextBlock _errors; + private RemoteWidget _remote; + + + public MainWindow() + { + this.InitializeComponent(); + var tb = this.FindControl("Xaml"); + tb.Text = InitialXaml; + var scroll = this.FindControl("Remote"); + var rem = new Center(); + scroll.Content = rem; + _errorsContainer = this.FindControl("ErrorsContainer"); + _errors = this.FindControl("Errors"); + tb.GetObservable(TextBox.TextProperty).Subscribe(text => _connection?.Send(new UpdateXamlMessage + { + Xaml = text + })); + new BsonTcpTransport().Listen(IPAddress.Loopback, 25000, t => + { + Dispatcher.UIThread.InvokeAsync(() => + { + if (_connection != null) + { + _connection.Dispose(); + _connection.OnMessage -= OnMessage; + } + _connection = t; + rem.Child = _remote = new RemoteWidget(t); + t.Send(new UpdateXamlMessage + { + Xaml = tb.Text + }); + + t.OnMessage += OnMessage; + }); + }); + Title = "Listening on 127.0.0.1:25000"; + } + + private void OnMessage(IAvaloniaRemoteTransportConnection transport, object obj) + { + Dispatcher.UIThread.InvokeAsync(() => + { + if (transport != _connection) + return; + if (obj is UpdateXamlResultMessage result) + { + _errorsContainer.IsVisible = result.Error != null; + _errors.Text = result.Error ?? ""; + } + if (obj is RequestViewportResizeMessage resize) + { + _remote.Width = Math.Min(4096, Math.Max(resize.Width, 1)); + _remote.Height = Math.Min(4096, Math.Max(resize.Height, 1)); + } + }); + } + + private void InitializeComponent() + { + AvaloniaXamlLoader.Load(this); + } + } +} diff --git a/samples/Previewer/Previewer.csproj b/samples/Previewer/Previewer.csproj new file mode 100644 index 0000000000..13e2418d67 --- /dev/null +++ b/samples/Previewer/Previewer.csproj @@ -0,0 +1,27 @@ + + + Exe + netcoreapp2.0 + + + + %(Filename) + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/samples/Previewer/Program.cs b/samples/Previewer/Program.cs new file mode 100644 index 0000000000..48363e27f2 --- /dev/null +++ b/samples/Previewer/Program.cs @@ -0,0 +1,13 @@ +using System; +using Avalonia; + +namespace Previewer +{ + class Program + { + static void Main(string[] args) + { + AppBuilder.Configure().UsePlatformDetect().Start(); + } + } +} \ No newline at end of file diff --git a/samples/RemoteTest/RemoteTest.csproj b/samples/RemoteTest/RemoteTest.csproj index 8682916503..2487c66e41 100644 --- a/samples/RemoteTest/RemoteTest.csproj +++ b/samples/RemoteTest/RemoteTest.csproj @@ -2,7 +2,7 @@ Exe - netcoreapp1.1 + netcoreapp2.0 diff --git a/src/Avalonia.Controls/Design.cs b/src/Avalonia.Controls/Design.cs index a0b0d5d0ca..ce52891749 100644 --- a/src/Avalonia.Controls/Design.cs +++ b/src/Avalonia.Controls/Design.cs @@ -64,7 +64,7 @@ namespace Avalonia.Controls return rv; } - internal static void ApplyDesignerProperties(Control target, Control source) + public static void ApplyDesignModeProperties(Control target, Control source) { if (source.IsSet(WidthProperty)) target.Width = source.GetValue(WidthProperty); diff --git a/src/Linux/Avalonia.LinuxFramebuffer/PlatformThreadingInterface.cs b/src/Avalonia.Controls/Platform/InternalPlatformThreadingInterface.cs similarity index 89% rename from src/Linux/Avalonia.LinuxFramebuffer/PlatformThreadingInterface.cs rename to src/Avalonia.Controls/Platform/InternalPlatformThreadingInterface.cs index 9231649754..eebde51555 100644 --- a/src/Linux/Avalonia.LinuxFramebuffer/PlatformThreadingInterface.cs +++ b/src/Avalonia.Controls/Platform/InternalPlatformThreadingInterface.cs @@ -1,19 +1,16 @@ using System; using System.Collections.Generic; using System.Runtime.InteropServices; -using System.Text; using System.Threading; using System.Threading.Tasks; using Avalonia.Platform; using Avalonia.Rendering; -namespace Avalonia.LinuxFramebuffer +namespace Avalonia.Controls.Platform { - class PlatformThreadingInterface : IPlatformThreadingInterface, IRenderLoop + public class InternalPlatformThreadingInterface : IPlatformThreadingInterface, IRenderLoop { - public static PlatformThreadingInterface Instance { get; } = new PlatformThreadingInterface(); - - public PlatformThreadingInterface() + public InternalPlatformThreadingInterface() { TlsCurrentThreadIsLoopThread = true; StartTimer(new TimeSpan(0, 0, 0, 0, 66), () => Tick?.Invoke(this, new EventArgs())); @@ -36,7 +33,7 @@ namespace Avalonia.LinuxFramebuffer while (true) { Action item; - lock(_actions) + lock (_actions) if (_actions.Count == 0) break; else @@ -66,6 +63,7 @@ namespace Avalonia.LinuxFramebuffer _timer = timer; _handle = GCHandle.Alloc(_timer); } + public void Dispose() { _handle.Free(); @@ -109,4 +107,4 @@ namespace Avalonia.LinuxFramebuffer public event EventHandler Tick; } -} +} \ No newline at end of file diff --git a/src/Avalonia.Controls/Remote/RemoteWidget.cs b/src/Avalonia.Controls/Remote/RemoteWidget.cs index f4bcb37d48..c05aeaf970 100644 --- a/src/Avalonia.Controls/Remote/RemoteWidget.cs +++ b/src/Avalonia.Controls/Remote/RemoteWidget.cs @@ -18,7 +18,7 @@ namespace Avalonia.Controls.Remote public RemoteWidget(IAvaloniaRemoteTransportConnection connection) { _connection = connection; - _connection.OnMessage += msg => Dispatcher.UIThread.InvokeAsync(() => OnMessage(msg)); + _connection.OnMessage += (t, msg) => Dispatcher.UIThread.InvokeAsync(() => OnMessage(msg)); _connection.Send(new ClientSupportedPixelFormatsMessage { Formats = new[] diff --git a/src/Avalonia.Controls/Remote/Server/RemoteServerTopLevelImpl.cs b/src/Avalonia.Controls/Remote/Server/RemoteServerTopLevelImpl.cs index be97f7caaa..c2e6a200f9 100644 --- a/src/Avalonia.Controls/Remote/Server/RemoteServerTopLevelImpl.cs +++ b/src/Avalonia.Controls/Remote/Server/RemoteServerTopLevelImpl.cs @@ -36,7 +36,7 @@ namespace Avalonia.Controls.Remote.Server _transport.OnMessage += OnMessage; } - private void OnMessage(object obj) + protected virtual void OnMessage(IAvaloniaRemoteTransportConnection transport, object obj) { lock (_lock) { @@ -88,6 +88,12 @@ namespace Avalonia.Controls.Remote.Server } } + protected void SetDpi(Vector dpi) + { + _dpi = dpi; + RenderIfNeeded(); + } + protected virtual Size Measure(Size constaint) { var l = (ILayoutable) InputRoot; @@ -131,7 +137,7 @@ namespace Avalonia.Controls.Remote.Server return _framebuffer; } - void RenderIfNeeded() + protected void RenderIfNeeded() { lock (_lock) { diff --git a/src/Avalonia.DesignerSupport/DesignWindowLoader.cs b/src/Avalonia.DesignerSupport/DesignWindowLoader.cs new file mode 100644 index 0000000000..9ad2a216b4 --- /dev/null +++ b/src/Avalonia.DesignerSupport/DesignWindowLoader.cs @@ -0,0 +1,76 @@ +using System; +using System.IO; +using System.Linq; +using System.Text; +using Avalonia.Controls; +using Avalonia.Controls.Platform; +using Avalonia.Markup.Xaml; +using Avalonia.Styling; + +namespace Avalonia.DesignerSupport +{ + public class DesignWindowLoader + { + public static Window LoadDesignerWindow(string xaml, string assemblyPath) + { + Window window; + Control control; + using (PlatformManager.DesignerMode()) + { + var loader = new AvaloniaXamlLoader(); + var stream = new MemoryStream(Encoding.UTF8.GetBytes(xaml)); + + + + Uri baseUri = null; + if (assemblyPath != null) + { + //Fabricate fake Uri + baseUri = + new Uri("resm:Fake.xaml?assembly=" + Path.GetFileNameWithoutExtension(assemblyPath)); + } + + var loaded = loader.Load(stream, null, baseUri); + var styles = loaded as Styles; + if (styles != null) + { + var substitute = Design.GetPreviewWith(styles) ?? + styles.Select(Design.GetPreviewWith).FirstOrDefault(s => s != null); + if (substitute != null) + { + substitute.Styles.AddRange(styles); + control = substitute; + } + else + control = new StackPanel + { + Children = + { + new TextBlock {Text = "Styles can't be previewed without Design.PreviewWith. Add"}, + new TextBlock {Text = ""}, + new TextBlock {Text = " "}, + new TextBlock {Text = ""}, + new TextBlock {Text = "before setters in your first Style"} + } + }; + } + if (loaded is Application) + control = new TextBlock {Text = "Application can't be previewed in design view"}; + else + control = (Control) loaded; + + window = control as Window; + if (window == null) + { + window = new Window() {Content = (Control)control}; + } + + if (!window.IsSet(Window.SizeToContentProperty)) + window.SizeToContent = SizeToContent.WidthAndHeight; + } + window.Show(); + Design.ApplyDesignModeProperties(window, control); + return window; + } + } +} \ No newline at end of file diff --git a/src/Avalonia.DesignerSupport/DesignerAssist.cs b/src/Avalonia.DesignerSupport/DesignerAssist.cs index 2f5fc79147..65c4c14d83 100644 --- a/src/Avalonia.DesignerSupport/DesignerAssist.cs +++ b/src/Avalonia.DesignerSupport/DesignerAssist.cs @@ -86,67 +86,11 @@ namespace Avalonia.DesignerSupport private static void UpdateXaml2(Dictionary dic) { var xamlInfo = new DesignerApiXamlFileInfo(dic); - Window window; - Control control; - - using (PlatformManager.DesignerMode()) - { - var loader = new AvaloniaXamlLoader(); - var stream = new MemoryStream(Encoding.UTF8.GetBytes(xamlInfo.Xaml)); - - - - Uri baseUri = null; - if (xamlInfo.AssemblyPath != null) - { - //Fabricate fake Uri - baseUri = - new Uri("resm:Fake.xaml?assembly=" + Path.GetFileNameWithoutExtension(xamlInfo.AssemblyPath)); - } - - var loaded = loader.Load(stream, null, baseUri); - var styles = loaded as Styles; - if (styles != null) - { - var substitute = Design.GetPreviewWith(styles) ?? - styles.Select(Design.GetPreviewWith).FirstOrDefault(s => s != null); - if (substitute != null) - { - substitute.Styles.AddRange(styles); - control = substitute; - } - else - control = new StackPanel - { - Children = - { - new TextBlock {Text = "Styles can't be previewed without Design.PreviewWith. Add"}, - new TextBlock {Text = ""}, - new TextBlock {Text = " "}, - new TextBlock {Text = ""}, - new TextBlock {Text = "before setters in your first Style"} - } - }; - } - if (loaded is Application) - control = new TextBlock {Text = "Application can't be previewed in design view"}; - else - control = (Control) loaded; - - window = control as Window; - if (window == null) - { - window = new Window() {Content = (Control)control}; - } - - if (!window.IsSet(Window.SizeToContentProperty)) - window.SizeToContent = SizeToContent.WidthAndHeight; - } + Window window = DesignWindowLoader.LoadDesignerWindow(xamlInfo.Xaml, xamlInfo.AssemblyPath); s_currentWindow?.Close(); s_currentWindow = window; - window.Show(); - Design.ApplyDesignerProperties(window, control); + // ReSharper disable once PossibleNullReferenceException // Always not null at this point Api.OnWindowCreated?.Invoke(window.PlatformImpl.Handle.Handle); diff --git a/src/Avalonia.DotNetFrameworkRuntime/Avalonia.DotNetFrameworkRuntime.csproj b/src/Avalonia.DotNetFrameworkRuntime/Avalonia.DotNetFrameworkRuntime.csproj index 181f5e3a1e..32171e8495 100644 --- a/src/Avalonia.DotNetFrameworkRuntime/Avalonia.DotNetFrameworkRuntime.csproj +++ b/src/Avalonia.DotNetFrameworkRuntime/Avalonia.DotNetFrameworkRuntime.csproj @@ -10,7 +10,7 @@ Properties\SharedAssemblyInfo.cs - + @@ -18,4 +18,4 @@ - \ No newline at end of file + diff --git a/src/Avalonia.Remote.Protocol/BsonStreamTransport.cs b/src/Avalonia.Remote.Protocol/BsonStreamTransport.cs index 8c983c385d..82765f98f6 100644 --- a/src/Avalonia.Remote.Protocol/BsonStreamTransport.cs +++ b/src/Avalonia.Remote.Protocol/BsonStreamTransport.cs @@ -8,7 +8,7 @@ using Newtonsoft.Json.Bson; namespace Avalonia.Remote.Protocol { - public class BsonStreamTransportConnection : IAvaloniaRemoteTransportConnection + class BsonStreamTransportConnection : IAvaloniaRemoteTransportConnection { private readonly IMessageTypeResolver _resolver; private readonly Stream _inputStream; @@ -79,17 +79,8 @@ namespace Avalonia.Remote.Protocol var guid = new Guid(guidBytes); var buffer = new byte[length]; await ReadExact(buffer).ConfigureAwait(false); - if (Environment.GetEnvironmentVariable("WTF") == "WTF") - { - - using (var f = System.IO.File.Create("/tmp/wtf2.bin")) - { - f.Write(infoBlock, 0, infoBlock.Length); - f.Write(buffer, 0, buffer.Length); - } - } var message = Serializer.Deserialize(new BsonReader(new MemoryStream(buffer)), _resolver.GetByGuid(guid)); - OnMessage?.Invoke(message); + OnMessage?.Invoke(this, message); } } catch (Exception e) @@ -150,11 +141,11 @@ namespace Avalonia.Remote.Protocol var cancel = e as OperationCanceledException; if (cancel?.CancellationToken == _cancel) return; - OnException?.Invoke(e); + OnException?.Invoke(this, e); } - public event Action OnMessage; - public event Action OnException; + public event Action OnMessage; + public event Action OnException; } } \ No newline at end of file diff --git a/src/Avalonia.Remote.Protocol/DesignMessages.cs b/src/Avalonia.Remote.Protocol/DesignMessages.cs new file mode 100644 index 0000000000..d6e898f320 --- /dev/null +++ b/src/Avalonia.Remote.Protocol/DesignMessages.cs @@ -0,0 +1,17 @@ +namespace Avalonia.Remote.Protocol.Designer +{ + [AvaloniaRemoteMessageGuid("9AEC9A2E-6315-4066-B4BA-E9A9EFD0F8CC")] + public class UpdateXamlMessage + { + public string Xaml { get; set; } + public string AssemblyPath { get; set; } + } + + [AvaloniaRemoteMessageGuid("B7A70093-0C5D-47FD-9261-22086D43A2E2")] + public class UpdateXamlResultMessage + { + public string Error { get; set; } + } + + +} \ No newline at end of file diff --git a/src/Avalonia.Remote.Protocol/EventStash.cs b/src/Avalonia.Remote.Protocol/EventStash.cs index 06840c8253..1fe561d473 100644 --- a/src/Avalonia.Remote.Protocol/EventStash.cs +++ b/src/Avalonia.Remote.Protocol/EventStash.cs @@ -3,18 +3,20 @@ using System.Collections.Generic; namespace Avalonia.Remote.Protocol { - public class EventStash + class EventStash { + private readonly IAvaloniaRemoteTransportConnection _transport; private readonly Action _exceptionHandler; private List _stash; - private Action _delegate; + private Action _delegate; - public EventStash(Action exceptionHandler = null) + public EventStash(IAvaloniaRemoteTransportConnection transport, Action exceptionHandler = null) { + _transport = transport; _exceptionHandler = exceptionHandler; } - public void Add(Action handler) + public void Add(Action handler) { List stash; lock (this) @@ -37,25 +39,25 @@ namespace Avalonia.Remote.Protocol if (_exceptionHandler != null) try { - _delegate?.Invoke(m); + _delegate?.Invoke(_transport, m); } catch (Exception e) { _exceptionHandler(e); } else - _delegate?.Invoke(m); + _delegate?.Invoke(_transport, m); } } - public void Remove(Action handler) + public void Remove(Action handler) { lock (this) _delegate -= handler; } - public void Fire(T ev) + public void Fire(IAvaloniaRemoteTransportConnection transport, T ev) { if (_delegate == null) { @@ -66,7 +68,7 @@ namespace Avalonia.Remote.Protocol } } else - _delegate?.Invoke(ev); + _delegate?.Invoke(_transport, ev); } } } \ No newline at end of file diff --git a/src/Avalonia.Remote.Protocol/ITransport.cs b/src/Avalonia.Remote.Protocol/ITransport.cs index d4e5427cb4..afc7d86845 100644 --- a/src/Avalonia.Remote.Protocol/ITransport.cs +++ b/src/Avalonia.Remote.Protocol/ITransport.cs @@ -9,7 +9,7 @@ namespace Avalonia.Remote.Protocol public interface IAvaloniaRemoteTransportConnection : IDisposable { Task Send(object data); - event Action OnMessage; - event Action OnException; + event Action OnMessage; + event Action OnException; } } diff --git a/src/Avalonia.Remote.Protocol/TcpTransportBase.cs b/src/Avalonia.Remote.Protocol/TcpTransportBase.cs index 4278badaae..af62f2da59 100644 --- a/src/Avalonia.Remote.Protocol/TcpTransportBase.cs +++ b/src/Avalonia.Remote.Protocol/TcpTransportBase.cs @@ -50,17 +50,11 @@ namespace Avalonia.Remote.Protocol AcceptNew(); Task.Run(async () => { - try - { - var tcs = new TaskCompletionSource(); - var t = CreateTransport(_resolver, cl.GetStream(), () => tcs.TrySetResult(0)); - cb(t); - await tcs.Task; - } - finally - { - cl.Dispose(); - } + var tcs = new TaskCompletionSource(); + var t = CreateTransport(_resolver, cl.GetStream(), () => tcs.TrySetResult(0)); + cb(t); + await tcs.Task; + }); } diff --git a/src/Avalonia.Remote.Protocol/TransportConnectionWrapper.cs b/src/Avalonia.Remote.Protocol/TransportConnectionWrapper.cs index b01b6d7303..1e821b7c24 100644 --- a/src/Avalonia.Remote.Protocol/TransportConnectionWrapper.cs +++ b/src/Avalonia.Remote.Protocol/TransportConnectionWrapper.cs @@ -8,7 +8,7 @@ namespace Avalonia.Remote.Protocol { private readonly IAvaloniaRemoteTransportConnection _conn; private EventStash _onMessage; - private EventStash _onException = new EventStash(); + private EventStash _onException; private Queue _sendQueue = new Queue(); private object _lock =new object(); @@ -17,7 +17,8 @@ namespace Avalonia.Remote.Protocol public TransportConnectionWrapper(IAvaloniaRemoteTransportConnection conn) { _conn = conn; - _onMessage = new EventStash(_onException.Fire); + _onException = new EventStash(this); + _onMessage = new EventStash(this, e => _onException.Fire(this, e)); _conn.OnException +=_onException.Fire; conn.OnMessage += _onMessage.Fire; @@ -58,8 +59,7 @@ namespace Avalonia.Remote.Protocol { wi.Tcs.TrySetException(e); } - } - + } } public Task Send(object data) @@ -86,13 +86,13 @@ namespace Avalonia.Remote.Protocol return tcs.Task; } - public event Action OnMessage + public event Action OnMessage { add => _onMessage.Add(value); remove => _onMessage.Remove(value); } - public event Action OnException + public event Action OnException { add => _onException.Add(value); remove => _onException.Remove(value); diff --git a/src/Avalonia.Remote.Protocol/ViewportMessages.cs b/src/Avalonia.Remote.Protocol/ViewportMessages.cs index 82a7688f37..f71e893d26 100644 --- a/src/Avalonia.Remote.Protocol/ViewportMessages.cs +++ b/src/Avalonia.Remote.Protocol/ViewportMessages.cs @@ -30,6 +30,13 @@ namespace Avalonia.Remote.Protocol.Viewport public double DpiY { get; set; } } + [AvaloniaRemoteMessageGuid("9B47B3D8-61DF-4C38-ACD4-8C1BB72554AC")] + public class RequestViewportResizeMessage + { + public double Width { get; set; } + public double Height { get; set; } + } + [AvaloniaRemoteMessageGuid("63481025-7016-43FE-BADC-F2FD0F88609E")] public class ClientSupportedPixelFormatsMessage { diff --git a/src/Linux/Avalonia.LinuxFramebuffer/Avalonia.LinuxFramebuffer.csproj b/src/Linux/Avalonia.LinuxFramebuffer/Avalonia.LinuxFramebuffer.csproj index c38cb0f114..466b47f7a0 100644 --- a/src/Linux/Avalonia.LinuxFramebuffer/Avalonia.LinuxFramebuffer.csproj +++ b/src/Linux/Avalonia.LinuxFramebuffer/Avalonia.LinuxFramebuffer.csproj @@ -1,14 +1,14 @@  - - netstandard2.0 - true - - - - - - - - - + + netstandard2.0 + true + + + + + + + + + \ No newline at end of file diff --git a/src/Linux/Avalonia.LinuxFramebuffer/LinuxFramebufferPlatform.cs b/src/Linux/Avalonia.LinuxFramebuffer/LinuxFramebufferPlatform.cs index bc1684cc15..e733beae27 100644 --- a/src/Linux/Avalonia.LinuxFramebuffer/LinuxFramebufferPlatform.cs +++ b/src/Linux/Avalonia.LinuxFramebuffer/LinuxFramebufferPlatform.cs @@ -12,6 +12,7 @@ using Avalonia.Platform; using Avalonia.Rendering; using Avalonia.Threading; using Avalonia; +using Avalonia.Controls.Platform; namespace Avalonia.LinuxFramebuffer { @@ -22,6 +23,7 @@ namespace Avalonia.LinuxFramebuffer public static MouseDevice MouseDevice = new MouseDevice(); private static readonly Stopwatch St = Stopwatch.StartNew(); internal static uint Timestamp => (uint)St.ElapsedTicks; + public static InternalPlatformThreadingInterface Threading; public static FramebufferToplevelImpl TopLevel; LinuxFramebufferPlatform(string fbdev = null) { @@ -31,12 +33,13 @@ namespace Avalonia.LinuxFramebuffer void Initialize() { + Threading = new InternalPlatformThreadingInterface(); AvaloniaLocator.CurrentMutable .Bind().ToTransient() .Bind().ToConstant(KeyboardDevice) .Bind().ToSingleton() - .Bind().ToConstant(PlatformThreadingInterface.Instance) - .Bind().ToConstant(PlatformThreadingInterface.Instance); + .Bind().ToConstant(Threading) + .Bind().ToConstant(Threading); } internal static TopLevel Initialize(T builder, string fbdev = null) where T : AppBuilderBase, new() diff --git a/src/Linux/Avalonia.LinuxFramebuffer/Mice.cs b/src/Linux/Avalonia.LinuxFramebuffer/Mice.cs index d1cf9eefb6..7e85796c0c 100644 --- a/src/Linux/Avalonia.LinuxFramebuffer/Mice.cs +++ b/src/Linux/Avalonia.LinuxFramebuffer/Mice.cs @@ -55,7 +55,7 @@ namespace Avalonia.LinuxFramebuffer if (!ev.HasValue) break; - PlatformThreadingInterface.Instance.Send(() => ProcessEvent(dev, ev.Value)); + LinuxFramebufferPlatform.Threading.Send(() => ProcessEvent(dev, ev.Value)); } } } diff --git a/src/tools/Avalonia.Designer.HostApp/Avalonia.Designer.HostApp.csproj b/src/tools/Avalonia.Designer.HostApp/Avalonia.Designer.HostApp.csproj new file mode 100644 index 0000000000..f0f3b12cc5 --- /dev/null +++ b/src/tools/Avalonia.Designer.HostApp/Avalonia.Designer.HostApp.csproj @@ -0,0 +1,25 @@ + + + Exe + netcoreapp2.0 + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/tools/Avalonia.Designer.HostApp/DetachableTransportConnection.cs b/src/tools/Avalonia.Designer.HostApp/DetachableTransportConnection.cs new file mode 100644 index 0000000000..9cd87a2c59 --- /dev/null +++ b/src/tools/Avalonia.Designer.HostApp/DetachableTransportConnection.cs @@ -0,0 +1,35 @@ +using System; +using System.Threading.Tasks; +using Avalonia.Remote.Protocol; + +namespace Avalonia.Designer.HostApp +{ + class DetachableTransportConnection : IAvaloniaRemoteTransportConnection + { + private IAvaloniaRemoteTransportConnection _inner; + + public DetachableTransportConnection(IAvaloniaRemoteTransportConnection inner) + { + _inner = inner; + _inner.OnMessage += FireOnMessage; + } + + public void Dispose() + { + if (_inner != null) + _inner.OnMessage -= FireOnMessage; + _inner = null; + } + + public void FireOnMessage(IAvaloniaRemoteTransportConnection transport, object obj) => OnMessage?.Invoke(transport, obj); + + public Task Send(object data) + { + return _inner?.Send(data); + } + + public event Action OnMessage; + + public event Action OnException; + } +} \ No newline at end of file diff --git a/src/tools/Avalonia.Designer.HostApp/PreviewerWindowImpl.cs b/src/tools/Avalonia.Designer.HostApp/PreviewerWindowImpl.cs new file mode 100644 index 0000000000..5ffaa6459a --- /dev/null +++ b/src/tools/Avalonia.Designer.HostApp/PreviewerWindowImpl.cs @@ -0,0 +1,91 @@ +using System; +using System.Reactive.Disposables; +using Avalonia.Controls; +using Avalonia.Controls.Remote.Server; +using Avalonia.Platform; +using Avalonia.Remote.Protocol; +using Avalonia.Remote.Protocol.Viewport; +using Avalonia.Threading; + +namespace Avalonia.Designer.HostApp +{ + public class PreviewerWindowImpl : RemoteServerTopLevelImpl, IWindowImpl, IEmbeddableWindowImpl + { + private readonly IAvaloniaRemoteTransportConnection _transport; + + public PreviewerWindowImpl(IAvaloniaRemoteTransportConnection transport) : base(transport) + { + _transport = transport; + ClientSize = new Size(1, 1); + } + + public void Show() + { + } + + public void Hide() + { + } + + public void BeginMoveDrag() + { + } + + public void BeginResizeDrag(WindowEdge edge) + { + } + + public Point Position { get; set; } + public Action PositionChanged { get; set; } + public Action Deactivated { get; set; } + public Action Activated { get; set; } + public IPlatformHandle Handle { get; } + public WindowState WindowState { get; set; } + public Size MaxClientSize { get; } = new Size(4096, 4096); + public event Action LostFocus; + + protected override void OnMessage(IAvaloniaRemoteTransportConnection transport, object obj) + { + // In previewer mode we completely ignore client-side viewport size + if (obj is ClientViewportAllocatedMessage alloc) + { + Dispatcher.UIThread.InvokeAsync(() => SetDpi(new Vector(alloc.DpiX, alloc.DpiY))); + return; + } + base.OnMessage(transport, obj); + } + + public void Resize(Size clientSize) + { + _transport.Send(new RequestViewportResizeMessage + { + Width = clientSize.Width, + Height = clientSize.Height + }); + ClientSize = clientSize; + RenderIfNeeded(); + } + + public void Activate() + { + } + + public void SetTitle(string title) + { + } + + public IDisposable ShowDialog() + { + return Disposable.Empty; + } + + public void SetSystemDecorations(bool enabled) + { + } + + public void SetIcon(IWindowIconImpl icon) + { + } + + } +} \ No newline at end of file diff --git a/src/tools/Avalonia.Designer.HostApp/PreviewerWindowingPlatform.cs b/src/tools/Avalonia.Designer.HostApp/PreviewerWindowingPlatform.cs new file mode 100644 index 0000000000..b33f871139 --- /dev/null +++ b/src/tools/Avalonia.Designer.HostApp/PreviewerWindowingPlatform.cs @@ -0,0 +1,66 @@ +using System; +using System.Collections.Generic; +using Avalonia.Controls.Platform; +using Avalonia.Input; +using Avalonia.Input.Platform; +using Avalonia.Platform; +using Avalonia.Remote.Protocol; +using Avalonia.Rendering; + +namespace Avalonia.Designer.HostApp +{ + class PreviewerWindowingPlatform : IWindowingPlatform, IPlatformSettings + { + static readonly IKeyboardDevice Keyboard = new KeyboardDevice(); + private static IAvaloniaRemoteTransportConnection s_transport; + private static DetachableTransportConnection s_lastWindowTransport; + private static PreviewerWindowImpl s_lastWindow; + public static List PreFlightMessages = new List(); + + public IWindowImpl CreateWindow() => new WindowStub(); + + public IEmbeddableWindowImpl CreateEmbeddableWindow() + { + if (s_lastWindow != null) + { + s_lastWindowTransport.Dispose(); + try + { + s_lastWindow.Dispose(); + } + catch + { + //Ignore + } + } + s_lastWindow = + new PreviewerWindowImpl(s_lastWindowTransport = new DetachableTransportConnection(s_transport)); + foreach (var pf in PreFlightMessages) + s_lastWindowTransport.FireOnMessage(s_lastWindowTransport, pf); + return s_lastWindow; + } + + public IPopupImpl CreatePopup() => new WindowStub(); + + public static void Initialize(IAvaloniaRemoteTransportConnection transport) + { + s_transport = transport; + var instance = new PreviewerWindowingPlatform(); + var threading = new InternalPlatformThreadingInterface(); + AvaloniaLocator.CurrentMutable + .Bind().ToSingleton() + .Bind().ToSingleton() + .Bind().ToConstant(Keyboard) + .Bind().ToConstant(instance) + .Bind().ToConstant(threading) + .Bind().ToConstant(threading) + .Bind().ToSingleton() + .Bind().ToConstant(instance) + .Bind().ToSingleton(); + + } + + public Size DoubleClickSize { get; } = new Size(2, 2); + public TimeSpan DoubleClickTime { get; } = TimeSpan.FromMilliseconds(500); + } +} \ No newline at end of file diff --git a/src/tools/Avalonia.Designer.HostApp/Program.cs b/src/tools/Avalonia.Designer.HostApp/Program.cs new file mode 100644 index 0000000000..88dadf479e --- /dev/null +++ b/src/tools/Avalonia.Designer.HostApp/Program.cs @@ -0,0 +1,173 @@ +using System; +using System.Collections.Generic; +using System.Net; +using System.Reflection; +using Avalonia.Controls; +using Avalonia.Controls.Shapes; +using Avalonia.DesignerSupport; +using Avalonia.Input; +using Avalonia.Remote.Protocol; +using Avalonia.Remote.Protocol.Designer; +using Avalonia.Remote.Protocol.Viewport; +using Avalonia.Threading; + +namespace Avalonia.Designer.HostApp +{ + class Program + { + + private static ClientSupportedPixelFormatsMessage s_supportedPixelFormats; + private static ClientViewportAllocatedMessage s_viewportAllocatedMessage; + private static IAvaloniaRemoteTransportConnection s_transport; + class CommandLineArgs + { + public string AppPath { get; set; } + public Uri Transport { get; set; } + } + + static Exception Die(string error) + { + if (error != null) + { + Console.Error.WriteLine(error); + Console.Error.Flush(); + } + Environment.Exit(1); + return new Exception("APPEXIT"); + } + + static Exception PrintUsage() + { + Console.Error.WriteLine("Usage: --transport transport_spec app"); + Console.Error.WriteLine(); + Console.Error.WriteLine("Example: --transport tcp-bson://127.0.0.1:30243/ MyApp.exe"); + Console.Error.Flush(); + return Die(null); + } + + static CommandLineArgs ParseCommandLineArgs(string[] args) + { + var rv = new CommandLineArgs(); + Action next = null; + try + { + foreach (var arg in args) + { + if (next != null) + { + next(arg); + next = null; + } + else if (arg == "--transport") + next = a => rv.Transport = new Uri(a, UriKind.Absolute); + else if (rv.AppPath == null) + rv.AppPath = arg; + else + PrintUsage(); + + } + if (rv.AppPath == null || rv.Transport == null) + PrintUsage(); + } + catch + { + PrintUsage(); + } + return rv; + } + + static IAvaloniaRemoteTransportConnection CreateTransport(Uri transport) + { + if (transport.Scheme == "tcp-bson") + { + return new BsonTcpTransport().Connect(IPAddress.Parse(transport.Host), transport.Port).Result; + } + PrintUsage(); + return null; + } + + interface IAppInitializer + { + Application GetConfiguredApp(IAvaloniaRemoteTransportConnection transport, object obj); + } + + class AppInitializer : IAppInitializer where T : AppBuilderBase, new() + { + public Application GetConfiguredApp(IAvaloniaRemoteTransportConnection transport, object obj) + { + var builder = (AppBuilderBase) obj; + builder.UseWindowingSubsystem(() => PreviewerWindowingPlatform.Initialize(transport)); + builder.SetupWithoutStarting(); + return builder.Instance; + } + } + + private const string BuilderMethodName = "BuildAvaloniaApp"; + + class NeverClose : ICloseable + { + public event EventHandler Closed; + } + + static void Main(string[] cmdline) + { + var args = ParseCommandLineArgs(cmdline); + var transport = CreateTransport(args.Transport); + var asm = Assembly.LoadFile(System.IO.Path.GetFullPath(args.AppPath)); + var entryPoint = asm.EntryPoint; + if (entryPoint == null) + throw Die($"Assembly {args.AppPath} doesn't have an entry point"); + var builderMethod = entryPoint.DeclaringType.GetMethod(BuilderMethodName, + BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic); + if (builderMethod == null) + throw Die($"{entryPoint.DeclaringType.FullName} doesn't have a method named {BuilderMethodName}"); + + var appBuilder = builderMethod.Invoke(null, null); + var initializer =(IAppInitializer)Activator.CreateInstance(typeof(AppInitializer<>).MakeGenericType(appBuilder.GetType())); + var app = initializer.GetConfiguredApp(transport, appBuilder); + s_transport = transport; + transport.OnMessage += OnTransportMessage; + transport.OnException += (t, e) => Die(e.ToString()); + app.Run(new NeverClose()); + } + + + private static void RebuildPreFlight() + { + PreviewerWindowingPlatform.PreFlightMessages = new List + { + s_supportedPixelFormats, + s_viewportAllocatedMessage + }; + } + + private static void OnTransportMessage(IAvaloniaRemoteTransportConnection transport, object obj) => Dispatcher.UIThread.InvokeAsync(() => + { + if (obj is ClientSupportedPixelFormatsMessage formats) + { + s_supportedPixelFormats = formats; + RebuildPreFlight(); + } + if (obj is ClientViewportAllocatedMessage viewport) + { + s_viewportAllocatedMessage = viewport; + RebuildPreFlight(); + } + if (obj is UpdateXamlMessage xaml) + { + try + { + DesignWindowLoader.LoadDesignerWindow(xaml.Xaml, xaml.AssemblyPath); + s_transport.Send(new UpdateXamlResultMessage()); + } + catch (Exception e) + { + s_transport.Send(new UpdateXamlResultMessage + { + Error = e.ToString() + }); + } + } + }); + } +} \ No newline at end of file diff --git a/src/tools/Avalonia.Designer.HostApp/Stubs.cs b/src/tools/Avalonia.Designer.HostApp/Stubs.cs new file mode 100644 index 0000000000..a4160e7da4 --- /dev/null +++ b/src/tools/Avalonia.Designer.HostApp/Stubs.cs @@ -0,0 +1,136 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Reactive.Disposables; +using System.Threading.Tasks; +using Avalonia.Controls; +using Avalonia.Controls.Platform; +using Avalonia.Input; +using Avalonia.Input.Platform; +using Avalonia.Input.Raw; +using Avalonia.Platform; +using Avalonia.Rendering; + +namespace Avalonia.Designer.HostApp +{ + /// + /// Popups are no-op + /// + + class WindowStub : IPopupImpl, IWindowImpl + { + public Action Deactivated { get; set; } + public Action Activated { get; set; } + public IPlatformHandle Handle { get; } + public Size MaxClientSize { get; } + public Size ClientSize { get; } + public double Scaling { get; } + public IEnumerable Surfaces { get; } + public Action Input { get; set; } + public Action Paint { get; set; } + public Action Resized { get; set; } + public Action ScalingChanged { get; set; } + public Action Closed { get; set; } + public IMouseDevice MouseDevice { get; } = new MouseDevice(); + public Point Position { get; set; } + public Action PositionChanged { get; set; } + public WindowState WindowState { get; set; } + public IRenderer CreateRenderer(IRenderRoot root) => new ImmediateRenderer(root); + public void Dispose() + { + } + public void Invalidate(Rect rect) + { + } + + public void SetInputRoot(IInputRoot inputRoot) + { + } + + public Point PointToClient(Point point) => point; + + public Point PointToScreen(Point point) => point; + + public void SetCursor(IPlatformHandle cursor) + { + } + + public void Show() + { + } + + public void Hide() + { + } + + public void BeginMoveDrag() + { + } + + public void BeginResizeDrag(WindowEdge edge) + { + } + + public void Activate() + { + } + + public void Resize(Size clientSize) + { + } + + public void SetTitle(string title) + { + } + + public IDisposable ShowDialog() => Disposable.Empty; + + public void SetSystemDecorations(bool enabled) + { + } + + public void SetIcon(IWindowIconImpl icon) + { + } + } + + class ClipboardStub : IClipboard + { + public Task GetTextAsync() => Task.FromResult(""); + + public Task SetTextAsync(string text) => Task.CompletedTask; + + public Task ClearAsync() => Task.CompletedTask; + } + + class CursorFactoryStub : IStandardCursorFactory + { + public IPlatformHandle GetCursor(StandardCursorType cursorType) => new PlatformHandle(IntPtr.Zero, "STUB"); + } + + class IconLoaderStub : IPlatformIconLoader + { + class IconStub : IWindowIconImpl + { + public void Save(Stream outputStream) + { + + } + } + + public IWindowIconImpl LoadIcon(string fileName) => new IconStub(); + + public IWindowIconImpl LoadIcon(Stream stream) => new IconStub(); + + public IWindowIconImpl LoadIcon(IBitmapImpl bitmap) => new IconStub(); + } + + class SystemDialogsStub : ISystemDialogImpl + { + public Task ShowFileDialogAsync(FileDialog dialog, IWindowImpl parent) => + Task.FromResult((string[]) null); + + public Task ShowFolderDialogAsync(OpenFolderDialog dialog, IWindowImpl parent) => + Task.FromResult((string) null); + } +} \ No newline at end of file From 7c1245829d9361002cf5d9ba1e277f2964e04c81 Mon Sep 17 00:00:00 2001 From: Nikita Tsukanov Date: Tue, 26 Sep 2017 21:08:42 +0300 Subject: [PATCH 06/69] [GTK3] Timers should have lower priority than Signal() --- src/Gtk/Avalonia.Gtk3/Interop/GlibTimeout.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Gtk/Avalonia.Gtk3/Interop/GlibTimeout.cs b/src/Gtk/Avalonia.Gtk3/Interop/GlibTimeout.cs index 1936d40086..07ca4a9539 100644 --- a/src/Gtk/Avalonia.Gtk3/Interop/GlibTimeout.cs +++ b/src/Gtk/Avalonia.Gtk3/Interop/GlibTimeout.cs @@ -55,7 +55,7 @@ namespace Avalonia.Gtk3.Interop public static IDisposable StarTimer(uint interval, Action tick) { var timer = new Timer (); - GlibTimeout.Add(interval, + GlibTimeout.Add(101, interval, () => { if (timer.Stopped) From d7e74229990205b1865586f44c65fb7571ba0d0e Mon Sep 17 00:00:00 2001 From: Nikita Tsukanov Date: Wed, 27 Sep 2017 13:37:58 +0300 Subject: [PATCH 07/69] Moved remote previewer entry point to DesignSupport.dll --- .../Remote}/DetachableTransportConnection.cs | 2 +- .../Remote}/PreviewerWindowImpl.cs | 4 +- .../Remote}/PreviewerWindowingPlatform.cs | 2 +- .../Remote/RemoteDesignerEntryPoint.cs | 172 ++++++++++++++++++ .../Remote}/Stubs.cs | 6 +- .../Avalonia.Designer.HostApp.csproj | 1 - .../Avalonia.Designer.HostApp/Program.cs | 169 +---------------- 7 files changed, 180 insertions(+), 176 deletions(-) rename src/{tools/Avalonia.Designer.HostApp => Avalonia.DesignerSupport/Remote}/DetachableTransportConnection.cs (95%) rename src/{tools/Avalonia.Designer.HostApp => Avalonia.DesignerSupport/Remote}/PreviewerWindowImpl.cs (94%) rename src/{tools/Avalonia.Designer.HostApp => Avalonia.DesignerSupport/Remote}/PreviewerWindowingPlatform.cs (98%) create mode 100644 src/Avalonia.DesignerSupport/Remote/RemoteDesignerEntryPoint.cs rename src/{tools/Avalonia.Designer.HostApp => Avalonia.DesignerSupport/Remote}/Stubs.cs (97%) diff --git a/src/tools/Avalonia.Designer.HostApp/DetachableTransportConnection.cs b/src/Avalonia.DesignerSupport/Remote/DetachableTransportConnection.cs similarity index 95% rename from src/tools/Avalonia.Designer.HostApp/DetachableTransportConnection.cs rename to src/Avalonia.DesignerSupport/Remote/DetachableTransportConnection.cs index 9cd87a2c59..1fb10a3a7c 100644 --- a/src/tools/Avalonia.Designer.HostApp/DetachableTransportConnection.cs +++ b/src/Avalonia.DesignerSupport/Remote/DetachableTransportConnection.cs @@ -2,7 +2,7 @@ using System.Threading.Tasks; using Avalonia.Remote.Protocol; -namespace Avalonia.Designer.HostApp +namespace Avalonia.DesignerSupport.Remote { class DetachableTransportConnection : IAvaloniaRemoteTransportConnection { diff --git a/src/tools/Avalonia.Designer.HostApp/PreviewerWindowImpl.cs b/src/Avalonia.DesignerSupport/Remote/PreviewerWindowImpl.cs similarity index 94% rename from src/tools/Avalonia.Designer.HostApp/PreviewerWindowImpl.cs rename to src/Avalonia.DesignerSupport/Remote/PreviewerWindowImpl.cs index 5ffaa6459a..a787c8e8e3 100644 --- a/src/tools/Avalonia.Designer.HostApp/PreviewerWindowImpl.cs +++ b/src/Avalonia.DesignerSupport/Remote/PreviewerWindowImpl.cs @@ -7,9 +7,9 @@ using Avalonia.Remote.Protocol; using Avalonia.Remote.Protocol.Viewport; using Avalonia.Threading; -namespace Avalonia.Designer.HostApp +namespace Avalonia.DesignerSupport.Remote { - public class PreviewerWindowImpl : RemoteServerTopLevelImpl, IWindowImpl, IEmbeddableWindowImpl + class PreviewerWindowImpl : RemoteServerTopLevelImpl, IWindowImpl, IEmbeddableWindowImpl { private readonly IAvaloniaRemoteTransportConnection _transport; diff --git a/src/tools/Avalonia.Designer.HostApp/PreviewerWindowingPlatform.cs b/src/Avalonia.DesignerSupport/Remote/PreviewerWindowingPlatform.cs similarity index 98% rename from src/tools/Avalonia.Designer.HostApp/PreviewerWindowingPlatform.cs rename to src/Avalonia.DesignerSupport/Remote/PreviewerWindowingPlatform.cs index b33f871139..ca3bb2b97f 100644 --- a/src/tools/Avalonia.Designer.HostApp/PreviewerWindowingPlatform.cs +++ b/src/Avalonia.DesignerSupport/Remote/PreviewerWindowingPlatform.cs @@ -7,7 +7,7 @@ using Avalonia.Platform; using Avalonia.Remote.Protocol; using Avalonia.Rendering; -namespace Avalonia.Designer.HostApp +namespace Avalonia.DesignerSupport.Remote { class PreviewerWindowingPlatform : IWindowingPlatform, IPlatformSettings { diff --git a/src/Avalonia.DesignerSupport/Remote/RemoteDesignerEntryPoint.cs b/src/Avalonia.DesignerSupport/Remote/RemoteDesignerEntryPoint.cs new file mode 100644 index 0000000000..ac3438d71c --- /dev/null +++ b/src/Avalonia.DesignerSupport/Remote/RemoteDesignerEntryPoint.cs @@ -0,0 +1,172 @@ +using System; +using System.Collections.Generic; +using System.Net; +using System.Reflection; +using Avalonia.Controls; +using Avalonia.Controls.Shapes; +using Avalonia.DesignerSupport; +using Avalonia.Input; +using Avalonia.Remote.Protocol; +using Avalonia.Remote.Protocol.Designer; +using Avalonia.Remote.Protocol.Viewport; +using Avalonia.Threading; + +namespace Avalonia.DesignerSupport.Remote +{ + public class RemoteDesignerEntryPoint + { + private static ClientSupportedPixelFormatsMessage s_supportedPixelFormats; + private static ClientViewportAllocatedMessage s_viewportAllocatedMessage; + private static IAvaloniaRemoteTransportConnection s_transport; + class CommandLineArgs + { + public string AppPath { get; set; } + public Uri Transport { get; set; } + } + + static Exception Die(string error) + { + if (error != null) + { + Console.Error.WriteLine(error); + Console.Error.Flush(); + } + Environment.Exit(1); + return new Exception("APPEXIT"); + } + + static Exception PrintUsage() + { + Console.Error.WriteLine("Usage: --transport transport_spec app"); + Console.Error.WriteLine(); + Console.Error.WriteLine("Example: --transport tcp-bson://127.0.0.1:30243/ MyApp.exe"); + Console.Error.Flush(); + return Die(null); + } + + static CommandLineArgs ParseCommandLineArgs(string[] args) + { + var rv = new CommandLineArgs(); + Action next = null; + try + { + foreach (var arg in args) + { + if (next != null) + { + next(arg); + next = null; + } + else if (arg == "--transport") + next = a => rv.Transport = new Uri(a, UriKind.Absolute); + else if (rv.AppPath == null) + rv.AppPath = arg; + else + PrintUsage(); + + } + if (rv.AppPath == null || rv.Transport == null) + PrintUsage(); + } + catch + { + PrintUsage(); + } + return rv; + } + + static IAvaloniaRemoteTransportConnection CreateTransport(Uri transport) + { + if (transport.Scheme == "tcp-bson") + { + return new BsonTcpTransport().Connect(IPAddress.Parse(transport.Host), transport.Port).Result; + } + PrintUsage(); + return null; + } + + interface IAppInitializer + { + Application GetConfiguredApp(IAvaloniaRemoteTransportConnection transport, object obj); + } + + class AppInitializer : IAppInitializer where T : AppBuilderBase, new() + { + public Application GetConfiguredApp(IAvaloniaRemoteTransportConnection transport, object obj) + { + var builder = (AppBuilderBase) obj; + builder.UseWindowingSubsystem(() => PreviewerWindowingPlatform.Initialize(transport)); + builder.SetupWithoutStarting(); + return builder.Instance; + } + } + + private const string BuilderMethodName = "BuildAvaloniaApp"; + + class NeverClose : ICloseable + { + public event EventHandler Closed; + } + + public static void Main(string[] cmdline) + { + var args = ParseCommandLineArgs(cmdline); + var transport = CreateTransport(args.Transport); + var asm = Assembly.LoadFile(System.IO.Path.GetFullPath(args.AppPath)); + var entryPoint = asm.EntryPoint; + if (entryPoint == null) + throw Die($"Assembly {args.AppPath} doesn't have an entry point"); + var builderMethod = entryPoint.DeclaringType.GetMethod(BuilderMethodName, + BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic); + if (builderMethod == null) + throw Die($"{entryPoint.DeclaringType.FullName} doesn't have a method named {BuilderMethodName}"); + + var appBuilder = builderMethod.Invoke(null, null); + var initializer =(IAppInitializer)Activator.CreateInstance(typeof(AppInitializer<>).MakeGenericType(appBuilder.GetType())); + var app = initializer.GetConfiguredApp(transport, appBuilder); + s_transport = transport; + transport.OnMessage += OnTransportMessage; + transport.OnException += (t, e) => Die(e.ToString()); + app.Run(new NeverClose()); + } + + + private static void RebuildPreFlight() + { + PreviewerWindowingPlatform.PreFlightMessages = new List + { + s_supportedPixelFormats, + s_viewportAllocatedMessage + }; + } + + private static void OnTransportMessage(IAvaloniaRemoteTransportConnection transport, object obj) => Dispatcher.UIThread.InvokeAsync(() => + { + if (obj is ClientSupportedPixelFormatsMessage formats) + { + s_supportedPixelFormats = formats; + RebuildPreFlight(); + } + if (obj is ClientViewportAllocatedMessage viewport) + { + s_viewportAllocatedMessage = viewport; + RebuildPreFlight(); + } + if (obj is UpdateXamlMessage xaml) + { + try + { + DesignWindowLoader.LoadDesignerWindow(xaml.Xaml, xaml.AssemblyPath); + s_transport.Send(new UpdateXamlResultMessage()); + } + catch (Exception e) + { + s_transport.Send(new UpdateXamlResultMessage + { + Error = e.ToString() + }); + } + } + }); + } +} \ No newline at end of file diff --git a/src/tools/Avalonia.Designer.HostApp/Stubs.cs b/src/Avalonia.DesignerSupport/Remote/Stubs.cs similarity index 97% rename from src/tools/Avalonia.Designer.HostApp/Stubs.cs rename to src/Avalonia.DesignerSupport/Remote/Stubs.cs index a4160e7da4..5aad114cf7 100644 --- a/src/tools/Avalonia.Designer.HostApp/Stubs.cs +++ b/src/Avalonia.DesignerSupport/Remote/Stubs.cs @@ -11,12 +11,8 @@ using Avalonia.Input.Raw; using Avalonia.Platform; using Avalonia.Rendering; -namespace Avalonia.Designer.HostApp +namespace Avalonia.DesignerSupport.Remote { - /// - /// Popups are no-op - /// - class WindowStub : IPopupImpl, IWindowImpl { public Action Deactivated { get; set; } diff --git a/src/tools/Avalonia.Designer.HostApp/Avalonia.Designer.HostApp.csproj b/src/tools/Avalonia.Designer.HostApp/Avalonia.Designer.HostApp.csproj index f0f3b12cc5..2a68862f18 100644 --- a/src/tools/Avalonia.Designer.HostApp/Avalonia.Designer.HostApp.csproj +++ b/src/tools/Avalonia.Designer.HostApp/Avalonia.Designer.HostApp.csproj @@ -4,7 +4,6 @@ netcoreapp2.0 - diff --git a/src/tools/Avalonia.Designer.HostApp/Program.cs b/src/tools/Avalonia.Designer.HostApp/Program.cs index 88dadf479e..29640ffc6f 100644 --- a/src/tools/Avalonia.Designer.HostApp/Program.cs +++ b/src/tools/Avalonia.Designer.HostApp/Program.cs @@ -1,173 +1,10 @@ -using System; -using System.Collections.Generic; -using System.Net; -using System.Reflection; -using Avalonia.Controls; -using Avalonia.Controls.Shapes; -using Avalonia.DesignerSupport; -using Avalonia.Input; -using Avalonia.Remote.Protocol; -using Avalonia.Remote.Protocol.Designer; -using Avalonia.Remote.Protocol.Viewport; -using Avalonia.Threading; + namespace Avalonia.Designer.HostApp { class Program { - - private static ClientSupportedPixelFormatsMessage s_supportedPixelFormats; - private static ClientViewportAllocatedMessage s_viewportAllocatedMessage; - private static IAvaloniaRemoteTransportConnection s_transport; - class CommandLineArgs - { - public string AppPath { get; set; } - public Uri Transport { get; set; } - } - - static Exception Die(string error) - { - if (error != null) - { - Console.Error.WriteLine(error); - Console.Error.Flush(); - } - Environment.Exit(1); - return new Exception("APPEXIT"); - } - - static Exception PrintUsage() - { - Console.Error.WriteLine("Usage: --transport transport_spec app"); - Console.Error.WriteLine(); - Console.Error.WriteLine("Example: --transport tcp-bson://127.0.0.1:30243/ MyApp.exe"); - Console.Error.Flush(); - return Die(null); - } - - static CommandLineArgs ParseCommandLineArgs(string[] args) - { - var rv = new CommandLineArgs(); - Action next = null; - try - { - foreach (var arg in args) - { - if (next != null) - { - next(arg); - next = null; - } - else if (arg == "--transport") - next = a => rv.Transport = new Uri(a, UriKind.Absolute); - else if (rv.AppPath == null) - rv.AppPath = arg; - else - PrintUsage(); - - } - if (rv.AppPath == null || rv.Transport == null) - PrintUsage(); - } - catch - { - PrintUsage(); - } - return rv; - } - - static IAvaloniaRemoteTransportConnection CreateTransport(Uri transport) - { - if (transport.Scheme == "tcp-bson") - { - return new BsonTcpTransport().Connect(IPAddress.Parse(transport.Host), transport.Port).Result; - } - PrintUsage(); - return null; - } - - interface IAppInitializer - { - Application GetConfiguredApp(IAvaloniaRemoteTransportConnection transport, object obj); - } - - class AppInitializer : IAppInitializer where T : AppBuilderBase, new() - { - public Application GetConfiguredApp(IAvaloniaRemoteTransportConnection transport, object obj) - { - var builder = (AppBuilderBase) obj; - builder.UseWindowingSubsystem(() => PreviewerWindowingPlatform.Initialize(transport)); - builder.SetupWithoutStarting(); - return builder.Instance; - } - } - - private const string BuilderMethodName = "BuildAvaloniaApp"; - - class NeverClose : ICloseable - { - public event EventHandler Closed; - } - - static void Main(string[] cmdline) - { - var args = ParseCommandLineArgs(cmdline); - var transport = CreateTransport(args.Transport); - var asm = Assembly.LoadFile(System.IO.Path.GetFullPath(args.AppPath)); - var entryPoint = asm.EntryPoint; - if (entryPoint == null) - throw Die($"Assembly {args.AppPath} doesn't have an entry point"); - var builderMethod = entryPoint.DeclaringType.GetMethod(BuilderMethodName, - BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic); - if (builderMethod == null) - throw Die($"{entryPoint.DeclaringType.FullName} doesn't have a method named {BuilderMethodName}"); - - var appBuilder = builderMethod.Invoke(null, null); - var initializer =(IAppInitializer)Activator.CreateInstance(typeof(AppInitializer<>).MakeGenericType(appBuilder.GetType())); - var app = initializer.GetConfiguredApp(transport, appBuilder); - s_transport = transport; - transport.OnMessage += OnTransportMessage; - transport.OnException += (t, e) => Die(e.ToString()); - app.Run(new NeverClose()); - } - - - private static void RebuildPreFlight() - { - PreviewerWindowingPlatform.PreFlightMessages = new List - { - s_supportedPixelFormats, - s_viewportAllocatedMessage - }; - } - - private static void OnTransportMessage(IAvaloniaRemoteTransportConnection transport, object obj) => Dispatcher.UIThread.InvokeAsync(() => - { - if (obj is ClientSupportedPixelFormatsMessage formats) - { - s_supportedPixelFormats = formats; - RebuildPreFlight(); - } - if (obj is ClientViewportAllocatedMessage viewport) - { - s_viewportAllocatedMessage = viewport; - RebuildPreFlight(); - } - if (obj is UpdateXamlMessage xaml) - { - try - { - DesignWindowLoader.LoadDesignerWindow(xaml.Xaml, xaml.AssemblyPath); - s_transport.Send(new UpdateXamlResultMessage()); - } - catch (Exception e) - { - s_transport.Send(new UpdateXamlResultMessage - { - Error = e.ToString() - }); - } - } - }); + public static void Main(string[] args) + => Avalonia.DesignerSupport.Remote.RemoteDesignerEntryPoint.Main(args); } } \ No newline at end of file From ecc79607d7e45b205747cc1dcdde1be3b0f2ac59 Mon Sep 17 00:00:00 2001 From: Artjom Date: Thu, 5 Oct 2017 21:29:35 +0300 Subject: [PATCH 08/69] Update readme.md The first time I've seen Avalonia's readme, I was a bit confused about how to quickly get started with the framework. So this readme update includes a new paragraph named "Getting Started" where I've tried to point out how to create a simple "Hello world" application! --- readme.md | 57 ++++++++++++++++++------------------------------------- 1 file changed, 18 insertions(+), 39 deletions(-) diff --git a/readme.md b/readme.md index 3f4840fce2..3fce3719db 100644 --- a/readme.md +++ b/readme.md @@ -1,70 +1,49 @@ # Avalonia - | Gitter Chat | Windows Build Status | Linux/Mac Build Status | |---|---|---| | [![Gitter](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/AvaloniaUI/Avalonia?utm_campaign=pr-badge&utm_content=badge&utm_medium=badge&utm_source=badge) | [![Build status](https://ci.appveyor.com/api/projects/status/hubk3k0w9idyibfg/branch/master?svg=true)](https://ci.appveyor.com/project/AvaloniaUI/Avalonia/branch/master) | [![Build Status](https://travis-ci.org/AvaloniaUI/Avalonia.svg?branch=master)](https://travis-ci.org/AvaloniaUI/Avalonia) | -A multi-platform .NET UI framework. It can run on Windows, Linux, Mac OS X, iOS and Android. +A multi-platform .NET UI framework. It runs on Windows, Linux, Mac OS X, iOS and Android. -[![](docs/images/screen.png)](https://youtu.be/wHcB3sGLVYg) +| Control catalog | Desktop platforms | Mobile platforms | +|---|---|---| +| | | | -Desktop platforms: +## About -![](docs/images/avalonia-video.png) +Avalonia is a multi-platform windowing toolkit - somewhat like WPF - that is intended to be multi-platform. It supports XAML, lookless controls and a flexible styling system, and runs on Windows using Direct2D and other operating systems using Skia and OS-specific windowing backend (GTK, Cocoa, etc). -Mobile platforms: +Avalonia is now in alpha. What does "alpha" mean? Well, it means that it's now at a stage where you can have a play and hopefully create simple applications. There's still a lot missing, and you *will* find bugs, and the API *will* change, but this represents the first time where we've made it somewhat easy to have a play and experiment with the framework. -![](https://i.ytimg.com/vi/NJ9-hnmUbBM/hqdefault.jpg) +## Getting Started -## NuGet +Avalonia [Visual Studio Extension](https://marketplace.visualstudio.com/items?itemName=AvaloniaTeam.AvaloniaforVisualStudio) contains project and control templates that will help you get started. After installing it, open "New Project" dialog in Visual Studio, choose "Avalonia" in "Visual C#" section and press OK (screenshot). Now you can write code and markup that will work on multiple platforms! -Avalonia is delivered as a NuGet package. -You can find the packages here: ([stable(ish)](https://www.nuget.org/packages/Avalonia/), [nightly](https://github.com/AvaloniaUI/Avalonia/wiki/Using-nightly-build-feed)) +Avalonia is also delivered as a NuGet package. You can find the packages here: ([stable(ish)](https://www.nuget.org/packages/Avalonia/), [nightly](https://github.com/AvaloniaUI/Avalonia/wiki/Using-nightly-build-feed)) -You can install the package like this: -`Install-Package Avalonia -Pre` +Use this command in Package Manager console to install the package: +``` +Install-Package Avalonia -Pre +``` ## Bleeding Edge Builds Try out the latest build of Avalonia available for download here: https://ci.appveyor.com/project/AvaloniaUI/Avalonia/branch/master/artifacts -Try out the ControlCatalog to give it a quick demo. - -## Background - -Avalonia is a multi-platform windowing toolkit - somewhat like WPF - that is intended to be multi- -platform. It supports XAML, lookless controls and a flexible styling system, and runs on Windows -using Direct2D and other operating systems using Skia and OS-specific windowing backend (GTK, Cocoa, etc). - -## Current Status - -Avalonia is now in alpha. What does "alpha" mean? Well, it means that it's now at a stage where you -can have a play and hopefully create simple applications. There's now a [Visual -Studio Extension](https://marketplace.visualstudio.com/items?itemName=AvaloniaTeam.AvaloniaforVisualStudio) -containing project and item templates that will help you get started, and -there's an initial complement of controls. There's still a lot missing, and you -*will* find bugs, and the API *will* change, but this represents the first time -where we've made it somewhat easy to have a play and experiment with the -framework. - ## Documentation -As mentioned above, Avalonia is still in alpha and as such there's not much documentation yet. You can -take a look at the [getting started page](docs/tutorial/gettingstarted.md) for an -overview of how to get started but probably the best thing to do for now is to already know a little bit -about WPF/Silverlight/UWP/XAML and ask questions in our [Gitter room](https://gitter.im/AvaloniaUI/Avalonia). +As mentioned above, Avalonia is still in alpha and as such there's not much documentation yet. You can take a look at the [getting started page](docs/tutorial/gettingstarted.md) for an overview of how to get started but probably the best thing to do for now is to already know a little bit about WPF/Silverlight/UWP/XAML and ask questions in our [Gitter room](https://gitter.im/AvaloniaUI/Avalonia). -There's also a high-level [architecture document](docs/spec/architecture.md) that is currently a little bit -out of date, and I've also started writing blog posts on Avalonia at http://grokys.github.io/. +There's also a high-level [architecture document](docs/spec/architecture.md) that is currently a little bit out of date, and I've also started writing blog posts on Avalonia at http://grokys.github.io/. Contributions are always welcome! ## Building and Using -See the [build instructions here](docs/guidelines/build.md) +See the [build instructions here](docs/guidelines/build.md). -## Contributing ## +## Contributing Please read the [contribution guidelines](docs/guidelines/contributing.md) before submitting a pull request. From 5efae9e9c33b105649e185912b6ca931a4fbba53 Mon Sep 17 00:00:00 2001 From: Artjom Date: Fri, 6 Oct 2017 00:44:01 +0300 Subject: [PATCH 09/69] Update readme.md Better description! --- readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/readme.md b/readme.md index 3fce3719db..444071178f 100644 --- a/readme.md +++ b/readme.md @@ -12,7 +12,7 @@ A multi-platform .NET UI framework. It runs on Windows, Linux, Mac OS X, iOS and ## About -Avalonia is a multi-platform windowing toolkit - somewhat like WPF - that is intended to be multi-platform. It supports XAML, lookless controls and a flexible styling system, and runs on Windows using Direct2D and other operating systems using Skia and OS-specific windowing backend (GTK, Cocoa, etc). +Avalonia is a WPF-inspired cross-platform XAML UI providing a flexible styling system and supporting a wide range of OSs: Windows (.NET Framework, .NET Core), Android, Linux (GTK), MacOS and iOS. Avalonia is now in alpha. What does "alpha" mean? Well, it means that it's now at a stage where you can have a play and hopefully create simple applications. There's still a lot missing, and you *will* find bugs, and the API *will* change, but this represents the first time where we've made it somewhat easy to have a play and experiment with the framework. From 615ad42a6217351fd5838495cc07c18cd1947821 Mon Sep 17 00:00:00 2001 From: Artjom Date: Fri, 6 Oct 2017 00:45:54 +0300 Subject: [PATCH 10/69] Update readme.md --- readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/readme.md b/readme.md index 444071178f..d7e90a4a44 100644 --- a/readme.md +++ b/readme.md @@ -12,7 +12,7 @@ A multi-platform .NET UI framework. It runs on Windows, Linux, Mac OS X, iOS and ## About -Avalonia is a WPF-inspired cross-platform XAML UI providing a flexible styling system and supporting a wide range of OSs: Windows (.NET Framework, .NET Core), Android, Linux (GTK), MacOS and iOS. +Avalonia is a WPF-inspired cross-platform XAML-based UI framework providing a flexible styling system and supporting a wide range of OSs: Windows (.NET Framework, .NET Core), Android, Linux (GTK), MacOS and iOS. Avalonia is now in alpha. What does "alpha" mean? Well, it means that it's now at a stage where you can have a play and hopefully create simple applications. There's still a lot missing, and you *will* find bugs, and the API *will* change, but this represents the first time where we've made it somewhat easy to have a play and experiment with the framework. From 2b8953c7abbd4f9b7fed59f34ac3648703c42d81 Mon Sep 17 00:00:00 2001 From: Nikita Tsukanov Date: Fri, 6 Oct 2017 19:23:14 +0300 Subject: [PATCH 11/69] Fixed merge issues and made new previewer to work with desktop .net --- Avalonia.sln | 206 +++++++++++------- packages.cake | 12 + samples/ControlCatalog.Desktop/Program.cs | 10 +- samples/ControlCatalog.NetCore/Program.cs | 17 +- .../Avalonia.Controls.csproj | 2 +- src/Avalonia.Controls/Remote/RemoteServer.cs | 3 +- .../Avalonia.DesignerSupport.csproj | 2 +- .../Remote/PreviewerWindowImpl.cs | 7 +- src/Avalonia.DesignerSupport/Remote/Stubs.cs | 14 ++ src/Gtk/Avalonia.Gtk3/Interop/Native.cs | 2 - .../Avalonia.Designer.HostApp.NetFX.csproj | 28 +++ .../Program.cs | 14 ++ .../Properties/launchSettings.json | 8 + .../Avalonia.Designer.HostApp.csproj | 1 + 14 files changed, 222 insertions(+), 104 deletions(-) create mode 100644 src/tools/Avalonia.Designer.HostApp.NetFX/Avalonia.Designer.HostApp.NetFX.csproj create mode 100644 src/tools/Avalonia.Designer.HostApp.NetFX/Program.cs create mode 100644 src/tools/Avalonia.Designer.HostApp.NetFX/Properties/launchSettings.json diff --git a/Avalonia.sln b/Avalonia.sln index 6f46bf953e..7f516667ee 100644 --- a/Avalonia.sln +++ b/Avalonia.sln @@ -1,4 +1,5 @@ -Microsoft Visual Studio Solution File, Format Version 12.00 + +Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 15 VisualStudioVersion = 15.0.26730.3 MinimumVisualStudioVersion = 10.0.40219.1 @@ -178,19 +179,22 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Avalonia.Win32.Interop", "s EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Avalonia.Skia.RenderTests", "tests\Avalonia.RenderTests\Avalonia.Skia.RenderTests.csproj", "{E1582370-37B3-403C-917F-8209551B1634}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Avalonia.Remote.Protocol", "src\Avalonia.Remote.Protocol\Avalonia.Remote.Protocol.csproj", "{D78A720C-C0C6-478B-8564-F167F9BDD01B}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Avalonia.Remote.Protocol", "src\Avalonia.Remote.Protocol\Avalonia.Remote.Protocol.csproj", "{D78A720C-C0C6-478B-8564-F167F9BDD01B}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RemoteTest", "samples\RemoteTest\RemoteTest.csproj", "{E2999E4A-9086-401F-898C-AEB0AD38E676}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "RemoteTest", "samples\RemoteTest\RemoteTest.csproj", "{E2999E4A-9086-401F-898C-AEB0AD38E676}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tools", "Tools", "{4ED8B739-6F4E-4CD4-B993-545E6B5CE637}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Avalonia.Designer.HostApp", "src\tools\Avalonia.Designer.HostApp\Avalonia.Designer.HostApp.csproj", "{050CC912-FF49-4A8B-B534-9544017446DD}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Avalonia.Designer.HostApp", "src\tools\Avalonia.Designer.HostApp\Avalonia.Designer.HostApp.csproj", "{050CC912-FF49-4A8B-B534-9544017446DD}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Previewer", "samples\Previewer\Previewer.csproj", "{F40FC0A2-1BC3-401C-BFC1-928EC4D4A9CE}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Previewer", "samples\Previewer\Previewer.csproj", "{F40FC0A2-1BC3-401C-BFC1-928EC4D4A9CE}" Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "OSX", "OSX", "{A59C4C0A-64DF-4621-B450-2BA00D6F61E2}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Avalonia.MonoMac", "src\OSX\Avalonia.MonoMac\Avalonia.MonoMac.csproj", "{CBFD5788-567D-401B-9DFA-74E4224025A0}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Avalonia.Designer.HostApp.NetFX", "src\tools\Avalonia.Designer.HostApp.NetFX\Avalonia.Designer.HostApp.NetFX.csproj", "{4ADA61C8-D191-428D-9066-EF4F0D86520F}" +EndProject Global GlobalSection(SharedMSBuildProjectFiles) = preSolution src\Shared\RenderHelpers\RenderHelpers.projitems*{3c4c0cb4-0c0f-4450-a37b-148c84ff905f}*SharedItemsImports = 13 @@ -200,7 +204,6 @@ Global tests\Avalonia.RenderTests\Avalonia.RenderTests.projitems*{48840edd-24bf-495d-911e-2eb12ae75d3b}*SharedItemsImports = 13 src\Shared\PlatformSupport\PlatformSupport.projitems*{4a1abb09-9047-4bd5-a4ad-a055e52c5ee0}*SharedItemsImports = 4 src\Shared\PlatformSupport\PlatformSupport.projitems*{7863ea94-f0fb-4386-bf8c-e5bfa761560a}*SharedItemsImports = 4 - src\Shared\PlatformSupport\PlatformSupport.projitems*{7b92af71-6287-4693-9dcb-bd5b6e927e23}*SharedItemsImports = 4 src\Shared\RenderHelpers\RenderHelpers.projitems*{7d2d3083-71dd-4cc9-8907-39a0d86fb322}*SharedItemsImports = 4 src\Windows\Avalonia.Win32\Avalonia.Win32.Shared.projitems*{811a76cf-1cf6-440f-963b-bbe31bd72a82}*SharedItemsImports = 4 src\Windows\Avalonia.Win32\Avalonia.Win32.Shared.projitems*{9defc6b7-845b-4d8f-afc0-d32bf0032b8c}*SharedItemsImports = 13 @@ -2444,86 +2447,86 @@ Global {E2999E4A-9086-401F-898C-AEB0AD38E676}.Release|Mono.Build.0 = Release|Any CPU {E2999E4A-9086-401F-898C-AEB0AD38E676}.Release|x86.ActiveCfg = Release|Any CPU {E2999E4A-9086-401F-898C-AEB0AD38E676}.Release|x86.Build.0 = Release|Any CPU - {050CC912-FF49-4A8B-B534-9544017446DD}.Ad-Hoc|Any CPU.ActiveCfg = Ad-Hoc|Any CPU - {050CC912-FF49-4A8B-B534-9544017446DD}.Ad-Hoc|Any CPU.Build.0 = Ad-Hoc|Any CPU - {050CC912-FF49-4A8B-B534-9544017446DD}.Ad-Hoc|iPhone.ActiveCfg = Ad-Hoc|iPhone - {050CC912-FF49-4A8B-B534-9544017446DD}.Ad-Hoc|iPhone.Build.0 = Ad-Hoc|iPhone - {050CC912-FF49-4A8B-B534-9544017446DD}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Ad-Hoc|iPhoneSimulator - {050CC912-FF49-4A8B-B534-9544017446DD}.Ad-Hoc|iPhoneSimulator.Build.0 = Ad-Hoc|iPhoneSimulator - {050CC912-FF49-4A8B-B534-9544017446DD}.Ad-Hoc|Mono.ActiveCfg = Ad-Hoc|Mono - {050CC912-FF49-4A8B-B534-9544017446DD}.Ad-Hoc|Mono.Build.0 = Ad-Hoc|Mono - {050CC912-FF49-4A8B-B534-9544017446DD}.Ad-Hoc|x86.ActiveCfg = Ad-Hoc|x86 - {050CC912-FF49-4A8B-B534-9544017446DD}.Ad-Hoc|x86.Build.0 = Ad-Hoc|x86 - {050CC912-FF49-4A8B-B534-9544017446DD}.AppStore|Any CPU.ActiveCfg = AppStore|Any CPU - {050CC912-FF49-4A8B-B534-9544017446DD}.AppStore|Any CPU.Build.0 = AppStore|Any CPU - {050CC912-FF49-4A8B-B534-9544017446DD}.AppStore|iPhone.ActiveCfg = AppStore|iPhone - {050CC912-FF49-4A8B-B534-9544017446DD}.AppStore|iPhone.Build.0 = AppStore|iPhone - {050CC912-FF49-4A8B-B534-9544017446DD}.AppStore|iPhoneSimulator.ActiveCfg = AppStore|iPhoneSimulator - {050CC912-FF49-4A8B-B534-9544017446DD}.AppStore|iPhoneSimulator.Build.0 = AppStore|iPhoneSimulator - {050CC912-FF49-4A8B-B534-9544017446DD}.AppStore|Mono.ActiveCfg = AppStore|Mono - {050CC912-FF49-4A8B-B534-9544017446DD}.AppStore|Mono.Build.0 = AppStore|Mono - {050CC912-FF49-4A8B-B534-9544017446DD}.AppStore|x86.ActiveCfg = AppStore|x86 - {050CC912-FF49-4A8B-B534-9544017446DD}.AppStore|x86.Build.0 = AppStore|x86 + {050CC912-FF49-4A8B-B534-9544017446DD}.Ad-Hoc|Any CPU.ActiveCfg = Release|Any CPU + {050CC912-FF49-4A8B-B534-9544017446DD}.Ad-Hoc|Any CPU.Build.0 = Release|Any CPU + {050CC912-FF49-4A8B-B534-9544017446DD}.Ad-Hoc|iPhone.ActiveCfg = Release|Any CPU + {050CC912-FF49-4A8B-B534-9544017446DD}.Ad-Hoc|iPhone.Build.0 = Release|Any CPU + {050CC912-FF49-4A8B-B534-9544017446DD}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Release|Any CPU + {050CC912-FF49-4A8B-B534-9544017446DD}.Ad-Hoc|iPhoneSimulator.Build.0 = Release|Any CPU + {050CC912-FF49-4A8B-B534-9544017446DD}.Ad-Hoc|Mono.ActiveCfg = Release|Any CPU + {050CC912-FF49-4A8B-B534-9544017446DD}.Ad-Hoc|Mono.Build.0 = Release|Any CPU + {050CC912-FF49-4A8B-B534-9544017446DD}.Ad-Hoc|x86.ActiveCfg = Release|Any CPU + {050CC912-FF49-4A8B-B534-9544017446DD}.Ad-Hoc|x86.Build.0 = Release|Any CPU + {050CC912-FF49-4A8B-B534-9544017446DD}.AppStore|Any CPU.ActiveCfg = Release|Any CPU + {050CC912-FF49-4A8B-B534-9544017446DD}.AppStore|Any CPU.Build.0 = Release|Any CPU + {050CC912-FF49-4A8B-B534-9544017446DD}.AppStore|iPhone.ActiveCfg = Release|Any CPU + {050CC912-FF49-4A8B-B534-9544017446DD}.AppStore|iPhone.Build.0 = Release|Any CPU + {050CC912-FF49-4A8B-B534-9544017446DD}.AppStore|iPhoneSimulator.ActiveCfg = Release|Any CPU + {050CC912-FF49-4A8B-B534-9544017446DD}.AppStore|iPhoneSimulator.Build.0 = Release|Any CPU + {050CC912-FF49-4A8B-B534-9544017446DD}.AppStore|Mono.ActiveCfg = Release|Any CPU + {050CC912-FF49-4A8B-B534-9544017446DD}.AppStore|Mono.Build.0 = Release|Any CPU + {050CC912-FF49-4A8B-B534-9544017446DD}.AppStore|x86.ActiveCfg = Release|Any CPU + {050CC912-FF49-4A8B-B534-9544017446DD}.AppStore|x86.Build.0 = Release|Any CPU {050CC912-FF49-4A8B-B534-9544017446DD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {050CC912-FF49-4A8B-B534-9544017446DD}.Debug|Any CPU.Build.0 = Debug|Any CPU - {050CC912-FF49-4A8B-B534-9544017446DD}.Debug|iPhone.ActiveCfg = Debug|iPhone - {050CC912-FF49-4A8B-B534-9544017446DD}.Debug|iPhone.Build.0 = Debug|iPhone - {050CC912-FF49-4A8B-B534-9544017446DD}.Debug|iPhoneSimulator.ActiveCfg = Debug|iPhoneSimulator - {050CC912-FF49-4A8B-B534-9544017446DD}.Debug|iPhoneSimulator.Build.0 = Debug|iPhoneSimulator - {050CC912-FF49-4A8B-B534-9544017446DD}.Debug|Mono.ActiveCfg = Debug|Mono - {050CC912-FF49-4A8B-B534-9544017446DD}.Debug|Mono.Build.0 = Debug|Mono - {050CC912-FF49-4A8B-B534-9544017446DD}.Debug|x86.ActiveCfg = Debug|x86 - {050CC912-FF49-4A8B-B534-9544017446DD}.Debug|x86.Build.0 = Debug|x86 + {050CC912-FF49-4A8B-B534-9544017446DD}.Debug|iPhone.ActiveCfg = Debug|Any CPU + {050CC912-FF49-4A8B-B534-9544017446DD}.Debug|iPhone.Build.0 = Debug|Any CPU + {050CC912-FF49-4A8B-B534-9544017446DD}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {050CC912-FF49-4A8B-B534-9544017446DD}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU + {050CC912-FF49-4A8B-B534-9544017446DD}.Debug|Mono.ActiveCfg = Debug|Any CPU + {050CC912-FF49-4A8B-B534-9544017446DD}.Debug|Mono.Build.0 = Debug|Any CPU + {050CC912-FF49-4A8B-B534-9544017446DD}.Debug|x86.ActiveCfg = Debug|Any CPU + {050CC912-FF49-4A8B-B534-9544017446DD}.Debug|x86.Build.0 = Debug|Any CPU {050CC912-FF49-4A8B-B534-9544017446DD}.Release|Any CPU.ActiveCfg = Release|Any CPU {050CC912-FF49-4A8B-B534-9544017446DD}.Release|Any CPU.Build.0 = Release|Any CPU - {050CC912-FF49-4A8B-B534-9544017446DD}.Release|iPhone.ActiveCfg = Release|iPhone - {050CC912-FF49-4A8B-B534-9544017446DD}.Release|iPhone.Build.0 = Release|iPhone - {050CC912-FF49-4A8B-B534-9544017446DD}.Release|iPhoneSimulator.ActiveCfg = Release|iPhoneSimulator - {050CC912-FF49-4A8B-B534-9544017446DD}.Release|iPhoneSimulator.Build.0 = Release|iPhoneSimulator - {050CC912-FF49-4A8B-B534-9544017446DD}.Release|Mono.ActiveCfg = Release|Mono - {050CC912-FF49-4A8B-B534-9544017446DD}.Release|Mono.Build.0 = Release|Mono - {050CC912-FF49-4A8B-B534-9544017446DD}.Release|x86.ActiveCfg = Release|x86 - {050CC912-FF49-4A8B-B534-9544017446DD}.Release|x86.Build.0 = Release|x86 - {F40FC0A2-1BC3-401C-BFC1-928EC4D4A9CE}.Ad-Hoc|Any CPU.ActiveCfg = Ad-Hoc|Any CPU - {F40FC0A2-1BC3-401C-BFC1-928EC4D4A9CE}.Ad-Hoc|Any CPU.Build.0 = Ad-Hoc|Any CPU - {F40FC0A2-1BC3-401C-BFC1-928EC4D4A9CE}.Ad-Hoc|iPhone.ActiveCfg = Ad-Hoc|iPhone - {F40FC0A2-1BC3-401C-BFC1-928EC4D4A9CE}.Ad-Hoc|iPhone.Build.0 = Ad-Hoc|iPhone - {F40FC0A2-1BC3-401C-BFC1-928EC4D4A9CE}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Ad-Hoc|iPhoneSimulator - {F40FC0A2-1BC3-401C-BFC1-928EC4D4A9CE}.Ad-Hoc|iPhoneSimulator.Build.0 = Ad-Hoc|iPhoneSimulator - {F40FC0A2-1BC3-401C-BFC1-928EC4D4A9CE}.Ad-Hoc|Mono.ActiveCfg = Ad-Hoc|Mono - {F40FC0A2-1BC3-401C-BFC1-928EC4D4A9CE}.Ad-Hoc|Mono.Build.0 = Ad-Hoc|Mono - {F40FC0A2-1BC3-401C-BFC1-928EC4D4A9CE}.Ad-Hoc|x86.ActiveCfg = Ad-Hoc|x86 - {F40FC0A2-1BC3-401C-BFC1-928EC4D4A9CE}.Ad-Hoc|x86.Build.0 = Ad-Hoc|x86 - {F40FC0A2-1BC3-401C-BFC1-928EC4D4A9CE}.AppStore|Any CPU.ActiveCfg = AppStore|Any CPU - {F40FC0A2-1BC3-401C-BFC1-928EC4D4A9CE}.AppStore|Any CPU.Build.0 = AppStore|Any CPU - {F40FC0A2-1BC3-401C-BFC1-928EC4D4A9CE}.AppStore|iPhone.ActiveCfg = AppStore|iPhone - {F40FC0A2-1BC3-401C-BFC1-928EC4D4A9CE}.AppStore|iPhone.Build.0 = AppStore|iPhone - {F40FC0A2-1BC3-401C-BFC1-928EC4D4A9CE}.AppStore|iPhoneSimulator.ActiveCfg = AppStore|iPhoneSimulator - {F40FC0A2-1BC3-401C-BFC1-928EC4D4A9CE}.AppStore|iPhoneSimulator.Build.0 = AppStore|iPhoneSimulator - {F40FC0A2-1BC3-401C-BFC1-928EC4D4A9CE}.AppStore|Mono.ActiveCfg = AppStore|Mono - {F40FC0A2-1BC3-401C-BFC1-928EC4D4A9CE}.AppStore|Mono.Build.0 = AppStore|Mono - {F40FC0A2-1BC3-401C-BFC1-928EC4D4A9CE}.AppStore|x86.ActiveCfg = AppStore|x86 - {F40FC0A2-1BC3-401C-BFC1-928EC4D4A9CE}.AppStore|x86.Build.0 = AppStore|x86 + {050CC912-FF49-4A8B-B534-9544017446DD}.Release|iPhone.ActiveCfg = Release|Any CPU + {050CC912-FF49-4A8B-B534-9544017446DD}.Release|iPhone.Build.0 = Release|Any CPU + {050CC912-FF49-4A8B-B534-9544017446DD}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU + {050CC912-FF49-4A8B-B534-9544017446DD}.Release|iPhoneSimulator.Build.0 = Release|Any CPU + {050CC912-FF49-4A8B-B534-9544017446DD}.Release|Mono.ActiveCfg = Release|Any CPU + {050CC912-FF49-4A8B-B534-9544017446DD}.Release|Mono.Build.0 = Release|Any CPU + {050CC912-FF49-4A8B-B534-9544017446DD}.Release|x86.ActiveCfg = Release|Any CPU + {050CC912-FF49-4A8B-B534-9544017446DD}.Release|x86.Build.0 = Release|Any CPU + {F40FC0A2-1BC3-401C-BFC1-928EC4D4A9CE}.Ad-Hoc|Any CPU.ActiveCfg = Release|Any CPU + {F40FC0A2-1BC3-401C-BFC1-928EC4D4A9CE}.Ad-Hoc|Any CPU.Build.0 = Release|Any CPU + {F40FC0A2-1BC3-401C-BFC1-928EC4D4A9CE}.Ad-Hoc|iPhone.ActiveCfg = Release|Any CPU + {F40FC0A2-1BC3-401C-BFC1-928EC4D4A9CE}.Ad-Hoc|iPhone.Build.0 = Release|Any CPU + {F40FC0A2-1BC3-401C-BFC1-928EC4D4A9CE}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Release|Any CPU + {F40FC0A2-1BC3-401C-BFC1-928EC4D4A9CE}.Ad-Hoc|iPhoneSimulator.Build.0 = Release|Any CPU + {F40FC0A2-1BC3-401C-BFC1-928EC4D4A9CE}.Ad-Hoc|Mono.ActiveCfg = Release|Any CPU + {F40FC0A2-1BC3-401C-BFC1-928EC4D4A9CE}.Ad-Hoc|Mono.Build.0 = Release|Any CPU + {F40FC0A2-1BC3-401C-BFC1-928EC4D4A9CE}.Ad-Hoc|x86.ActiveCfg = Release|Any CPU + {F40FC0A2-1BC3-401C-BFC1-928EC4D4A9CE}.Ad-Hoc|x86.Build.0 = Release|Any CPU + {F40FC0A2-1BC3-401C-BFC1-928EC4D4A9CE}.AppStore|Any CPU.ActiveCfg = Release|Any CPU + {F40FC0A2-1BC3-401C-BFC1-928EC4D4A9CE}.AppStore|Any CPU.Build.0 = Release|Any CPU + {F40FC0A2-1BC3-401C-BFC1-928EC4D4A9CE}.AppStore|iPhone.ActiveCfg = Release|Any CPU + {F40FC0A2-1BC3-401C-BFC1-928EC4D4A9CE}.AppStore|iPhone.Build.0 = Release|Any CPU + {F40FC0A2-1BC3-401C-BFC1-928EC4D4A9CE}.AppStore|iPhoneSimulator.ActiveCfg = Release|Any CPU + {F40FC0A2-1BC3-401C-BFC1-928EC4D4A9CE}.AppStore|iPhoneSimulator.Build.0 = Release|Any CPU + {F40FC0A2-1BC3-401C-BFC1-928EC4D4A9CE}.AppStore|Mono.ActiveCfg = Release|Any CPU + {F40FC0A2-1BC3-401C-BFC1-928EC4D4A9CE}.AppStore|Mono.Build.0 = Release|Any CPU + {F40FC0A2-1BC3-401C-BFC1-928EC4D4A9CE}.AppStore|x86.ActiveCfg = Release|Any CPU + {F40FC0A2-1BC3-401C-BFC1-928EC4D4A9CE}.AppStore|x86.Build.0 = Release|Any CPU {F40FC0A2-1BC3-401C-BFC1-928EC4D4A9CE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {F40FC0A2-1BC3-401C-BFC1-928EC4D4A9CE}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F40FC0A2-1BC3-401C-BFC1-928EC4D4A9CE}.Debug|iPhone.ActiveCfg = Debug|iPhone - {F40FC0A2-1BC3-401C-BFC1-928EC4D4A9CE}.Debug|iPhone.Build.0 = Debug|iPhone - {F40FC0A2-1BC3-401C-BFC1-928EC4D4A9CE}.Debug|iPhoneSimulator.ActiveCfg = Debug|iPhoneSimulator - {F40FC0A2-1BC3-401C-BFC1-928EC4D4A9CE}.Debug|iPhoneSimulator.Build.0 = Debug|iPhoneSimulator - {F40FC0A2-1BC3-401C-BFC1-928EC4D4A9CE}.Debug|Mono.ActiveCfg = Debug|Mono - {F40FC0A2-1BC3-401C-BFC1-928EC4D4A9CE}.Debug|Mono.Build.0 = Debug|Mono - {F40FC0A2-1BC3-401C-BFC1-928EC4D4A9CE}.Debug|x86.ActiveCfg = Debug|x86 - {F40FC0A2-1BC3-401C-BFC1-928EC4D4A9CE}.Debug|x86.Build.0 = Debug|x86 + {F40FC0A2-1BC3-401C-BFC1-928EC4D4A9CE}.Debug|iPhone.ActiveCfg = Debug|Any CPU + {F40FC0A2-1BC3-401C-BFC1-928EC4D4A9CE}.Debug|iPhone.Build.0 = Debug|Any CPU + {F40FC0A2-1BC3-401C-BFC1-928EC4D4A9CE}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {F40FC0A2-1BC3-401C-BFC1-928EC4D4A9CE}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU + {F40FC0A2-1BC3-401C-BFC1-928EC4D4A9CE}.Debug|Mono.ActiveCfg = Debug|Any CPU + {F40FC0A2-1BC3-401C-BFC1-928EC4D4A9CE}.Debug|Mono.Build.0 = Debug|Any CPU + {F40FC0A2-1BC3-401C-BFC1-928EC4D4A9CE}.Debug|x86.ActiveCfg = Debug|Any CPU + {F40FC0A2-1BC3-401C-BFC1-928EC4D4A9CE}.Debug|x86.Build.0 = Debug|Any CPU {F40FC0A2-1BC3-401C-BFC1-928EC4D4A9CE}.Release|Any CPU.ActiveCfg = Release|Any CPU {F40FC0A2-1BC3-401C-BFC1-928EC4D4A9CE}.Release|Any CPU.Build.0 = Release|Any CPU - {F40FC0A2-1BC3-401C-BFC1-928EC4D4A9CE}.Release|iPhone.ActiveCfg = Release|iPhone - {F40FC0A2-1BC3-401C-BFC1-928EC4D4A9CE}.Release|iPhone.Build.0 = Release|iPhone - {F40FC0A2-1BC3-401C-BFC1-928EC4D4A9CE}.Release|iPhoneSimulator.ActiveCfg = Release|iPhoneSimulator - {F40FC0A2-1BC3-401C-BFC1-928EC4D4A9CE}.Release|iPhoneSimulator.Build.0 = Release|iPhoneSimulator - {F40FC0A2-1BC3-401C-BFC1-928EC4D4A9CE}.Release|Mono.ActiveCfg = Release|Mono - {F40FC0A2-1BC3-401C-BFC1-928EC4D4A9CE}.Release|Mono.Build.0 = Release|Mono - {F40FC0A2-1BC3-401C-BFC1-928EC4D4A9CE}.Release|x86.ActiveCfg = Release|x86 - {F40FC0A2-1BC3-401C-BFC1-928EC4D4A9CE}.Release|x86.Build.0 = Release|x86 + {F40FC0A2-1BC3-401C-BFC1-928EC4D4A9CE}.Release|iPhone.ActiveCfg = Release|Any CPU + {F40FC0A2-1BC3-401C-BFC1-928EC4D4A9CE}.Release|iPhone.Build.0 = Release|Any CPU + {F40FC0A2-1BC3-401C-BFC1-928EC4D4A9CE}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU + {F40FC0A2-1BC3-401C-BFC1-928EC4D4A9CE}.Release|iPhoneSimulator.Build.0 = Release|Any CPU + {F40FC0A2-1BC3-401C-BFC1-928EC4D4A9CE}.Release|Mono.ActiveCfg = Release|Any CPU + {F40FC0A2-1BC3-401C-BFC1-928EC4D4A9CE}.Release|Mono.Build.0 = Release|Any CPU + {F40FC0A2-1BC3-401C-BFC1-928EC4D4A9CE}.Release|x86.ActiveCfg = Release|Any CPU + {F40FC0A2-1BC3-401C-BFC1-928EC4D4A9CE}.Release|x86.Build.0 = Release|Any CPU {CBFD5788-567D-401B-9DFA-74E4224025A0}.Ad-Hoc|Any CPU.ActiveCfg = Debug|Any CPU {CBFD5788-567D-401B-9DFA-74E4224025A0}.Ad-Hoc|Any CPU.Build.0 = Debug|Any CPU {CBFD5788-567D-401B-9DFA-74E4224025A0}.Ad-Hoc|iPhone.ActiveCfg = Debug|Any CPU @@ -2564,6 +2567,46 @@ Global {CBFD5788-567D-401B-9DFA-74E4224025A0}.Release|Mono.Build.0 = Release|Any CPU {CBFD5788-567D-401B-9DFA-74E4224025A0}.Release|x86.ActiveCfg = Release|Any CPU {CBFD5788-567D-401B-9DFA-74E4224025A0}.Release|x86.Build.0 = Release|Any CPU + {4ADA61C8-D191-428D-9066-EF4F0D86520F}.Ad-Hoc|Any CPU.ActiveCfg = Release|Any CPU + {4ADA61C8-D191-428D-9066-EF4F0D86520F}.Ad-Hoc|Any CPU.Build.0 = Release|Any CPU + {4ADA61C8-D191-428D-9066-EF4F0D86520F}.Ad-Hoc|iPhone.ActiveCfg = Release|Any CPU + {4ADA61C8-D191-428D-9066-EF4F0D86520F}.Ad-Hoc|iPhone.Build.0 = Release|Any CPU + {4ADA61C8-D191-428D-9066-EF4F0D86520F}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Release|Any CPU + {4ADA61C8-D191-428D-9066-EF4F0D86520F}.Ad-Hoc|iPhoneSimulator.Build.0 = Release|Any CPU + {4ADA61C8-D191-428D-9066-EF4F0D86520F}.Ad-Hoc|Mono.ActiveCfg = Release|Any CPU + {4ADA61C8-D191-428D-9066-EF4F0D86520F}.Ad-Hoc|Mono.Build.0 = Release|Any CPU + {4ADA61C8-D191-428D-9066-EF4F0D86520F}.Ad-Hoc|x86.ActiveCfg = Release|Any CPU + {4ADA61C8-D191-428D-9066-EF4F0D86520F}.Ad-Hoc|x86.Build.0 = Release|Any CPU + {4ADA61C8-D191-428D-9066-EF4F0D86520F}.AppStore|Any CPU.ActiveCfg = Release|Any CPU + {4ADA61C8-D191-428D-9066-EF4F0D86520F}.AppStore|Any CPU.Build.0 = Release|Any CPU + {4ADA61C8-D191-428D-9066-EF4F0D86520F}.AppStore|iPhone.ActiveCfg = Release|Any CPU + {4ADA61C8-D191-428D-9066-EF4F0D86520F}.AppStore|iPhone.Build.0 = Release|Any CPU + {4ADA61C8-D191-428D-9066-EF4F0D86520F}.AppStore|iPhoneSimulator.ActiveCfg = Release|Any CPU + {4ADA61C8-D191-428D-9066-EF4F0D86520F}.AppStore|iPhoneSimulator.Build.0 = Release|Any CPU + {4ADA61C8-D191-428D-9066-EF4F0D86520F}.AppStore|Mono.ActiveCfg = Release|Any CPU + {4ADA61C8-D191-428D-9066-EF4F0D86520F}.AppStore|Mono.Build.0 = Release|Any CPU + {4ADA61C8-D191-428D-9066-EF4F0D86520F}.AppStore|x86.ActiveCfg = Release|Any CPU + {4ADA61C8-D191-428D-9066-EF4F0D86520F}.AppStore|x86.Build.0 = Release|Any CPU + {4ADA61C8-D191-428D-9066-EF4F0D86520F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4ADA61C8-D191-428D-9066-EF4F0D86520F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4ADA61C8-D191-428D-9066-EF4F0D86520F}.Debug|iPhone.ActiveCfg = Debug|Any CPU + {4ADA61C8-D191-428D-9066-EF4F0D86520F}.Debug|iPhone.Build.0 = Debug|Any CPU + {4ADA61C8-D191-428D-9066-EF4F0D86520F}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU + {4ADA61C8-D191-428D-9066-EF4F0D86520F}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU + {4ADA61C8-D191-428D-9066-EF4F0D86520F}.Debug|Mono.ActiveCfg = Debug|Any CPU + {4ADA61C8-D191-428D-9066-EF4F0D86520F}.Debug|Mono.Build.0 = Debug|Any CPU + {4ADA61C8-D191-428D-9066-EF4F0D86520F}.Debug|x86.ActiveCfg = Debug|Any CPU + {4ADA61C8-D191-428D-9066-EF4F0D86520F}.Debug|x86.Build.0 = Debug|Any CPU + {4ADA61C8-D191-428D-9066-EF4F0D86520F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4ADA61C8-D191-428D-9066-EF4F0D86520F}.Release|Any CPU.Build.0 = Release|Any CPU + {4ADA61C8-D191-428D-9066-EF4F0D86520F}.Release|iPhone.ActiveCfg = Release|Any CPU + {4ADA61C8-D191-428D-9066-EF4F0D86520F}.Release|iPhone.Build.0 = Release|Any CPU + {4ADA61C8-D191-428D-9066-EF4F0D86520F}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU + {4ADA61C8-D191-428D-9066-EF4F0D86520F}.Release|iPhoneSimulator.Build.0 = Release|Any CPU + {4ADA61C8-D191-428D-9066-EF4F0D86520F}.Release|Mono.ActiveCfg = Release|Any CPU + {4ADA61C8-D191-428D-9066-EF4F0D86520F}.Release|Mono.Build.0 = Release|Any CPU + {4ADA61C8-D191-428D-9066-EF4F0D86520F}.Release|x86.ActiveCfg = Release|Any CPU + {4ADA61C8-D191-428D-9066-EF4F0D86520F}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -2620,12 +2663,7 @@ Global {E2999E4A-9086-401F-898C-AEB0AD38E676} = {9B9E3891-2366-4253-A952-D08BCEB71098} {050CC912-FF49-4A8B-B534-9544017446DD} = {4ED8B739-6F4E-4CD4-B993-545E6B5CE637} {F40FC0A2-1BC3-401C-BFC1-928EC4D4A9CE} = {9B9E3891-2366-4253-A952-D08BCEB71098} - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {1E8CA5AA-707A-4C57-A682-D265A49E10C3} - {050CC912-FF49-4A8B-B534-9544017446DD} = {4ED8B739-6F4E-4CD4-B993-545E6B5CE637} - {F40FC0A2-1BC3-401C-BFC1-928EC4D4A9CE} = {9B9E3891-2366-4253-A952-D08BCEB71098} - {CBFD5788-567D-401B-9DFA-74E4224025A0} = {A59C4C0A-64DF-4621-B450-2BA00D6F61E2} + {4ADA61C8-D191-428D-9066-EF4F0D86520F} = {4ED8B739-6F4E-4CD4-B993-545E6B5CE637} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {87366D66-1391-4D90-8999-95A620AD786A} diff --git a/packages.cake b/packages.cake index a22ff65e72..98aa08bb50 100644 --- a/packages.cake +++ b/packages.cake @@ -223,6 +223,17 @@ public class Packages }; }); + var toolsContent = new[] { + new NuSpecContent{ + Source = ((FilePath)context.File("./src/tools/Avalonia.Designer.HostApp/bin/" + parameters.DirSuffix + "/netcoreapp2.0/Avalonia.Designer.HostApp.dll")).FullPath, + Target = "tools/netcoreapp2.0/previewer" + }, + new NuSpecContent{ + Source = ((FilePath)context.File("./src/tools/Avalonia.Designer.HostApp.NetFx/bin/" + parameters.DirSuffix + "/net461/Avalonia.Designer.HostApp.NetFx.exe")).FullPath, + Target = "tools/net461/previewer" + } + }; + var nuspecNuGetSettingsCore = new [] { /////////////////////////////////////////////////////////////////////////////// @@ -253,6 +264,7 @@ public class Packages Files = coreLibrariesNuSpecContent .Concat(win32CoreLibrariesNuSpecContent).Concat(net45RuntimePlatform) .Concat(netcoreappCoreLibrariesNuSpecContent).Concat(netCoreRuntimePlatform) + .Concat(toolsContent) .ToList(), BasePath = context.Directory("./"), OutputDirectory = parameters.NugetRoot diff --git a/samples/ControlCatalog.Desktop/Program.cs b/samples/ControlCatalog.Desktop/Program.cs index b67c5ea51d..20bf4ed342 100644 --- a/samples/ControlCatalog.Desktop/Program.cs +++ b/samples/ControlCatalog.Desktop/Program.cs @@ -16,11 +16,15 @@ namespace ControlCatalog // TODO: Make this work with GTK/Skia/Cairo depending on command-line args // again. - AppBuilder.Configure() - .UsePlatformDetect() - .Start(); + BuildAvaloniaApp().Start(); } + /// + /// This method is needed for IDE previewer infrastructure + /// + public static AppBuilder BuildAvaloniaApp() + => AppBuilder.Configure().UsePlatformDetect(); + // This will be made into a runtime configuration extension soon! private static void InitializeLogging() { diff --git a/samples/ControlCatalog.NetCore/Program.cs b/samples/ControlCatalog.NetCore/Program.cs index 640dce0a80..346535d39d 100644 --- a/samples/ControlCatalog.NetCore/Program.cs +++ b/samples/ControlCatalog.NetCore/Program.cs @@ -28,19 +28,14 @@ namespace ControlCatalog.NetCore System.Threading.ThreadPool.QueueUserWorkItem(_ => ConsoleSilencer()); }); else - AppBuilder.Configure() - .CustomPlatformDetect() - .UseReactiveUI() - .Start(); + BuildAvaloniaApp().Start(); } - static AppBuilder CustomPlatformDetect(this AppBuilder builder) - { - //This is needed because we still aren't ready to have MonoMac backend as default one - if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX)) - return builder.UseSkia().UseMonoMac(); - return builder.UsePlatformDetect(); - } + /// + /// This method is needed for IDE previewer infrastructure + /// + public static AppBuilder BuildAvaloniaApp() + => AppBuilder.Configure().UsePlatformDetect().UseReactiveUI(); static void ConsoleSilencer() { diff --git a/src/Avalonia.Controls/Avalonia.Controls.csproj b/src/Avalonia.Controls/Avalonia.Controls.csproj index 0c9981f209..c8f6b4e65a 100644 --- a/src/Avalonia.Controls/Avalonia.Controls.csproj +++ b/src/Avalonia.Controls/Avalonia.Controls.csproj @@ -12,7 +12,7 @@ prompt 4 bin\Debug\Avalonia.Controls.XML - CS1591 + CS1591;CS0067 pdbonly diff --git a/src/Avalonia.Controls/Remote/RemoteServer.cs b/src/Avalonia.Controls/Remote/RemoteServer.cs index 0bc43069e7..86f8318e15 100644 --- a/src/Avalonia.Controls/Remote/RemoteServer.cs +++ b/src/Avalonia.Controls/Remote/RemoteServer.cs @@ -19,8 +19,9 @@ namespace Avalonia.Controls.Remote public TopLevelImpl(IAvaloniaRemoteTransportConnection transport) : base(transport) { } - +#pragma warning disable 67 public event Action LostFocus; + } public RemoteServer(IAvaloniaRemoteTransportConnection transport) diff --git a/src/Avalonia.DesignerSupport/Avalonia.DesignerSupport.csproj b/src/Avalonia.DesignerSupport/Avalonia.DesignerSupport.csproj index 63cb8132a9..9f54137e47 100644 --- a/src/Avalonia.DesignerSupport/Avalonia.DesignerSupport.csproj +++ b/src/Avalonia.DesignerSupport/Avalonia.DesignerSupport.csproj @@ -12,7 +12,7 @@ prompt 4 bin\Debug\Avalonia.DesignerSupport.xml - CS1591 + CS1591;CS0067 pdbonly diff --git a/src/Avalonia.DesignerSupport/Remote/PreviewerWindowImpl.cs b/src/Avalonia.DesignerSupport/Remote/PreviewerWindowImpl.cs index a787c8e8e3..535dfd700b 100644 --- a/src/Avalonia.DesignerSupport/Remote/PreviewerWindowImpl.cs +++ b/src/Avalonia.DesignerSupport/Remote/PreviewerWindowImpl.cs @@ -65,7 +65,9 @@ namespace Avalonia.DesignerSupport.Remote ClientSize = clientSize; RenderIfNeeded(); } - + + public IScreenImpl Screen { get; } = new ScreenStub(); + public void Activate() { } @@ -87,5 +89,8 @@ namespace Avalonia.DesignerSupport.Remote { } + public void ShowTaskbarIcon(bool value) + { + } } } \ No newline at end of file diff --git a/src/Avalonia.DesignerSupport/Remote/Stubs.cs b/src/Avalonia.DesignerSupport/Remote/Stubs.cs index 5aad114cf7..2ed434a2dc 100644 --- a/src/Avalonia.DesignerSupport/Remote/Stubs.cs +++ b/src/Avalonia.DesignerSupport/Remote/Stubs.cs @@ -75,6 +75,8 @@ namespace Avalonia.DesignerSupport.Remote { } + public IScreenImpl Screen { get; } = new ScreenStub(); + public void SetTitle(string title) { } @@ -88,6 +90,10 @@ namespace Avalonia.DesignerSupport.Remote public void SetIcon(IWindowIconImpl icon) { } + + public void ShowTaskbarIcon(bool value) + { + } } class ClipboardStub : IClipboard @@ -129,4 +135,12 @@ namespace Avalonia.DesignerSupport.Remote public Task ShowFolderDialogAsync(OpenFolderDialog dialog, IWindowImpl parent) => Task.FromResult((string) null); } + + class ScreenStub : IScreenImpl + { + public int ScreenCount => 1; + + public Screen[] AllScreens { get; } = + {new Screen(new Rect(0, 0, 4000, 4000), new Rect(0, 0, 4000, 4000), true)}; + } } \ No newline at end of file diff --git a/src/Gtk/Avalonia.Gtk3/Interop/Native.cs b/src/Gtk/Avalonia.Gtk3/Interop/Native.cs index ab1bf4eb34..15b3a11fbb 100644 --- a/src/Gtk/Avalonia.Gtk3/Interop/Native.cs +++ b/src/Gtk/Avalonia.Gtk3/Interop/Native.cs @@ -333,8 +333,6 @@ namespace Avalonia.Gtk3.Interop [UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.Glib)] public delegate ulong g_timeout_add_full(int prio, uint interval, timeout_callback callback, IntPtr data, IntPtr destroy); - [UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.Glib)] - public delegate ulong g_timeout_add_full(int prio, uint interval, timeout_callback callback, IntPtr data, IntPtr destroy); [UnmanagedFunctionPointer(CallingConvention.Cdecl), GtkImport(GtkDll.Glib)] public delegate ulong g_free(IntPtr data); diff --git a/src/tools/Avalonia.Designer.HostApp.NetFX/Avalonia.Designer.HostApp.NetFX.csproj b/src/tools/Avalonia.Designer.HostApp.NetFX/Avalonia.Designer.HostApp.NetFX.csproj new file mode 100644 index 0000000000..cb4ce3f301 --- /dev/null +++ b/src/tools/Avalonia.Designer.HostApp.NetFX/Avalonia.Designer.HostApp.NetFX.csproj @@ -0,0 +1,28 @@ + + + Exe + net461 + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/tools/Avalonia.Designer.HostApp.NetFX/Program.cs b/src/tools/Avalonia.Designer.HostApp.NetFX/Program.cs new file mode 100644 index 0000000000..d3f80dd621 --- /dev/null +++ b/src/tools/Avalonia.Designer.HostApp.NetFX/Program.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Avalonia.Designer.HostApp.NetFX +{ + class Program + { + public static void Main(string[] args) + => Avalonia.DesignerSupport.Remote.RemoteDesignerEntryPoint.Main(args); + } +} diff --git a/src/tools/Avalonia.Designer.HostApp.NetFX/Properties/launchSettings.json b/src/tools/Avalonia.Designer.HostApp.NetFX/Properties/launchSettings.json new file mode 100644 index 0000000000..493caa2693 --- /dev/null +++ b/src/tools/Avalonia.Designer.HostApp.NetFX/Properties/launchSettings.json @@ -0,0 +1,8 @@ +{ + "profiles": { + "Avalonia.Designer.HostApp.NetFX": { + "commandName": "Project", + "commandLineArgs": "--transport tcp-bson://127.0.0.1:25000/ bin/Debug/net461/ControlCatalog.Desktop.exe" + } + } +} \ No newline at end of file diff --git a/src/tools/Avalonia.Designer.HostApp/Avalonia.Designer.HostApp.csproj b/src/tools/Avalonia.Designer.HostApp/Avalonia.Designer.HostApp.csproj index 2a68862f18..5bb4b9dd4a 100644 --- a/src/tools/Avalonia.Designer.HostApp/Avalonia.Designer.HostApp.csproj +++ b/src/tools/Avalonia.Designer.HostApp/Avalonia.Designer.HostApp.csproj @@ -2,6 +2,7 @@ Exe netcoreapp2.0 + From e2b9e5dbaa46af922b062906b829eb23a7f50b84 Mon Sep 17 00:00:00 2001 From: Nikita Tsukanov Date: Sat, 7 Oct 2017 21:15:45 +0300 Subject: [PATCH 12/69] Call VerifyAccess in AvaloniaObject.ctor --- src/Avalonia.Base/AvaloniaObject.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Avalonia.Base/AvaloniaObject.cs b/src/Avalonia.Base/AvaloniaObject.cs index 7defcfbe6a..efcbb57244 100644 --- a/src/Avalonia.Base/AvaloniaObject.cs +++ b/src/Avalonia.Base/AvaloniaObject.cs @@ -56,7 +56,7 @@ namespace Avalonia /// public AvaloniaObject() { - CheckAccess(); + VerifyAccess(); foreach (var property in AvaloniaPropertyRegistry.Instance.GetRegistered(this)) { object value = property.IsDirect ? @@ -818,4 +818,4 @@ namespace Avalonia throw new ArgumentException($"Property '{p.Name} not registered on '{this.GetType()}"); } } -} \ No newline at end of file +} From 713933b7fb78e96070408ca1b966ff35efa26bc4 Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Tue, 10 Oct 2017 14:11:51 +0100 Subject: [PATCH 13/69] [Scrollbar] dont try and arrange the thumb and buttons if the extent is zero. --- src/Avalonia.Controls/Primitives/Track.cs | 34 +++++++++++++---------- 1 file changed, 20 insertions(+), 14 deletions(-) diff --git a/src/Avalonia.Controls/Primitives/Track.cs b/src/Avalonia.Controls/Primitives/Track.cs index 663b7a22d5..ce768fe58d 100644 --- a/src/Avalonia.Controls/Primitives/Track.cs +++ b/src/Avalonia.Controls/Primitives/Track.cs @@ -137,14 +137,17 @@ namespace Avalonia.Controls.Primitives decreaseButton.Arrange(new Rect(0, 0, firstWidth, finalSize.Height)); } - if (thumb != null) + if (!double.IsNaN(thumbWidth)) { - thumb.Arrange(new Rect(firstWidth, 0, thumbWidth, finalSize.Height)); - } - - if (increaseButton != null) - { - increaseButton.Arrange(new Rect(firstWidth + thumbWidth, 0, remaining - firstWidth, finalSize.Height)); + if (thumb != null) + { + thumb.Arrange(new Rect(firstWidth, 0, thumbWidth, finalSize.Height)); + } + + if (increaseButton != null) + { + increaseButton.Arrange(new Rect(firstWidth + thumbWidth, 0, remaining - firstWidth, finalSize.Height)); + } } } else @@ -158,14 +161,17 @@ namespace Avalonia.Controls.Primitives decreaseButton.Arrange(new Rect(0, 0, finalSize.Width, firstHeight)); } - if (thumb != null) - { - thumb.Arrange(new Rect(0, firstHeight, finalSize.Width, thumbHeight)); - } - - if (increaseButton != null) + if (!double.IsNaN(thumbHeight)) { - increaseButton.Arrange(new Rect(0, firstHeight + thumbHeight, finalSize.Width, Math.Max(remaining - firstHeight, 0))); + if (thumb != null) + { + thumb.Arrange(new Rect(0, firstHeight, finalSize.Width, thumbHeight)); + } + + if (increaseButton != null) + { + increaseButton.Arrange(new Rect(0, firstHeight + thumbHeight, finalSize.Width, Math.Max(remaining - firstHeight, 0))); + } } } From 884423d879140fe30b36795c1cd3e91034184684 Mon Sep 17 00:00:00 2001 From: Nikita Tsukanov Date: Tue, 10 Oct 2017 21:43:01 +0300 Subject: [PATCH 14/69] Adapt threading tests to VerifyAccess on AvaloniaObject.ctor --- .../AvaloniaObjectTests_Threading.cs | 52 ++++++++++++------- 1 file changed, 32 insertions(+), 20 deletions(-) diff --git a/tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_Threading.cs b/tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_Threading.cs index 229a34643d..215e872e8c 100644 --- a/tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_Threading.cs +++ b/tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_Threading.cs @@ -14,13 +14,24 @@ namespace Avalonia.Base.UnitTests { public class AvaloniaObjectTests_Threading { + private ThreadingInterface _threading = new ThreadingInterface(true); + [Fact] - public void StyledProperty_GetValue_Should_Throw() + public void AvaloniaObject_Constructor_Should_Throw() { using (UnitTestApplication.Start(new TestServices(threadingInterface: new ThreadingInterface()))) { - var target = new Class1(); + Assert.Throws(() => new Class1()); + } + } + [Fact] + public void StyledProperty_GetValue_Should_Throw() + { + using (UnitTestApplication.Start(new TestServices(threadingInterface: _threading))) + { + var target = new Class1(); + _threading.CurrentThreadIsLoopThread = false; Assert.Throws(() => target.GetValue(Class1.StyledProperty)); } } @@ -28,10 +39,10 @@ namespace Avalonia.Base.UnitTests [Fact] public void StyledProperty_SetValue_Should_Throw() { - using (UnitTestApplication.Start(new TestServices(threadingInterface: new ThreadingInterface()))) + using (UnitTestApplication.Start(new TestServices(threadingInterface: _threading))) { var target = new Class1(); - + _threading.CurrentThreadIsLoopThread = false; Assert.Throws(() => target.SetValue(Class1.StyledProperty, "foo")); } } @@ -39,10 +50,10 @@ namespace Avalonia.Base.UnitTests [Fact] public void Setting_StyledProperty_Binding_Should_Throw() { - using (UnitTestApplication.Start(new TestServices(threadingInterface: new ThreadingInterface()))) + using (UnitTestApplication.Start(new TestServices(threadingInterface: _threading))) { var target = new Class1(); - + _threading.CurrentThreadIsLoopThread = false; Assert.Throws(() => target.Bind( Class1.StyledProperty, @@ -53,10 +64,10 @@ namespace Avalonia.Base.UnitTests [Fact] public void StyledProperty_ClearValue_Should_Throw() { - using (UnitTestApplication.Start(new TestServices(threadingInterface: new ThreadingInterface()))) + using (UnitTestApplication.Start(new TestServices(threadingInterface: _threading))) { var target = new Class1(); - + _threading.CurrentThreadIsLoopThread = false; Assert.Throws(() => target.ClearValue(Class1.StyledProperty)); } } @@ -64,10 +75,10 @@ namespace Avalonia.Base.UnitTests [Fact] public void StyledProperty_IsSet_Should_Throw() { - using (UnitTestApplication.Start(new TestServices(threadingInterface: new ThreadingInterface()))) + using (UnitTestApplication.Start(new TestServices(threadingInterface: _threading))) { var target = new Class1(); - + _threading.CurrentThreadIsLoopThread = false; Assert.Throws(() => target.IsSet(Class1.StyledProperty)); } } @@ -75,10 +86,10 @@ namespace Avalonia.Base.UnitTests [Fact] public void DirectProperty_GetValue_Should_Throw() { - using (UnitTestApplication.Start(new TestServices(threadingInterface: new ThreadingInterface()))) + using (UnitTestApplication.Start(new TestServices(threadingInterface: _threading))) { var target = new Class1(); - + _threading.CurrentThreadIsLoopThread = false; Assert.Throws(() => target.GetValue(Class1.DirectProperty)); } } @@ -86,10 +97,10 @@ namespace Avalonia.Base.UnitTests [Fact] public void DirectProperty_SetValue_Should_Throw() { - using (UnitTestApplication.Start(new TestServices(threadingInterface: new ThreadingInterface()))) + using (UnitTestApplication.Start(new TestServices(threadingInterface: _threading))) { var target = new Class1(); - + _threading.CurrentThreadIsLoopThread = false; Assert.Throws(() => target.SetValue(Class1.DirectProperty, "foo")); } } @@ -97,10 +108,10 @@ namespace Avalonia.Base.UnitTests [Fact] public void Setting_DirectProperty_Binding_Should_Throw() { - using (UnitTestApplication.Start(new TestServices(threadingInterface: new ThreadingInterface()))) + using (UnitTestApplication.Start(new TestServices(threadingInterface: _threading))) { var target = new Class1(); - + _threading.CurrentThreadIsLoopThread = false; Assert.Throws(() => target.Bind( Class1.DirectProperty, @@ -111,10 +122,10 @@ namespace Avalonia.Base.UnitTests [Fact] public void DirectProperty_ClearValue_Should_Throw() { - using (UnitTestApplication.Start(new TestServices(threadingInterface: new ThreadingInterface()))) + using (UnitTestApplication.Start(new TestServices(threadingInterface: _threading))) { var target = new Class1(); - + _threading.CurrentThreadIsLoopThread = false; Assert.Throws(() => target.ClearValue(Class1.DirectProperty)); } } @@ -122,10 +133,10 @@ namespace Avalonia.Base.UnitTests [Fact] public void DirectProperty_IsSet_Should_Throw() { - using (UnitTestApplication.Start(new TestServices(threadingInterface: new ThreadingInterface()))) + using (UnitTestApplication.Start(new TestServices(threadingInterface: _threading))) { var target = new Class1(); - + _threading.CurrentThreadIsLoopThread = false; Assert.Throws(() => target.IsSet(Class1.DirectProperty)); } } @@ -141,6 +152,7 @@ namespace Avalonia.Base.UnitTests private class ThreadingInterface : IPlatformThreadingInterface { + public ThreadingInterface(bool isLoopThread = false) { CurrentThreadIsLoopThread = isLoopThread; From a5f0d23ccb7e22a1f440092cbc3765b79afe9f8c Mon Sep 17 00:00:00 2001 From: Nikita Tsukanov Date: Wed, 11 Oct 2017 15:08:22 +0300 Subject: [PATCH 15/69] Embed Metsys.Bson as a serializer to avoid referencing JSON.NET --- .../Avalonia.DotNetFrameworkRuntime.csproj | 1 - .../Avalonia.Remote.Protocol.csproj | 3 +- .../BsonStreamTransport.cs | 13 +- src/Avalonia.Remote.Protocol/MetsysBson.cs | 1632 +++++++++++++++++ 4 files changed, 1639 insertions(+), 10 deletions(-) create mode 100644 src/Avalonia.Remote.Protocol/MetsysBson.cs diff --git a/src/Avalonia.DotNetFrameworkRuntime/Avalonia.DotNetFrameworkRuntime.csproj b/src/Avalonia.DotNetFrameworkRuntime/Avalonia.DotNetFrameworkRuntime.csproj index db28f8c469..dc4a06d2a7 100644 --- a/src/Avalonia.DotNetFrameworkRuntime/Avalonia.DotNetFrameworkRuntime.csproj +++ b/src/Avalonia.DotNetFrameworkRuntime/Avalonia.DotNetFrameworkRuntime.csproj @@ -10,7 +10,6 @@ Properties\SharedAssemblyInfo.cs - diff --git a/src/Avalonia.Remote.Protocol/Avalonia.Remote.Protocol.csproj b/src/Avalonia.Remote.Protocol/Avalonia.Remote.Protocol.csproj index a9c6b9e9a0..871c9cd995 100644 --- a/src/Avalonia.Remote.Protocol/Avalonia.Remote.Protocol.csproj +++ b/src/Avalonia.Remote.Protocol/Avalonia.Remote.Protocol.csproj @@ -1,10 +1,9 @@  - netstandard1.3 + netstandard2.0 AVALONIA_REMOTE_PROTOCOL;$(DefineConstants) - \ No newline at end of file diff --git a/src/Avalonia.Remote.Protocol/BsonStreamTransport.cs b/src/Avalonia.Remote.Protocol/BsonStreamTransport.cs index 82765f98f6..604703cac8 100644 --- a/src/Avalonia.Remote.Protocol/BsonStreamTransport.cs +++ b/src/Avalonia.Remote.Protocol/BsonStreamTransport.cs @@ -2,9 +2,8 @@ using System.Collections.Generic; using System.IO; using System.Threading; -using Newtonsoft.Json; using System.Threading.Tasks; -using Newtonsoft.Json.Bson; +using Metsys.Bson; namespace Avalonia.Remote.Protocol { @@ -20,8 +19,7 @@ namespace Avalonia.Remote.Protocol private readonly object _lock = new object(); private bool _writeOperationPending; private bool _readingAlreadyStarted; - private bool _writerIsBroken; - static readonly JsonSerializer Serializer = new JsonSerializer(); + private bool _writerIsBroken; private static readonly byte[] ZeroLength = new byte[4]; public BsonStreamTransportConnection(IMessageTypeResolver resolver, Stream inputStream, Stream outputStream, Action disposeCallback) @@ -79,7 +77,8 @@ namespace Avalonia.Remote.Protocol var guid = new Guid(guidBytes); var buffer = new byte[length]; await ReadExact(buffer).ConfigureAwait(false); - var message = Serializer.Deserialize(new BsonReader(new MemoryStream(buffer)), _resolver.GetByGuid(guid)); + var message = Deserializer.Deserialize(new BinaryReader(new MemoryStream(buffer)), + _resolver.GetByGuid(guid)); OnMessage?.Invoke(this, message); } } @@ -107,8 +106,8 @@ namespace Avalonia.Remote.Protocol _outputBlock.SetLength(0); _outputBlock.Write(ZeroLength, 0, 4); _outputBlock.Write(guid, 0, guid.Length); - var writer = new BsonWriter(_outputBlock); - Serializer.Serialize(writer, data); + var serialized = Serializer.Serialize(data); + _outputBlock.Write(serialized, 0, serialized.Length); _outputBlock.Seek(0, SeekOrigin.Begin); var length = BitConverter.GetBytes((int)_outputBlock.Length - 20); _outputBlock.Write(length, 0, length.Length); diff --git a/src/Avalonia.Remote.Protocol/MetsysBson.cs b/src/Avalonia.Remote.Protocol/MetsysBson.cs new file mode 100644 index 0000000000..eb6445c3a5 --- /dev/null +++ b/src/Avalonia.Remote.Protocol/MetsysBson.cs @@ -0,0 +1,1632 @@ +/* +Copyright (c) 2010, Karl Seguin - http://www.openmymind.net/ +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of the nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +Code imported from https://github.com/elaberge/Metsys.Bson without any changes + +*/ + +using System.Text; +using System.Text.RegularExpressions; +using System.IO; +using System.Collections; +using System.Collections.Generic; +using System.Diagnostics; +using System.Net; +using System.Security.Cryptography; +using System.Linq; +using System.Linq.Expressions; +using System.Reflection; +using System; +using System.Runtime.Serialization; + +using Metsys.Bson.Configuration; +// ReSharper disable All + +namespace Metsys.Bson +{ + internal enum Types + { + Double = 1, + String = 2, + Object = 3, + Array = 4, + Binary = 5, + Undefined = 6, + ObjectId = 7, + Boolean = 8, + DateTime = 9, + Null = 10, + Regex = 11, + Reference = 12, + Code = 13, + Symbol = 14, + ScopedCode = 15, + Int32 = 16, + Timestamp = 17, + Int64 = 18, + } +} + +namespace Metsys.Bson +{ + + internal class Serializer + { + private static readonly IDictionary _typeMap = new Dictionary + { + {typeof (int), Types.Int32}, + {typeof (long), Types.Int64}, + {typeof (bool), Types.Boolean}, + {typeof (string), Types.String}, + {typeof (double), Types.Double}, + {typeof (Guid), Types.Binary}, + {typeof (Regex), Types.Regex}, + {typeof (DateTime), Types.DateTime}, + {typeof (float), Types.Double}, + {typeof (byte[]), Types.Binary}, + {typeof (ObjectId), Types.ObjectId}, + {typeof (ScopedCode), Types.ScopedCode} + }; + + private readonly BinaryWriter _writer; + private Document _current; + + public static byte[] Serialize(T document) + { + var type = document.GetType(); + if (type.IsValueType || + (typeof(IEnumerable).IsAssignableFrom(type) && typeof(IDictionary).IsAssignableFrom(type) == false) + ) + { + throw new BsonException("Root type must be an object"); + } + using (var ms = new MemoryStream(250)) + using (var writer = new BinaryWriter(ms)) + { + new Serializer(writer).WriteDocument(document); + return ms.ToArray(); + } + } + public static byte[] Serialize(object document) + { + var type = document.GetType(); + if (type.IsValueType || + (typeof(IEnumerable).IsAssignableFrom(type) && typeof(IDictionary).IsAssignableFrom(type) == false) + ) + { + throw new BsonException("Root type must be an object"); + } + using (var ms = new MemoryStream(250)) + using (var writer = new BinaryWriter(ms)) + { + new Serializer(writer).WriteDocument(document); + return ms.ToArray(); + } + } + + private Serializer(BinaryWriter writer) + { + _writer = writer; + } + + private void NewDocument() + { + var old = _current; + _current = new Document { Parent = old, Length = (int)_writer.BaseStream.Position, Digested = 4 }; + _writer.Write(0); // length placeholder + } + private void EndDocument(bool includeEeo) + { + var old = _current; + if (includeEeo) + { + Written(1); + _writer.Write((byte)0); + } + + _writer.Seek(_current.Length, SeekOrigin.Begin); + _writer.Write(_current.Digested); // override the document length placeholder + _writer.Seek(0, SeekOrigin.End); // back to the end + _current = _current.Parent; + if (_current != null) + { + Written(old.Digested); + } + } + + private void Written(int length) + { + _current.Digested += length; + } + + private void WriteDocument(object document) + { + NewDocument(); + WriteObject(document); + EndDocument(true); + } + + private void WriteObject(object document) + { + var asDictionary = document as IDictionary; + if (asDictionary != null) + { + Write(asDictionary); + return; + } + + var typeHelper = TypeHelper.GetHelperForType(document.GetType()); + foreach (var property in typeHelper.GetProperties()) + { + if (property.Ignored) { continue; } + var name = property.Name; + var value = property.Getter(document); + if (value == null && property.IgnoredIfNull) + { + continue; + } + SerializeMember(name, value); + } + } + + private void SerializeMember(string name, object value) + { + if (value == null) + { + Write(Types.Null); + WriteName(name); + return; + } + + var type = value.GetType(); + if (type.IsEnum) + { + type = Enum.GetUnderlyingType(type); + } + + Types storageType; + if (!_typeMap.TryGetValue(type, out storageType)) + { + // this isn't a simple type; + Write(name, value); + return; + } + + Write(storageType); + WriteName(name); + switch (storageType) + { + case Types.Int32: + Written(4); + _writer.Write((int)value); + return; + case Types.Int64: + Written(8); + _writer.Write((long)value); + return; + case Types.String: + Write((string)value); + return; + case Types.Double: + Written(8); + if (value is float) + { + _writer.Write(Convert.ToDouble((float)value)); + } + else + { + _writer.Write((double)value); + } + + return; + case Types.Boolean: + Written(1); + _writer.Write((bool)value ? (byte)1 : (byte)0); + return; + case Types.DateTime: + Written(8); + _writer.Write((long)((DateTime)value).ToUniversalTime().Subtract(Helper.Epoch).TotalMilliseconds); + return; + case Types.Binary: + WriteBinnary(value); + return; + case Types.ScopedCode: + Write((ScopedCode)value); + return; + case Types.ObjectId: + Written(((ObjectId)value).Value.Length); + _writer.Write(((ObjectId)value).Value); + return; + case Types.Regex: + Write((Regex)value); + break; + } + } + + private void Write(string name, object value) + { + if (value is IDictionary) + { + Write(Types.Object); + WriteName(name); + NewDocument(); + Write((IDictionary)value); + EndDocument(true); + } + else if (value is IEnumerable) + { + Write(Types.Array); + WriteName(name); + NewDocument(); + Write((IEnumerable)value); + EndDocument(true); + } + else + { + Write(Types.Object); + WriteName(name); + WriteDocument(value); // Write manages new/end document + } + } + + private void Write(IEnumerable enumerable) + { + var index = 0; + foreach (var value in enumerable) + { + SerializeMember((index++).ToString(), value); + } + } + + private void Write(IDictionary dictionary) + { + foreach (var key in dictionary.Keys) + { + SerializeMember((string)key, dictionary[key]); + } + } + + private void WriteBinnary(object value) + { + if (value is byte[]) + { + var bytes = (byte[])value; + var length = bytes.Length; + _writer.Write(length + 4); + _writer.Write((byte)2); + _writer.Write(length); + _writer.Write(bytes); + Written(9 + length); + } + else if (value is Guid) + { + var guid = (Guid)value; + var bytes = guid.ToByteArray(); + _writer.Write(bytes.Length); + _writer.Write((byte)3); + _writer.Write(bytes); + Written(5 + bytes.Length); + } + } + + private void Write(Types type) + { + _writer.Write((byte)type); + Written(1); + } + + private void WriteName(string name) + { + var bytes = Encoding.UTF8.GetBytes(name); + _writer.Write(bytes); + _writer.Write((byte)0); + Written(bytes.Length + 1); + } + + private void Write(string name) + { + var bytes = Encoding.UTF8.GetBytes(name); + _writer.Write(bytes.Length + 1); + _writer.Write(bytes); + _writer.Write((byte)0); + Written(bytes.Length + 5); // stringLength + length + null byte + } + + private void Write(Regex regex) + { + WriteName(regex.ToString()); + + var options = string.Empty; + if ((regex.Options & RegexOptions.ECMAScript) == RegexOptions.ECMAScript) + { + options = string.Concat(options, 'e'); + } + + if ((regex.Options & RegexOptions.IgnoreCase) == RegexOptions.IgnoreCase) + { + options = string.Concat(options, 'i'); + } + + if ((regex.Options & RegexOptions.CultureInvariant) == RegexOptions.CultureInvariant) + { + options = string.Concat(options, 'l'); + } + + if ((regex.Options & RegexOptions.Multiline) == RegexOptions.Multiline) + { + options = string.Concat(options, 'm'); + } + + if ((regex.Options & RegexOptions.Singleline) == RegexOptions.Singleline) + { + options = string.Concat(options, 's'); + } + + options = string.Concat(options, 'u'); // all .net regex are unicode regex, therefore: + if ((regex.Options & RegexOptions.IgnorePatternWhitespace) == RegexOptions.IgnorePatternWhitespace) + { + options = string.Concat(options, 'w'); + } + + if ((regex.Options & RegexOptions.ExplicitCapture) == RegexOptions.ExplicitCapture) + { + options = string.Concat(options, 'x'); + } + + WriteName(options); + } + + private void Write(ScopedCode value) + { + NewDocument(); + Write(value.CodeString); + WriteDocument(value.Scope); + EndDocument(false); + } + } +} +namespace Metsys.Bson +{ + internal class ScopedCode + { + public string CodeString { get; set; } + public object Scope { get; set; } + } + + internal class ScopedCode : ScopedCode + { + public new T Scope { get; set; } + } +} + +namespace Metsys.Bson +{ + internal static class ObjectIdGenerator + { + private static readonly object _inclock = new object(); + + private static int _counter; + private static readonly byte[] _machineHash = GenerateHostHash(); + private static readonly byte[] _processId = BitConverter.GetBytes(GenerateProcId()); + + public static byte[] Generate() + { + var oid = new byte[12]; + var copyidx = 0; + + Array.Copy(BitConverter.GetBytes(GenerateTime()), 0, oid, copyidx, 4); + copyidx += 4; + + Array.Copy(_machineHash, 0, oid, copyidx, 3); + copyidx += 3; + + Array.Copy(_processId, 0, oid, copyidx, 2); + copyidx += 2; + + Array.Copy(BitConverter.GetBytes(GenerateInc()), 0, oid, copyidx, 3); + return oid; + } + + private static int GenerateTime() + { + var now = DateTime.Now.ToUniversalTime(); + + var nowtime = new DateTime(Helper.Epoch.Year, Helper.Epoch.Month, Helper.Epoch.Day, now.Hour, now.Minute, now.Second, now.Millisecond); + var diff = nowtime - Helper.Epoch; + return Convert.ToInt32(Math.Floor(diff.TotalMilliseconds)); + } + + private static int GenerateInc() + { + lock (_inclock) + { + return _counter++; + } + } + + private static byte[] GenerateHostHash() + { + using (var md5 = MD5.Create()) + { + var host = Dns.GetHostName(); + return md5.ComputeHash(Encoding.Default.GetBytes(host)); + } + } + private static int GenerateProcId() + { + var proc = Process.GetCurrentProcess(); + return proc.Id; + } + } +} + +namespace Metsys.Bson +{ + internal class ObjectId + { + private string _string; + + public ObjectId() + { + } + + public ObjectId(string value) : this(DecodeHex(value)) + { + } + + internal ObjectId(byte[] value) + { + Value = value; + } + + public static ObjectId Empty + { + get { return new ObjectId("000000000000000000000000"); } + } + + public byte[] Value { get; private set; } + + public static ObjectId NewObjectId() + { + // TODO: generate random-ish bits. + return new ObjectId { Value = ObjectIdGenerator.Generate() }; + } + + public static bool TryParse(string value, out ObjectId id) + { + id = Empty; + if (value == null || value.Length != 24) + { + return false; + } + + try + { + id = new ObjectId(value); + return true; + } + catch (FormatException) + { + return false; + } + } + + public static bool operator ==(ObjectId a, ObjectId b) + { + if (ReferenceEquals(a, b)) + { + return true; + } + + if (((object)a == null) || ((object)b == null)) + { + return false; + } + + return a.Equals(b); + } + + public static bool operator !=(ObjectId a, ObjectId b) + { + return !(a == b); + } + + public override int GetHashCode() + { + return Value != null ? ToString().GetHashCode() : 0; + } + + public override string ToString() + { + if (_string == null && Value != null) + { + _string = BitConverter.ToString(Value).Replace("-", string.Empty).ToLower(); + } + + return _string; + } + + public override bool Equals(object o) + { + var other = o as ObjectId; + return Equals(other); + } + + public bool Equals(ObjectId other) + { + return other != null && ToString() == other.ToString(); + } + + protected static byte[] DecodeHex(string val) + { + var chars = val.ToCharArray(); + var numberChars = chars.Length; + var bytes = new byte[numberChars / 2]; + + for (var i = 0; i < numberChars; i += 2) + { + bytes[i / 2] = Convert.ToByte(new string(chars, i, 2), 16); + } + + return bytes; + } + + public static implicit operator string(ObjectId oid) + { + return oid == null ? null : oid.ToString(); + } + public static implicit operator ObjectId(string oidString) + { + return new ObjectId(oidString); + } + } +} + +namespace Metsys.Bson +{ + public interface IExpando + { + IDictionary Expando { get; } + } +} + +namespace Metsys.Bson +{ + internal class MagicProperty + { + private readonly PropertyInfo _property; + private readonly string _name; + private readonly bool _ignored; + public readonly bool _ignoredIfNull; + + public Type Type + { + get { return _property.PropertyType; } + } + public string Name + { + get { return _name; } + } + public bool Ignored + { + get { return _ignored; } + } + public bool IgnoredIfNull + { + get { return _ignoredIfNull; } + } + + public Action Setter { get; private set; } + + public Func Getter { get; private set; } + + public MagicProperty(PropertyInfo property, string name, bool ignored, bool ignoredIfNull) + { + _property = property; + _name = name; + _ignored = ignored; + _ignoredIfNull = ignoredIfNull; + Getter = CreateGetterMethod(property); + Setter = CreateSetterMethod(property); + } + + private static Action CreateSetterMethod(PropertyInfo property) + { + var genericHelper = typeof(MagicProperty).GetMethod("SetterMethod", BindingFlags.Static | BindingFlags.NonPublic); + var constructedHelper = genericHelper.MakeGenericMethod(property.DeclaringType, property.PropertyType); + return (Action)constructedHelper.Invoke(null, new object[] { property }); + } + + private static Func CreateGetterMethod(PropertyInfo property) + { + var genericHelper = typeof(MagicProperty).GetMethod("GetterMethod", BindingFlags.Static | BindingFlags.NonPublic); + var constructedHelper = genericHelper.MakeGenericMethod(property.DeclaringType, property.PropertyType); + return (Func)constructedHelper.Invoke(null, new object[] { property }); + } + + //called via reflection + private static Action SetterMethod(PropertyInfo method) where TTarget : class + { + var m = method.GetSetMethod(true); + if (m == null) { return null; } //no setter + var func = (Action)Delegate.CreateDelegate(typeof(Action), m); + return (target, param) => func((TTarget)target, (TParam)param); + } + + //called via reflection + private static Func GetterMethod(PropertyInfo method) where TTarget : class + { + var m = method.GetGetMethod(true); + var func = (Func)Delegate.CreateDelegate(typeof(Func), m); + return target => func((TTarget)target); + } + } +} + +namespace Metsys.Bson +{ + internal class TypeHelper + { + private static readonly IDictionary _cachedTypeLookup = new Dictionary(); + private static readonly BsonConfiguration _configuration = BsonConfiguration.Instance; + + private readonly IDictionary _properties; + + private TypeHelper(Type type) + { + var properties = type.GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.FlattenHierarchy); + _properties = LoadMagicProperties(type, properties); + if (typeof(IExpando).IsAssignableFrom(type)) + { + Expando = _properties["Expando"]; + } + } + + public MagicProperty Expando { get; private set; } + + public ICollection GetProperties() + { + return _properties.Values; + } + + public MagicProperty FindProperty(string name) + { + return _properties.ContainsKey(name) ? _properties[name] : null; + } + + public static TypeHelper GetHelperForType(Type type) + { + TypeHelper helper; + if (!_cachedTypeLookup.TryGetValue(type, out helper)) + { + helper = new TypeHelper(type); + _cachedTypeLookup[type] = helper; + } + return helper; + } + + public static string FindProperty(LambdaExpression lambdaExpression) + { + Expression expressionToCheck = lambdaExpression; + + var done = false; + while (!done) + { + switch (expressionToCheck.NodeType) + { + case ExpressionType.Convert: + expressionToCheck = ((UnaryExpression)expressionToCheck).Operand; + break; + + case ExpressionType.Lambda: + expressionToCheck = ((LambdaExpression)expressionToCheck).Body; + break; + + case ExpressionType.MemberAccess: + var memberExpression = (MemberExpression)expressionToCheck; + + if (memberExpression.Expression.NodeType != ExpressionType.Parameter && memberExpression.Expression.NodeType != ExpressionType.Convert) + { + throw new ArgumentException(string.Format("Expression '{0}' must resolve to top-level member.", lambdaExpression), "lambdaExpression"); + } + return memberExpression.Member.Name; + default: + done = true; + break; + } + } + + return null; + } + + public static PropertyInfo FindProperty(Type type, string name) + { + return type.GetProperties().Where(p => p.Name == name).First(); + } + + private static IDictionary LoadMagicProperties(Type type, IEnumerable properties) + { + var magic = new Dictionary(StringComparer.CurrentCultureIgnoreCase); + foreach (var property in properties) + { + if (property.GetIndexParameters().Length > 0) + { + continue; + } + var name = _configuration.AliasFor(type, property.Name); + var ignored = _configuration.IsIgnored(type, property.Name); + var ignoredIfNull = _configuration.IsIgnoredIfNull(type, property.Name); + magic.Add(name, new MagicProperty(property, name, ignored, ignoredIfNull)); + } + return magic; + } + } +} + +namespace Metsys.Bson +{ + internal class ListWrapper : BaseWrapper + { + private IList _list; + + public override object Collection + { + get { return _list; } + } + public override void Add(object value) + { + _list.Add(value); + } + + protected override object CreateContainer(Type type, Type itemType) + { + if (type.IsInterface) + { + return Activator.CreateInstance(typeof(List<>).MakeGenericType(itemType)); + } + if (type.GetConstructor(BindingFlags.Instance | BindingFlags.Public, null, new Type[0], null) != null) + { + return Activator.CreateInstance(type); + } + return null; + } + protected override void SetContainer(object container) + { + _list = container == null ? new ArrayList() : (IList)container; + } + } +} + +namespace Metsys.Bson +{ + internal static class ListHelper + { + public static Type GetListItemType(Type enumerableType) + { + if (enumerableType.IsArray) + { + return enumerableType.GetElementType(); + } + return enumerableType.IsGenericType ? enumerableType.GetGenericArguments()[0] : typeof(object); + } + + public static Type GetDictionarKeyType(Type enumerableType) + { + return enumerableType.IsGenericType + ? enumerableType.GetGenericArguments()[0] + : typeof(object); + } + + public static Type GetDictionarValueType(Type enumerableType) + { + return enumerableType.IsGenericType + ? enumerableType.GetGenericArguments()[1] + : typeof(object); + } + + public static IDictionary CreateDictionary(Type dictionaryType, Type keyType, Type valueType) + { + if (dictionaryType.IsInterface) + { + return (IDictionary)Activator.CreateInstance(typeof(Dictionary<,>).MakeGenericType(keyType, valueType)); + } + + if (dictionaryType.GetConstructor(BindingFlags.Instance | BindingFlags.Public, null, new Type[0], null) != null) + { + return (IDictionary)Activator.CreateInstance(dictionaryType); + } + + return new Dictionary(); + } + } +} + +namespace Metsys.Bson +{ + internal class CollectionWrapper : BaseWrapper + { + private ICollection _list; + + public override object Collection + { + get { return _list; } + } + + public override void Add(object value) + { + _list.Add((T)value); + } + + protected override object CreateContainer(Type type, Type itemType) + { + return Activator.CreateInstance(type); + } + protected override void SetContainer(object container) + { + _list = (ICollection)container; + } + } +} + +namespace Metsys.Bson +{ + internal abstract class BaseWrapper + { + public static BaseWrapper Create(Type type, Type itemType, object existingContainer) + { + var instance = CreateWrapperFromType(existingContainer == null ? type : existingContainer.GetType(), itemType); + instance.SetContainer(existingContainer ?? instance.CreateContainer(type, itemType)); + return instance; + } + + private static BaseWrapper CreateWrapperFromType(Type type, Type itemType) + { + if (type.IsArray) + { + return (BaseWrapper)Activator.CreateInstance(typeof(ArrayWrapper<>).MakeGenericType(itemType)); + } + + var isCollection = false; + var types = new List(type.GetInterfaces().Select(h => h.IsGenericType ? h.GetGenericTypeDefinition() : h)); + types.Insert(0, type.IsGenericType ? type.GetGenericTypeDefinition() : type); + foreach (var @interface in types) + { + if (typeof(IList<>).IsAssignableFrom(@interface) || typeof(IList).IsAssignableFrom(@interface)) + { + return new ListWrapper(); + } + if (typeof(ICollection<>).IsAssignableFrom(@interface)) + { + isCollection = true; + } + } + if (isCollection) + { + return (BaseWrapper)Activator.CreateInstance(typeof(CollectionWrapper<>).MakeGenericType(itemType)); + } + + //a last-ditch pass + foreach (var @interface in types) + { + if (typeof(IEnumerable<>).IsAssignableFrom(@interface) || typeof(IEnumerable).IsAssignableFrom(@interface)) + { + return new ListWrapper(); + } + } + throw new BsonException(string.Format("Collection of type {0} cannot be deserialized", type.FullName)); + } + + public abstract void Add(object value); + public abstract object Collection { get; } + + protected abstract object CreateContainer(Type type, Type itemType); + protected abstract void SetContainer(object container); + } +} + +namespace Metsys.Bson +{ + + internal class ArrayWrapper : BaseWrapper + { + private readonly List _list = new List(); + + public override void Add(object value) + { + _list.Add((T)value); + } + + protected override object CreateContainer(Type type, Type itemType) + { + return null; + } + + protected override void SetContainer(object container) + { + if (container != null) + { + throw new BsonException("An container cannot exist when trying to deserialize an array"); + } + } + + public override object Collection + { + get + { + return _list.ToArray(); + } + } + } +} + +namespace Metsys.Bson +{ + public static class Helper + { + public static readonly DateTime Epoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc); + } +} +namespace Metsys.Bson +{ + internal class Document + { + public int Length; + public Document Parent; + public int Digested; + } +} + +namespace Metsys.Bson +{ + internal class Deserializer + { + internal class Options + { + public bool LongIntegers { get; set; } + public bool StringDates { get; set; } + } + + private readonly static IDictionary _typeMap = new Dictionary + { + {Types.Int32, typeof(int)}, + {Types.Int64, typeof (long)}, + {Types.Boolean, typeof (bool)}, + {Types.String, typeof (string)}, + {Types.Double, typeof(double)}, + {Types.Binary, typeof (byte[])}, + {Types.Regex, typeof (Regex)}, + {Types.DateTime, typeof (DateTime)}, + {Types.ObjectId, typeof(ObjectId)}, + {Types.Array, typeof(List)}, + {Types.Object, typeof(Dictionary)}, + {Types.Null, null}, + }; + private readonly BinaryReader _reader; + private Document _current; + + private Deserializer(BinaryReader reader) + { + _reader = reader; + } + + public static T Deserialize(byte[] objectData, Options options = null) where T : class + { + using (var ms = new MemoryStream()) + { + ms.Write(objectData, 0, objectData.Length); + ms.Position = 0; + return Deserialize(new BinaryReader(ms), options ?? new Options()); + } + } + + private static T Deserialize(BinaryReader stream, Options options) + { + return new Deserializer(stream).Read(options); + } + + private T Read(Options options) + { + NewDocument(_reader.ReadInt32()); + var @object = (T)DeserializeValue(typeof(T), Types.Object, options); + return @object; + } + + public static object Deserialize(BinaryReader stream, Type t, Options options = null) + { + return new Deserializer(stream).Read(t, options ?? new Options()); + } + + object Read(Type t, Options options) + { + NewDocument(_reader.ReadInt32()); + return DeserializeValue(t, Types.Object, options); + } + + private void Read(int read) + { + _current.Digested += read; + } + + private bool IsDone() + { + var isDone = _current.Digested + 1 == _current.Length; + if (isDone) + { + _reader.ReadByte(); // EOO + var old = _current; + _current = old.Parent; + if (_current != null) { Read(old.Length); } + } + return isDone; + } + + private void NewDocument(int length) + { + var old = _current; + _current = new Document { Length = length, Parent = old, Digested = 4 }; + } + + private object DeserializeValue(Type type, Types storedType, Options options) + { + return DeserializeValue(type, storedType, null, options); + } + + private object DeserializeValue(Type type, Types storedType, object container, Options options) + { + if (storedType == Types.Null) + { + return null; + } + if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>)) + { + type = Nullable.GetUnderlyingType(type); + } + if (type == typeof(string)) + { + return ReadString(); + } + if (type == typeof(int)) + { + var val = ReadInt(storedType); + return options.LongIntegers ? (object)(long)val : (object)val; + } + if (type.IsEnum) + { + return ReadEnum(type, storedType); + } + if (type == typeof(float)) + { + Read(8); + return (float)_reader.ReadDouble(); + } + if (storedType == Types.Binary) + { + return ReadBinary(); + } + if (typeof(IEnumerable).IsAssignableFrom(type)) + { + return ReadList(type, container, options); + } + if (type == typeof(bool)) + { + Read(1); + return _reader.ReadBoolean(); + } + if (type == typeof(DateTime)) + { + var value = Helper.Epoch.AddMilliseconds(ReadLong(Types.Int64)); + return options.StringDates ? value.ToString("s", System.Globalization.CultureInfo.InvariantCulture) : (object)value; + } + if (type == typeof(ObjectId)) + { + Read(12); + return new ObjectId(_reader.ReadBytes(12)); + } + if (type == typeof(long)) + { + return ReadLong(storedType); + } + if (type == typeof(double)) + { + Read(8); + return _reader.ReadDouble(); + } + if (type == typeof(Regex)) + { + return ReadRegularExpression(); + } + if (type == typeof(ScopedCode)) + { + return ReadScopedCode(options); + } + return ReadObject(type, options); + } + + private object ReadObject(Type type, Options options) + { + var instance = Activator.CreateInstance(type, true); + var typeHelper = TypeHelper.GetHelperForType(type); + while (true) + { + var storageType = ReadType(); + var name = ReadName(); + var isNull = false; + if (storageType == Types.Object) + { + var length = _reader.ReadInt32(); + if (length == 5) + { + _reader.ReadByte(); //eoo + Read(5); + isNull = true; + } + else + { + NewDocument(length); + } + } + object container = null; + var property = typeHelper.FindProperty(name); + var propertyType = property != null ? property.Type : _typeMap.ContainsKey(storageType) ? _typeMap[storageType] : typeof(object); + if (property == null && typeHelper.Expando == null) + { + throw new BsonException(string.Format("Deserialization failed: type {0} does not have a property named {1}", type.FullName, name)); + } + if (property != null && property.Setter == null) + { + container = property.Getter(instance); + } + var value = isNull ? null : DeserializeValue(propertyType, storageType, container, options); + if (property == null) + { + ((IDictionary)typeHelper.Expando.Getter(instance))[name] = value; + } + else if (container == null && value != null && !property.Ignored) + { + property.Setter(instance, value); + } + if (IsDone()) + { + break; + } + } + return instance; + } + + private object ReadList(Type listType, object existingContainer, Options options) + { + if (IsDictionary(listType)) + { + return ReadDictionary(listType, existingContainer, options); + } + + NewDocument(_reader.ReadInt32()); + var itemType = ListHelper.GetListItemType(listType); + var isObject = typeof(object) == itemType; + var wrapper = BaseWrapper.Create(listType, itemType, existingContainer); + + while (!IsDone()) + { + var storageType = ReadType(); + ReadName(); + if (storageType == Types.Object) + { + NewDocument(_reader.ReadInt32()); + } + var specificItemType = isObject ? _typeMap[storageType] : itemType; + var value = DeserializeValue(specificItemType, storageType, options); + wrapper.Add(value); + } + return wrapper.Collection; + } + + private static bool IsDictionary(Type type) + { + var types = new List(type.GetInterfaces()); + types.Insert(0, type); + foreach (var interfaceType in types) + { + if (interfaceType.IsGenericType && interfaceType.GetGenericTypeDefinition() == typeof(IDictionary<,>)) + { + return true; + } + } + return false; + } + + private object ReadDictionary(Type listType, object existingContainer, Options options) + { + var valueType = ListHelper.GetDictionarValueType(listType); + var isObject = typeof(object) == valueType; + var container = existingContainer == null ? ListHelper.CreateDictionary(listType, ListHelper.GetDictionarKeyType(listType), valueType) : (IDictionary)existingContainer; + + while (!IsDone()) + { + var storageType = ReadType(); + + var key = ReadName(); + if (storageType == Types.Object) + { + NewDocument(_reader.ReadInt32()); + } + var specificItemType = isObject ? _typeMap[storageType] : valueType; + var value = DeserializeValue(specificItemType, storageType, options); + container.Add(key, value); + } + return container; + } + + private object ReadBinary() + { + var length = _reader.ReadInt32(); + var subType = _reader.ReadByte(); + Read(5 + length); + if (subType == 2) + { + return _reader.ReadBytes(_reader.ReadInt32()); + } + if (subType == 3) + { + return new Guid(_reader.ReadBytes(length)); + } + throw new BsonException("No support for binary type: " + subType); + } + + private string ReadName() + { + var buffer = new List(128); //todo: use a pool to prevent fragmentation + byte b; + while ((b = _reader.ReadByte()) > 0) + { + buffer.Add(b); + } + Read(buffer.Count + 1); + return Encoding.UTF8.GetString(buffer.ToArray()); + } + + private string ReadString() + { + var length = _reader.ReadInt32(); + var buffer = _reader.ReadBytes(length - 1); //todo: again, look at fragementation prevention + _reader.ReadByte(); //null; + Read(4 + length); + + return Encoding.UTF8.GetString(buffer); + } + + private int ReadInt(Types storedType) + { + switch (storedType) + { + case Types.Int32: + Read(4); + return _reader.ReadInt32(); + case Types.Int64: + Read(8); + return (int)_reader.ReadInt64(); + case Types.Double: + Read(8); + return (int)_reader.ReadDouble(); + default: + throw new BsonException("Could not create an int from " + storedType); + } + } + + private long ReadLong(Types storedType) + { + switch (storedType) + { + case Types.Int32: + Read(4); + return _reader.ReadInt32(); + case Types.Int64: + Read(8); + return _reader.ReadInt64(); + case Types.Double: + Read(8); + return (long)_reader.ReadDouble(); + default: + throw new BsonException("Could not create an int64 from " + storedType); + } + } + + private object ReadEnum(Type type, Types storedType) + { + if (storedType == Types.Int64) + { + return Enum.Parse(type, ReadLong(storedType).ToString(), false); + } + return Enum.Parse(type, ReadInt(storedType).ToString(), false); + } + + private object ReadRegularExpression() + { + var pattern = ReadName(); + var optionsString = ReadName(); + + var options = RegexOptions.None; + if (optionsString.Contains("e")) options = options | RegexOptions.ECMAScript; + if (optionsString.Contains("i")) options = options | RegexOptions.IgnoreCase; + if (optionsString.Contains("l")) options = options | RegexOptions.CultureInvariant; + if (optionsString.Contains("m")) options = options | RegexOptions.Multiline; + if (optionsString.Contains("s")) options = options | RegexOptions.Singleline; + if (optionsString.Contains("w")) options = options | RegexOptions.IgnorePatternWhitespace; + if (optionsString.Contains("x")) options = options | RegexOptions.ExplicitCapture; + + return new Regex(pattern, options); + } + + private Types ReadType() + { + Read(1); + return (Types)_reader.ReadByte(); + } + + private ScopedCode ReadScopedCode(Options options) + { + _reader.ReadInt32(); //length + Read(4); + var name = ReadString(); + NewDocument(_reader.ReadInt32()); + return new ScopedCode { CodeString = name, Scope = DeserializeValue(typeof(object), Types.Object, options) }; + } + } +} + +namespace Metsys.Bson.Configuration +{ + public interface ITypeConfiguration + { + ITypeConfiguration UseAlias(Expression> expression, string alias); + ITypeConfiguration Ignore(Expression> expression); + ITypeConfiguration Ignore(string name); + ITypeConfiguration IgnoreIfNull(Expression> expression); + } + + internal class TypeConfiguration : ITypeConfiguration + { + private readonly BsonConfiguration _configuration; + + internal TypeConfiguration(BsonConfiguration configuration) + { + _configuration = configuration; + } + + public ITypeConfiguration UseAlias(Expression> expression, string alias) + { + var member = expression.GetMemberExpression(); + _configuration.AddMap(member.GetName(), alias); + return this; + } + + public ITypeConfiguration Ignore(Expression> expression) + { + var member = expression.GetMemberExpression(); + return Ignore(member.GetName()); + } + + public ITypeConfiguration Ignore(string name) + { + _configuration.AddIgnore(name); + return this; + } + + public ITypeConfiguration IgnoreIfNull(Expression> expression) + { + var member = expression.GetMemberExpression(); + _configuration.AddIgnoreIfNull(member.GetName()); + return this; + } + } +} + +namespace Metsys.Bson.Configuration +{ + public static class ExpressionHelper + { + public static string GetName(this MemberExpression expression) + { + return new ExpressionNameVisitor().Visit(expression); + } + + public static MemberExpression GetMemberExpression(this Expression> expression) + { + if (expression == null) + { + return null; + } + if (expression.Body is MemberExpression) + { + return (MemberExpression)expression.Body; + } + if (expression.Body is UnaryExpression) + { + var operand = ((UnaryExpression)expression.Body).Operand; + if (operand is MemberExpression) + { + return (MemberExpression)operand; + } + if (operand is MethodCallExpression) + { + return ((MethodCallExpression)operand).Object as MemberExpression; + } + } + return null; + } + + private class ExpressionNameVisitor + { + public string Visit(Expression expression) + { + if (expression is UnaryExpression) + { + expression = ((UnaryExpression)expression).Operand; + } + if (expression is MethodCallExpression) + { + return Visit((MethodCallExpression)expression); + } + if (expression is MemberExpression) + { + return Visit((MemberExpression)expression); + } + if (expression is BinaryExpression && expression.NodeType == ExpressionType.ArrayIndex) + { + return Visit((BinaryExpression)expression); + } + return null; + } + + private string Visit(BinaryExpression expression) + { + string result = null; + if (expression.Left is MemberExpression) + { + result = Visit((MemberExpression)expression.Left); + } + var index = Expression.Lambda(expression.Right).Compile().DynamicInvoke(); + return result + string.Format("[{0}]", index); + } + + private string Visit(MemberExpression expression) + { + var name = expression.Member.Name; + var ancestorName = Visit(expression.Expression); + if (ancestorName != null) + { + name = ancestorName + "." + name; + } + return name; + } + + private string Visit(MethodCallExpression expression) + { + string name = null; + if (expression.Object is MemberExpression) + { + name = Visit((MemberExpression)expression.Object); + } + + //TODO: Is there a more certain way to determine if this is an indexed property? + if (expression.Method.Name == "get_Item" && expression.Arguments.Count == 1) + { + var index = Expression.Lambda(expression.Arguments[0]).Compile().DynamicInvoke(); + name += string.Format("[{0}]", index); + } + return name; + } + } + } +} + +namespace Metsys.Bson.Configuration +{ + + internal class BsonConfiguration + { + private readonly IDictionary> _aliasMap = new Dictionary>(); + private readonly IDictionary> _ignored = new Dictionary>(); + private readonly IDictionary> _ignoredIfNull = new Dictionary>(); + + //not thread safe + private static BsonConfiguration _instance; + internal static BsonConfiguration Instance + { + get + { + if (_instance == null) { _instance = new BsonConfiguration(); } + return _instance; + } + } + + private BsonConfiguration() { } + + public static void ForType(Action> action) + { + action(new TypeConfiguration(Instance)); + } + + internal void AddMap(string property, string alias) + { + var type = typeof(T); + if (!_aliasMap.ContainsKey(type)) + { + _aliasMap[type] = new Dictionary(); + } + _aliasMap[type][property] = alias; + } + internal string AliasFor(Type type, string property) + { + IDictionary map; + if (!_aliasMap.TryGetValue(type, out map)) + { + return property; + } + return map.ContainsKey(property) ? map[property] : property; + } + + public void AddIgnore(string name) + { + var type = typeof(T); + if (!_ignored.ContainsKey(type)) + { + _ignored[type] = new HashSet(); + } + _ignored[type].Add(name); + } + public bool IsIgnored(Type type, string name) + { + HashSet list; + return _ignored.TryGetValue(type, out list) && list.Contains(name); + } + + public void AddIgnoreIfNull(string name) + { + var type = typeof(T); + if (!_ignoredIfNull.ContainsKey(type)) + { + _ignoredIfNull[type] = new HashSet(); + } + _ignoredIfNull[type].Add(name); + } + public bool IsIgnoredIfNull(Type type, string name) + { + HashSet list; + return _ignoredIfNull.TryGetValue(type, out list) && list.Contains(name); + } + } +} +namespace Metsys.Bson +{ + + internal class BsonException : Exception + { + public BsonException() { } + public BsonException(string message) : base(message) { } + public BsonException(string message, Exception innerException) : base(message, innerException) { } + protected BsonException(SerializationInfo info, StreamingContext context) : base(info, context) { } + } +} From db8cd568ac4ca94a1a973408caa3d6ef5d7477c5 Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Wed, 11 Oct 2017 13:30:30 +0100 Subject: [PATCH 16/69] [Scrollbar] Simplify the thumb height / thumb width logic. --- src/Avalonia.Controls/Primitives/Track.cs | 24 +++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/src/Avalonia.Controls/Primitives/Track.cs b/src/Avalonia.Controls/Primitives/Track.cs index ce768fe58d..f98ceab23f 100644 --- a/src/Avalonia.Controls/Primitives/Track.cs +++ b/src/Avalonia.Controls/Primitives/Track.cs @@ -128,7 +128,17 @@ namespace Avalonia.Controls.Primitives if (Orientation == Orientation.Horizontal) { - var thumbWidth = double.IsNaN(viewportSize) ? thumb?.DesiredSize.Width ?? 0 : finalSize.Width * viewportSize / extent; + double thumbWidth = 0; + + if (double.IsNaN(viewportSize)) + { + thumbWidth = thumb?.DesiredSize.Width ?? 0; + } + else if (extent > 0) + { + thumbWidth = finalSize.Width * viewportSize / extent; + } + var remaining = finalSize.Width - thumbWidth; var firstWidth = range <= 0 ? 0 : remaining * offset / range; @@ -152,7 +162,17 @@ namespace Avalonia.Controls.Primitives } else { - var thumbHeight = double.IsNaN(viewportSize) ? thumb?.DesiredSize.Height ?? 0 : finalSize.Height * viewportSize / extent; + double thumbHeight = 0; + + if (double.IsNaN(viewportSize)) + { + thumbHeight = thumb?.DesiredSize.Height ?? 0; + } + else if (extent > 0) + { + thumbHeight = finalSize.Height * viewportSize / extent; + } + var remaining = finalSize.Height - thumbHeight; var firstHeight = range <= 0 ? 0 : remaining * offset / range; From eee063455d54350e0ccb38e8a58319e4593c51fa Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Wed, 11 Oct 2017 13:31:24 +0100 Subject: [PATCH 17/69] [Track] remove redundant IsNaN check. --- src/Avalonia.Controls/Primitives/Track.cs | 34 ++++++++++------------- 1 file changed, 14 insertions(+), 20 deletions(-) diff --git a/src/Avalonia.Controls/Primitives/Track.cs b/src/Avalonia.Controls/Primitives/Track.cs index f98ceab23f..8c577665d5 100644 --- a/src/Avalonia.Controls/Primitives/Track.cs +++ b/src/Avalonia.Controls/Primitives/Track.cs @@ -147,17 +147,14 @@ namespace Avalonia.Controls.Primitives decreaseButton.Arrange(new Rect(0, 0, firstWidth, finalSize.Height)); } - if (!double.IsNaN(thumbWidth)) + if (thumb != null) { - if (thumb != null) - { - thumb.Arrange(new Rect(firstWidth, 0, thumbWidth, finalSize.Height)); - } - - if (increaseButton != null) - { - increaseButton.Arrange(new Rect(firstWidth + thumbWidth, 0, remaining - firstWidth, finalSize.Height)); - } + thumb.Arrange(new Rect(firstWidth, 0, thumbWidth, finalSize.Height)); + } + + if (increaseButton != null) + { + increaseButton.Arrange(new Rect(firstWidth + thumbWidth, 0, remaining - firstWidth, finalSize.Height)); } } else @@ -181,17 +178,14 @@ namespace Avalonia.Controls.Primitives decreaseButton.Arrange(new Rect(0, 0, finalSize.Width, firstHeight)); } - if (!double.IsNaN(thumbHeight)) + if (thumb != null) + { + thumb.Arrange(new Rect(0, firstHeight, finalSize.Width, thumbHeight)); + } + + if (increaseButton != null) { - if (thumb != null) - { - thumb.Arrange(new Rect(0, firstHeight, finalSize.Width, thumbHeight)); - } - - if (increaseButton != null) - { - increaseButton.Arrange(new Rect(0, firstHeight + thumbHeight, finalSize.Width, Math.Max(remaining - firstHeight, 0))); - } + increaseButton.Arrange(new Rect(0, firstHeight + thumbHeight, finalSize.Width, Math.Max(remaining - firstHeight, 0))); } } From 1ba432c0f9f1eaa46b159ee91606360fab1f1587 Mon Sep 17 00:00:00 2001 From: Nikita Tsukanov Date: Wed, 11 Oct 2017 16:43:22 +0300 Subject: [PATCH 18/69] Use old SDK for Avalonia.Designer.HostApp.NetFX.csproj --- packages.cake | 2 +- .../Avalonia.Designer.HostApp.NetFX.csproj | 125 +++++++++++++++--- 2 files changed, 105 insertions(+), 22 deletions(-) diff --git a/packages.cake b/packages.cake index 98aa08bb50..deb8eaf3d5 100644 --- a/packages.cake +++ b/packages.cake @@ -229,7 +229,7 @@ public class Packages Target = "tools/netcoreapp2.0/previewer" }, new NuSpecContent{ - Source = ((FilePath)context.File("./src/tools/Avalonia.Designer.HostApp.NetFx/bin/" + parameters.DirSuffix + "/net461/Avalonia.Designer.HostApp.NetFx.exe")).FullPath, + Source = ((FilePath)context.File("./src/tools/Avalonia.Designer.HostApp.NetFx/bin/" + parameters.DirSuffix + "/Avalonia.Designer.HostApp.exe")).FullPath, Target = "tools/net461/previewer" } }; diff --git a/src/tools/Avalonia.Designer.HostApp.NetFX/Avalonia.Designer.HostApp.NetFX.csproj b/src/tools/Avalonia.Designer.HostApp.NetFX/Avalonia.Designer.HostApp.NetFX.csproj index cb4ce3f301..c18cee8d08 100644 --- a/src/tools/Avalonia.Designer.HostApp.NetFX/Avalonia.Designer.HostApp.NetFX.csproj +++ b/src/tools/Avalonia.Designer.HostApp.NetFX/Avalonia.Designer.HostApp.NetFX.csproj @@ -1,28 +1,111 @@ - + + + - Exe - net461 - + Debug + AnyCPU + {4ADA61C8-D191-428D-9066-EF4F0D86520F} + WinExe + Properties + Avalonia.Designer.HostApp + Avalonia.Designer.HostApp + v4.6.1 + 512 + true + + PackageReference + + AnyCPU + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + x86 + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + + - - - - - - - - - - - - - - - - + - + + {799a7bb5-3c2c-48b6-85a7-406a12c420da} + Avalonia.DesignerSupport + + + {4A1ABB09-9047-4BD5-A4AD-A055E52C5EE0} + Avalonia.DotNetFrameworkRuntime + + + {3E53A01A-B331-47F3-B828-4A5717E77A24} + Avalonia.Markup.Xaml + + + {6417E941-21BC-467B-A771-0DE389353CE6} + Avalonia.Markup + + + {d211e587-d8bc-45b9-95a4-f297c8fa5200} + Avalonia.Animation + + + {B09B78D8-9B26-48B0-9149-D64A2F120F3F} + Avalonia.Base + + + {D2221C82-4A25-4583-9B43-D791E3F6820C} + Avalonia.Controls + + + {62024b2d-53eb-4638-b26b-85eeaa54866e} + Avalonia.Input + + + {6b0ed19d-a08b-461c-a9d9-a9ee40b0c06b} + Avalonia.Interactivity + + + {42472427-4774-4c81-8aff-9f27b8e31721} + Avalonia.Layout + + + {B61B66A3-B82D-4875-8001-89D3394FE0C9} + Avalonia.Logging.Serilog + + + {eb582467-6abb-43a1-b052-e981ba910e3a} + Avalonia.Visuals + + + {F1BAA01A-F176-4C6A-B39D-5B40BB1B148F} + Avalonia.Styling + + + {3E10A5FA-E8DA-48B1-AD44-6A5B6CB7750F} + Avalonia.Themes.Default + + \ No newline at end of file From a3937812ab4aa742cddec764e33b7e99e2508de6 Mon Sep 17 00:00:00 2001 From: Nikita Tsukanov Date: Wed, 11 Oct 2017 16:44:00 +0300 Subject: [PATCH 19/69] [REMOTE] Renamed private class to avoid confusion --- src/Avalonia.Controls/Remote/RemoteServer.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Avalonia.Controls/Remote/RemoteServer.cs b/src/Avalonia.Controls/Remote/RemoteServer.cs index 86f8318e15..9c0f3464a5 100644 --- a/src/Avalonia.Controls/Remote/RemoteServer.cs +++ b/src/Avalonia.Controls/Remote/RemoteServer.cs @@ -14,9 +14,9 @@ namespace Avalonia.Controls.Remote { private EmbeddableControlRoot _topLevel; - class TopLevelImpl : RemoteServerTopLevelImpl, IEmbeddableWindowImpl + class EmbeddableRemoteServerTopLevelImpl : RemoteServerTopLevelImpl, IEmbeddableWindowImpl { - public TopLevelImpl(IAvaloniaRemoteTransportConnection transport) : base(transport) + public EmbeddableRemoteServerTopLevelImpl(IAvaloniaRemoteTransportConnection transport) : base(transport) { } #pragma warning disable 67 @@ -26,7 +26,7 @@ namespace Avalonia.Controls.Remote public RemoteServer(IAvaloniaRemoteTransportConnection transport) { - _topLevel = new EmbeddableControlRoot(new TopLevelImpl(transport)); + _topLevel = new EmbeddableControlRoot(new EmbeddableRemoteServerTopLevelImpl(transport)); _topLevel.Prepare(); //TODO: Somehow react on closed connection? } From cde1e232056cd7c82fdb53640c2cd3f1c617f1ef Mon Sep 17 00:00:00 2001 From: Nikita Tsukanov Date: Wed, 11 Oct 2017 17:29:25 +0300 Subject: [PATCH 20/69] Added Avalonia.Remote.Protocol package --- packages.cake | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/packages.cake b/packages.cake index deb8eaf3d5..98075ef36b 100644 --- a/packages.cake +++ b/packages.cake @@ -248,6 +248,7 @@ public class Packages new NuSpecDependency() { Id = "Splat", Version = SplatVersion }, new NuSpecDependency() { Id = "Sprache", Version = SpracheVersion }, new NuSpecDependency() { Id = "System.Reactive", Version = SystemReactiveVersion }, + new NuSpecDependency() { Id = "Avalonia.Remote.Protocol", Version = parameters.Version }, //.NET Core new NuSpecDependency() { Id = "System.Threading.ThreadPool", TargetFramework = "netcoreapp2.0", Version = "4.3.0" }, new NuSpecDependency() { Id = "Microsoft.Extensions.DependencyModel", TargetFramework = "netcoreapp2.0", Version = "1.1.0" }, @@ -256,6 +257,7 @@ public class Packages new NuSpecDependency() { Id = "Serilog", TargetFramework = "netcoreapp2.0", Version = SerilogVersion }, new NuSpecDependency() { Id = "Sprache", TargetFramework = "netcoreapp2.0", Version = SpracheVersion }, new NuSpecDependency() { Id = "System.Reactive", TargetFramework = "netcoreapp2.0", Version = SystemReactiveVersion }, + new NuSpecDependency() { Id = "Avalonia.Remote.Protocol", TargetFramework = "netcoreapp2.0", Version = parameters.Version }, } .Deps(new string[]{null, "netcoreapp2.0"}, "System.ValueTuple", "System.ComponentModel.TypeConverter", "System.ComponentModel.Primitives", @@ -303,6 +305,19 @@ public class Packages BasePath = context.Directory("./src/Avalonia.ReactiveUI/bin/" + parameters.DirSuffix + "/netstandard2.0"), OutputDirectory = parameters.NugetRoot }, + /////////////////////////////////////////////////////////////////////////////// + // Avalonia.Remote.Protocol + /////////////////////////////////////////////////////////////////////////////// + new NuGetPackSettings() + { + Id = "Avalonia.Remote.Protocol", + Files = new [] + { + new NuSpecContent { Source = "Avalonia.Remote.Protocol.dll", Target = "lib/netstandard2.0" } + }, + BasePath = context.Directory("./src/Avalonia.Remote.Protocol/bin/" + parameters.DirSuffix + "/netstandard2.0"), + OutputDirectory = parameters.NugetRoot + }, }; var nuspecNuGetSettingsMobile = new [] From a899892d96054bcaa99d304eff816fe4987a137b Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Thu, 12 Oct 2017 09:23:42 +0200 Subject: [PATCH 21/69] Ignore RemoteTest. --- .ncrunch/RemoteTest.v3.ncrunchproject | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .ncrunch/RemoteTest.v3.ncrunchproject diff --git a/.ncrunch/RemoteTest.v3.ncrunchproject b/.ncrunch/RemoteTest.v3.ncrunchproject new file mode 100644 index 0000000000..319cd523ce --- /dev/null +++ b/.ncrunch/RemoteTest.v3.ncrunchproject @@ -0,0 +1,5 @@ + + + True + + \ No newline at end of file From 815d3f719ebbdb2e443e08ced24295e44dea73de Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Thu, 12 Oct 2017 09:42:24 +0200 Subject: [PATCH 22/69] Report correct root in logical tree attach/detach. Fixes #1192. --- src/Avalonia.Controls/Control.cs | 6 +-- .../ControlTests.cs | 41 ++++++++++++++++++- .../ContentPresenterTests_Standalone.cs | 4 ++ 3 files changed, 46 insertions(+), 5 deletions(-) diff --git a/src/Avalonia.Controls/Control.cs b/src/Avalonia.Controls/Control.cs index f3705c9127..7434bd6cc1 100644 --- a/src/Avalonia.Controls/Control.cs +++ b/src/Avalonia.Controls/Control.cs @@ -773,11 +773,9 @@ namespace Avalonia.Controls { while (e != null) { - var root = e as IStyleRoot; - - if (root != null && root.StylingParent == null) + if (e is IRenderRoot root) { - return root; + return root as IStyleRoot; } e = e.StylingParent; diff --git a/tests/Avalonia.Controls.UnitTests/ControlTests.cs b/tests/Avalonia.Controls.UnitTests/ControlTests.cs index 605406518d..b7e2cbeca9 100644 --- a/tests/Avalonia.Controls.UnitTests/ControlTests.cs +++ b/tests/Avalonia.Controls.UnitTests/ControlTests.cs @@ -123,7 +123,26 @@ namespace Avalonia.Controls.UnitTests } [Fact] - public void DetachedToLogicalParent_Should_Be_Called_When_Removed_From_Tree() + public void AttachedToLogicalParent_Should_Not_Be_Called_With_GlobalStyles_As_Root() + { + var globalStyles = Mock.Of(); + var root = new TestRoot { StylingParent = globalStyles }; + var child = new Border(); + var raised = false; + + child.AttachedToLogicalTree += (s, e) => + { + Assert.Equal(root, e.Root); + raised = true; + }; + + root.Child = child; + + Assert.True(raised); + } + + [Fact] + public void DetachedFromLogicalParent_Should_Be_Called_When_Removed_From_Tree() { var root = new TestRoot(); var parent = new Border(); @@ -148,6 +167,26 @@ namespace Avalonia.Controls.UnitTests Assert.True(grandchildRaised); } + [Fact] + public void DetachedFromLogicalParent_Should_Not_Be_Called_With_GlobalStyles_As_Root() + { + var globalStyles = Mock.Of(); + var root = new TestRoot { StylingParent = globalStyles }; + var child = new Border(); + var raised = false; + + child.DetachedFromLogicalTree += (s, e) => + { + Assert.Equal(root, e.Root); + raised = true; + }; + + root.Child = child; + root.Child = null; + + Assert.True(raised); + } + [Fact] public void Adding_Tree_To_IStyleRoot_Should_Style_Controls() { diff --git a/tests/Avalonia.Controls.UnitTests/Presenters/ContentPresenterTests_Standalone.cs b/tests/Avalonia.Controls.UnitTests/Presenters/ContentPresenterTests_Standalone.cs index 032928d673..027e162877 100644 --- a/tests/Avalonia.Controls.UnitTests/Presenters/ContentPresenterTests_Standalone.cs +++ b/tests/Avalonia.Controls.UnitTests/Presenters/ContentPresenterTests_Standalone.cs @@ -12,6 +12,7 @@ using Moq; using System; using System.Linq; using Xunit; +using Avalonia.Rendering; namespace Avalonia.Controls.UnitTests.Presenters { @@ -56,6 +57,7 @@ namespace Avalonia.Controls.UnitTests.Presenters var parentMock = new Mock(); parentMock.As(); + parentMock.As(); parentMock.As(); (target as ISetLogicalParent).SetParent(parentMock.Object); @@ -100,6 +102,7 @@ namespace Avalonia.Controls.UnitTests.Presenters }; var parentMock = new Mock(); + parentMock.As(); parentMock.As(); parentMock.As().SetupGet(l => l.IsAttachedToLogicalTree).Returns(true); @@ -144,6 +147,7 @@ namespace Avalonia.Controls.UnitTests.Presenters var parentMock = new Mock(); parentMock.As(); + parentMock.As(); parentMock.As(); (target as ISetLogicalParent).SetParent(parentMock.Object); From d1eb0512bbffdec59b7c4664311693f057f29912 Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Thu, 12 Oct 2017 14:23:45 +0200 Subject: [PATCH 23/69] Added failing test for #1171. --- .../Rendering/SceneGraph/SceneBuilderTests.cs | 54 +++++++++++++++++-- 1 file changed, 51 insertions(+), 3 deletions(-) diff --git a/tests/Avalonia.Visuals.UnitTests/Rendering/SceneGraph/SceneBuilderTests.cs b/tests/Avalonia.Visuals.UnitTests/Rendering/SceneGraph/SceneBuilderTests.cs index c51e8941a9..d0f7671956 100644 --- a/tests/Avalonia.Visuals.UnitTests/Rendering/SceneGraph/SceneBuilderTests.cs +++ b/tests/Avalonia.Visuals.UnitTests/Rendering/SceneGraph/SceneBuilderTests.cs @@ -143,13 +143,61 @@ namespace Avalonia.Visuals.UnitTests.Rendering.SceneGraph var borderNode = scene.FindNode(border); Assert.Equal(new Rect(50, 50, 50, 50), borderNode.ClipBounds); + } + } + + [Fact] + public void Should_Update_Descendent_ClipBounds_When_Margin_Changed() + { + using (UnitTestApplication.Start(TestServices.MockPlatformRenderInterface)) + { + Border border; + Canvas canvas; + var tree = new TestRoot + { + Width = 200, + Height = 300, + Child = canvas = new Canvas + { + ClipToBounds = true, + Width = 100, + Height = 100, + HorizontalAlignment = HorizontalAlignment.Left, + VerticalAlignment = VerticalAlignment.Top, + Children = + { + (border = new Border + { + Background = Brushes.AliceBlue, + Width = 100, + Height = 100, + [Canvas.LeftProperty] = 50, + [Canvas.TopProperty] = 50, + }) + } + } + }; + + tree.Measure(Size.Infinity); + tree.Arrange(new Rect(tree.DesiredSize)); - // Initial ClipBounds are correct, make sure they're still correct after updating border. + var scene = new Scene(tree); + var sceneBuilder = new SceneBuilder(); + sceneBuilder.UpdateAll(scene); + + var borderNode = scene.FindNode(border); + Assert.Equal(new Rect(50, 50, 50, 50), borderNode.ClipBounds); + + canvas.Width = canvas.Height = 125; + canvas.Measure(Size.Infinity); + canvas.Arrange(new Rect(tree.DesiredSize)); + + // Initial ClipBounds are correct, make sure they're still correct after updating canvas. scene = scene.Clone(); - Assert.True(sceneBuilder.Update(scene, border)); + Assert.True(sceneBuilder.Update(scene, canvas)); borderNode = scene.FindNode(border); - Assert.Equal(new Rect(50, 50, 50, 50), borderNode.ClipBounds); + Assert.Equal(new Rect(50, 50, 75, 75), borderNode.ClipBounds); } } From dc7740554ecda45c444ffd8807e30108d941f94e Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Thu, 12 Oct 2017 14:24:41 +0200 Subject: [PATCH 24/69] Propagate ClipBounds to child nodes. When a scenegraph node's ClipBounds changes, ensure that that change is propagated to child nodes. Fixes #1171 --- src/Avalonia.Visuals/Rendering/SceneGraph/SceneBuilder.cs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/Avalonia.Visuals/Rendering/SceneGraph/SceneBuilder.cs b/src/Avalonia.Visuals/Rendering/SceneGraph/SceneBuilder.cs index 10455eb147..90ef78de37 100644 --- a/src/Avalonia.Visuals/Rendering/SceneGraph/SceneBuilder.cs +++ b/src/Avalonia.Visuals/Rendering/SceneGraph/SceneBuilder.cs @@ -168,11 +168,14 @@ namespace Avalonia.Rendering.SceneGraph using (context.PushTransformContainer()) { var startLayer = opacity < 1 || visual.OpacityMask != null; + var clipBounds = bounds.TransformToAABB(contextImpl.Transform).Intersect(clip); - forceRecurse = forceRecurse || node.Transform != contextImpl.Transform; + forceRecurse = forceRecurse || + node.Transform != contextImpl.Transform || + node.ClipBounds != clipBounds; node.Transform = contextImpl.Transform; - node.ClipBounds = bounds.TransformToAABB(node.Transform).Intersect(clip); + node.ClipBounds = clipBounds; node.ClipToBounds = clipToBounds; node.GeometryClip = visual.Clip?.PlatformImpl; node.Opacity = opacity; From 763775fa824cc6263e9c397447651db9aec5e761 Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Thu, 12 Oct 2017 23:26:31 +0200 Subject: [PATCH 25/69] Clear mouse capture when control removed. When a captured control is removed from the visual tree, clear the mouse capture. Note that our capture logic needs to be improved - it shouldn't be possible to capture a non-visible or non-enabled control. This doesn't address that but it does fix the crash in #1203. Fixes #1203 --- src/Avalonia.Input/MouseDevice.cs | 22 +++++++++++++++++-- .../MouseDeviceTests.cs | 19 +++++++++++++++- 2 files changed, 38 insertions(+), 3 deletions(-) diff --git a/src/Avalonia.Input/MouseDevice.cs b/src/Avalonia.Input/MouseDevice.cs index 875a5ebaee..50cdb5945c 100644 --- a/src/Avalonia.Input/MouseDevice.cs +++ b/src/Avalonia.Input/MouseDevice.cs @@ -20,6 +20,8 @@ namespace Avalonia.Input private int _clickCount; private Rect _lastClickRect; private uint _lastClickTime; + private IInputElement _captured; + private IDisposable _capturedSubscription; /// /// Gets the control that is currently capturing by the mouse, if any. @@ -31,8 +33,23 @@ namespace Avalonia.Input /// public IInputElement Captured { - get; - protected set; + get => _captured; + protected set + { + _capturedSubscription?.Dispose(); + _capturedSubscription = null; + + if (value != null) + { + _capturedSubscription = Observable.FromEventPattern( + x => value.DetachedFromVisualTree += x, + x => value.DetachedFromVisualTree -= x) + .Take(1) + .Subscribe(_ => Captured = null); + } + + _captured = value; + } } /// @@ -55,6 +72,7 @@ namespace Avalonia.Input /// public virtual void Capture(IInputElement control) { + // TODO: Check visibility and enabled state before setting capture. Captured = control; } diff --git a/tests/Avalonia.Input.UnitTests/MouseDeviceTests.cs b/tests/Avalonia.Input.UnitTests/MouseDeviceTests.cs index 4a834fd55d..6aca69b88f 100644 --- a/tests/Avalonia.Input.UnitTests/MouseDeviceTests.cs +++ b/tests/Avalonia.Input.UnitTests/MouseDeviceTests.cs @@ -1,6 +1,5 @@ using Avalonia.Controls; using Avalonia.Input.Raw; -using Avalonia.Layout; using Avalonia.Rendering; using Avalonia.UnitTests; using Avalonia.VisualTree; @@ -12,6 +11,24 @@ namespace Avalonia.Input.UnitTests { public class MouseDeviceTests { + [Fact] + public void Capture_Is_Cleared_When_Control_Removed() + { + Canvas control; + var root = new TestRoot + { + Child = control = new Canvas(), + }; + var target = new MouseDevice(); + + target.Capture(control); + Assert.Same(control, target.Captured); + + root.Child = null; + + Assert.Null(target.Captured); + } + [Fact] public void MouseMove_Should_Update_PointerOver() { From a0f4d3fb051897d521f76241d8428a62317c9548 Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Thu, 12 Oct 2017 23:27:25 +0200 Subject: [PATCH 26/69] Ignore Avalonia.Designer.HostApp in ncrunch. --- .ncrunch/Avalonia.Designer.HostApp.v3.ncrunchproject | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .ncrunch/Avalonia.Designer.HostApp.v3.ncrunchproject diff --git a/.ncrunch/Avalonia.Designer.HostApp.v3.ncrunchproject b/.ncrunch/Avalonia.Designer.HostApp.v3.ncrunchproject new file mode 100644 index 0000000000..319cd523ce --- /dev/null +++ b/.ncrunch/Avalonia.Designer.HostApp.v3.ncrunchproject @@ -0,0 +1,5 @@ + + + True + + \ No newline at end of file From 8c3a19bb9a97eef2aedea57ede2828f5587b15f5 Mon Sep 17 00:00:00 2001 From: Jeremy Koritzinsky Date: Thu, 12 Oct 2017 23:36:31 -0500 Subject: [PATCH 27/69] Upgrade XUnit. (Fixes VS Test Explorer integration for the solution) --- build/XUnit.props | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/build/XUnit.props b/build/XUnit.props index 42fe9b6d7a..1d7da7257d 100644 --- a/build/XUnit.props +++ b/build/XUnit.props @@ -1,14 +1,14 @@  - + - - - - - - - + + + + + + + From 54e8187a70daaf2851d442279ddc14aa030fb62f Mon Sep 17 00:00:00 2001 From: Jeremy Koritzinsky Date: Thu, 12 Oct 2017 23:37:37 -0500 Subject: [PATCH 28/69] Fix StackOverflow in Negation Binding. Fixes #1213 --- .../Data/ExpressionObserver.cs | 19 +++++++++++++++++- .../Avalonia.Markup/Data/ITransformNode.cs | 11 ++++++++++ .../Avalonia.Markup/Data/LogicalNotNode.cs | 13 +++++++++++- .../Data/ExpressionObserverTests_Negation.cs | 20 ++++++++++++++++++- 4 files changed, 60 insertions(+), 3 deletions(-) create mode 100644 src/Markup/Avalonia.Markup/Data/ITransformNode.cs diff --git a/src/Markup/Avalonia.Markup/Data/ExpressionObserver.cs b/src/Markup/Avalonia.Markup/Data/ExpressionObserver.cs index 66d3beb907..dd9718a0f6 100644 --- a/src/Markup/Avalonia.Markup/Data/ExpressionObserver.cs +++ b/src/Markup/Avalonia.Markup/Data/ExpressionObserver.cs @@ -154,7 +154,24 @@ namespace Avalonia.Markup.Data /// public bool SetValue(object value, BindingPriority priority = BindingPriority.LocalValue) { - return (Leaf as ISettableNode)?.SetTargetValue(value, priority) ?? false; + if (Leaf is ISettableNode settable) + { + var node = _node; + while (node != null) + { + if (node is ITransformNode transform) + { + value = transform.Transform(value); + if (value is BindingNotification) + { + return false; + } + } + node = node.Next; + } + return settable.SetTargetValue(value, priority); + } + return false; } /// diff --git a/src/Markup/Avalonia.Markup/Data/ITransformNode.cs b/src/Markup/Avalonia.Markup/Data/ITransformNode.cs new file mode 100644 index 0000000000..f33ecd3722 --- /dev/null +++ b/src/Markup/Avalonia.Markup/Data/ITransformNode.cs @@ -0,0 +1,11 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace Avalonia.Markup.Data +{ + interface ITransformNode + { + object Transform(object value); + } +} diff --git a/src/Markup/Avalonia.Markup/Data/LogicalNotNode.cs b/src/Markup/Avalonia.Markup/Data/LogicalNotNode.cs index 58a7915254..ae68867e82 100644 --- a/src/Markup/Avalonia.Markup/Data/LogicalNotNode.cs +++ b/src/Markup/Avalonia.Markup/Data/LogicalNotNode.cs @@ -7,7 +7,7 @@ using Avalonia.Data; namespace Avalonia.Markup.Data { - internal class LogicalNotNode : ExpressionNode + internal class LogicalNotNode : ExpressionNode, ITransformNode { public override string Description => "!"; @@ -61,5 +61,16 @@ namespace Avalonia.Markup.Data return AvaloniaProperty.UnsetValue; } + + public object Transform(object value) + { + var originalType = value.GetType(); + var negated = Negate(value); + if (negated is BindingNotification) + { + return negated; + } + return Convert.ChangeType(negated, originalType); + } } } diff --git a/tests/Avalonia.Markup.UnitTests/Data/ExpressionObserverTests_Negation.cs b/tests/Avalonia.Markup.UnitTests/Data/ExpressionObserverTests_Negation.cs index d8dc2de847..6a23a24051 100644 --- a/tests/Avalonia.Markup.UnitTests/Data/ExpressionObserverTests_Negation.cs +++ b/tests/Avalonia.Markup.UnitTests/Data/ExpressionObserverTests_Negation.cs @@ -105,14 +105,32 @@ namespace Avalonia.Markup.UnitTests.Data } [Fact] - public void SetValue_Should_Return_False() + public void SetValue_Should_Return_False_For_Invalid_Value() { var data = new { Foo = "foo" }; var target = new ExpressionObserver(data, "!Foo"); + target.Subscribe(_ => { }); Assert.False(target.SetValue("bar")); GC.KeepAlive(data); } + + [Fact] + public void Can_SetValue_For_Valid_Value() + { + var data = new Test { Foo = true }; + var target = new ExpressionObserver(data, "!Foo"); + target.Subscribe(_ => { }); + + Assert.True(target.SetValue(true)); + + Assert.False(data.Foo); + } + + private class Test + { + public bool Foo { get; set; } + } } } From 3402456284313264e31cf8485b3c762ff6b3d28a Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Fri, 13 Oct 2017 14:38:48 +0200 Subject: [PATCH 29/69] Always raise logical tree attach/detach events. Previously, if the user overrode `OnAttachedToLogicalTree` or `OnDetachedFromLogicalTree` and forgot to call the base implementation, the events wouldn't be raised. It's very important that these events get raised so moved the code to raise them to `OnAttachedToLogicalTreeCore`/`OnDetachedFromLogicalTreeCore`. --- src/Avalonia.Controls/Control.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Avalonia.Controls/Control.cs b/src/Avalonia.Controls/Control.cs index f3705c9127..050315af7c 100644 --- a/src/Avalonia.Controls/Control.cs +++ b/src/Avalonia.Controls/Control.cs @@ -656,7 +656,6 @@ namespace Avalonia.Controls /// The event args. protected virtual void OnAttachedToLogicalTree(LogicalTreeAttachmentEventArgs e) { - AttachedToLogicalTree?.Invoke(this, e); } /// @@ -665,7 +664,6 @@ namespace Avalonia.Controls /// The event args. protected virtual void OnDetachedFromLogicalTree(LogicalTreeAttachmentEventArgs e) { - DetachedFromLogicalTree?.Invoke(this, e); } /// @@ -844,6 +842,7 @@ namespace Avalonia.Controls InitializeStylesIfNeeded(true); OnAttachedToLogicalTree(e); + AttachedToLogicalTree?.Invoke(this, e); } foreach (var child in LogicalChildren.OfType()) @@ -864,6 +863,7 @@ namespace Avalonia.Controls _isAttachedToLogicalTree = false; _styleDetach.OnNext(this); OnDetachedFromLogicalTree(e); + DetachedFromLogicalTree?.Invoke(this, e); foreach (var child in LogicalChildren.OfType()) { From 2c61d17bc3efc967716f4620dcb4dae9189b17d0 Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Fri, 13 Oct 2017 15:45:25 +0200 Subject: [PATCH 30/69] Always raise visual tree attach/detach events. Previously, if the user overrode `OnAttachedToVisualTree` or `OnDetachedFromVisualTree` and forgot to call the base implementation, the events wouldn't be raised. It's very important that these events get raised so moved the code to raise them to `OnAttachedToVisualTreeCore`/`OnDetachedFromVisualTreeCore`. --- src/Avalonia.Visuals/Visual.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Avalonia.Visuals/Visual.cs b/src/Avalonia.Visuals/Visual.cs index cfe6bce7e0..bc65d4f69f 100644 --- a/src/Avalonia.Visuals/Visual.cs +++ b/src/Avalonia.Visuals/Visual.cs @@ -329,6 +329,7 @@ namespace Avalonia } OnAttachedToVisualTree(e); + AttachedToVisualTree?.Invoke(this, e); InvalidateVisual(); if (VisualChildren != null) @@ -357,6 +358,7 @@ namespace Avalonia } OnDetachedFromVisualTree(e); + DetachedFromVisualTree?.Invoke(this, e); e.Root?.Renderer?.AddDirty(this); if (VisualChildren != null) @@ -374,7 +376,6 @@ namespace Avalonia /// The event args. protected virtual void OnAttachedToVisualTree(VisualTreeAttachmentEventArgs e) { - AttachedToVisualTree?.Invoke(this, e); } /// @@ -383,7 +384,6 @@ namespace Avalonia /// The event args. protected virtual void OnDetachedFromVisualTree(VisualTreeAttachmentEventArgs e) { - DetachedFromVisualTree?.Invoke(this, e); } /// From fbba93f4218feb983252602e51ca2dd919af12f2 Mon Sep 17 00:00:00 2001 From: Dan Walmsley Date: Fri, 13 Oct 2017 17:11:33 +0100 Subject: [PATCH 31/69] update replace scripts. --- scripts/ReplaceNugetCache.ps1 | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/scripts/ReplaceNugetCache.ps1 b/scripts/ReplaceNugetCache.ps1 index 5f678bedef..4ad31db274 100644 --- a/scripts/ReplaceNugetCache.ps1 +++ b/scripts/ReplaceNugetCache.ps1 @@ -1,5 +1,4 @@ -copy ..\samples\ControlCatalog.NetCore\bin\Debug\netcoreapp1.1\Avalonia**.dll ~\.nuget\packages\avalonia\$args\lib\netcoreapp1.0\ -copy ..\samples\ControlCatalog.NetCore.\bin\Debug\netcoreapp1.1\Avalonia**.dll ~\.nuget\packages\avalonia\$args\lib\netstandard1.3\ -copy ..\samples\ControlCatalog.NetCore.\bin\Debug\netcoreapp1.1\Avalonia**.dll ~\.nuget\packages\avalonia.gtk3\$args\lib\netstandard1.3\ -copy ..\samples\ControlCatalog.NetCore.\bin\Debug\netcoreapp1.1\Avalonia**.dll ~\.nuget\packages\avalonia.skia.desktop\$args\lib\netstandard1.3\ -copy ..\samples\ControlCatalog.NetCore.\bin\Debug\netcoreapp1.1\Avalonia**.dll ~\.nuget\packages\avalonia.win32\$args\lib\netstandard1.3\ +copy ..\samples\ControlCatalog.NetCore\bin\Debug\netcoreapp2.0\Avalonia**.dll ~\.nuget\packages\avalonia\$args\lib\netcoreapp2.0\ +copy ..\samples\ControlCatalog.NetCore.\bin\Debug\netcoreapp2.0\Avalonia**.dll ~\.nuget\packages\avalonia\$args\lib\netstandard2.0\ +copy ..\samples\ControlCatalog.NetCore.\bin\Debug\netcoreapp2.0\Avalonia**.dll ~\.nuget\packages\avalonia.gtk3\$args\lib\netstandard2.0\ +copy ..\samples\ControlCatalog.NetCore.\bin\Debug\netcoreapp2.0\Avalonia**.dll ~\.nuget\packages\avalonia.win32\$args\lib\netstandard2.0\ From 3cb888f4303609ec1a8ad319edaa0bda9be635a1 Mon Sep 17 00:00:00 2001 From: Artjom Date: Fri, 13 Oct 2017 19:48:11 +0300 Subject: [PATCH 32/69] Update readme.md --- readme.md | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/readme.md b/readme.md index d7e90a4a44..28cb638a7c 100644 --- a/readme.md +++ b/readme.md @@ -1,30 +1,31 @@ + + # Avalonia | Gitter Chat | Windows Build Status | Linux/Mac Build Status | |---|---|---| | [![Gitter](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/AvaloniaUI/Avalonia?utm_campaign=pr-badge&utm_content=badge&utm_medium=badge&utm_source=badge) | [![Build status](https://ci.appveyor.com/api/projects/status/hubk3k0w9idyibfg/branch/master?svg=true)](https://ci.appveyor.com/project/AvaloniaUI/Avalonia/branch/master) | [![Build Status](https://travis-ci.org/AvaloniaUI/Avalonia.svg?branch=master)](https://travis-ci.org/AvaloniaUI/Avalonia) | -A multi-platform .NET UI framework. It runs on Windows, Linux, Mac OS X, iOS and Android. +## About + +Avalonia is a WPF-inspired cross-platform XAML-based UI framework providing a flexible styling system and supporting a wide range of OSs: Windows (.NET Framework, .NET Core), Linux (GTK), MacOS, Android and iOS. + +Avalonia is now in alpha. This means that framework is now at a stage where you can have a play and hopefully create simple applications. There's still a lot missing, and you *will* find bugs, and the API *will* change, but this represents the first time where we've made it somewhat easy to have a play and experiment with the framework. | Control catalog | Desktop platforms | Mobile platforms | |---|---|---| | | | | -## About - -Avalonia is a WPF-inspired cross-platform XAML-based UI framework providing a flexible styling system and supporting a wide range of OSs: Windows (.NET Framework, .NET Core), Android, Linux (GTK), MacOS and iOS. - -Avalonia is now in alpha. What does "alpha" mean? Well, it means that it's now at a stage where you can have a play and hopefully create simple applications. There's still a lot missing, and you *will* find bugs, and the API *will* change, but this represents the first time where we've made it somewhat easy to have a play and experiment with the framework. - ## Getting Started -Avalonia [Visual Studio Extension](https://marketplace.visualstudio.com/items?itemName=AvaloniaTeam.AvaloniaforVisualStudio) contains project and control templates that will help you get started. After installing it, open "New Project" dialog in Visual Studio, choose "Avalonia" in "Visual C#" section and press OK (screenshot). Now you can write code and markup that will work on multiple platforms! +Avalonia [Visual Studio Extension](https://marketplace.visualstudio.com/items?itemName=AvaloniaTeam.AvaloniaforVisualStudio) contains project and control templates that will help you get started. After installing it, open "New Project" dialog in Visual Studio, choose "Avalonia" in "Visual C#" section, select "Avalonia .NET Core Application" and press OK (screenshot). Now you can write code and markup that will work on multiple platforms! -Avalonia is also delivered as a NuGet package. You can find the packages here: ([stable(ish)](https://www.nuget.org/packages/Avalonia/), [nightly](https://github.com/AvaloniaUI/Avalonia/wiki/Using-nightly-build-feed)) +Avalonia is delivered via NuGet package manager. You can find the packages here: ([stable(ish)](https://www.nuget.org/packages/Avalonia/), [nightly](https://github.com/AvaloniaUI/Avalonia/wiki/Using-nightly-build-feed)) -Use this command in Package Manager console to install the package: +Use these commands in Package Manager console to install Avalonia manually: ``` -Install-Package Avalonia -Pre +Install-Package Avalonia +Install-Package Avalonia.Desktop ``` ## Bleeding Edge Builds From aa2980b8c833f50b2b895a93802d7b3b256d4af3 Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Fri, 13 Oct 2017 19:10:09 +0200 Subject: [PATCH 33/69] Don't return detached controls in HitTest. If a control has been detached from the visual tree but the scene hasn't yet been updated, don't return the control as part of a hit-test. --- src/Avalonia.Visuals/Rendering/SceneGraph/Scene.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Avalonia.Visuals/Rendering/SceneGraph/Scene.cs b/src/Avalonia.Visuals/Rendering/SceneGraph/Scene.cs index a85fd36763..a4af106a73 100644 --- a/src/Avalonia.Visuals/Rendering/SceneGraph/Scene.cs +++ b/src/Avalonia.Visuals/Rendering/SceneGraph/Scene.cs @@ -173,7 +173,7 @@ namespace Avalonia.Rendering.SceneGraph } } - if (node.HitTest(p)) + if (node.HitTest(p) && node.Visual.IsAttachedToVisualTree) { yield return node.Visual; } From 30a31006cc19ab7b102aeaeb410cf47d5e9a66b1 Mon Sep 17 00:00:00 2001 From: Unknown Date: Fri, 13 Oct 2017 19:52:33 +0100 Subject: [PATCH 34/69] update linux and release replace scripts. --- scripts/ReplaceNugetCache.sh | 7 +++---- scripts/ReplaceNugetCacheRelease.ps1 | 9 ++++----- 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/scripts/ReplaceNugetCache.sh b/scripts/ReplaceNugetCache.sh index 2ce3e7648d..636aec5f23 100755 --- a/scripts/ReplaceNugetCache.sh +++ b/scripts/ReplaceNugetCache.sh @@ -1,7 +1,6 @@ #!/usr/bin/env bash - cp ../samples/ControlCatalog.NetCore/bin/Debug/netcoreapp1.1/Avalonia**.dll ~/.nuget/packages/avalonia/$1/lib/netcoreapp1.0/ - cp ../samples/ControlCatalog.NetCore/bin/Debug/netcoreapp1.1/Avalonia**.dll ~/.nuget/packages/avalonia/$1/lib/netstandard1.1/ - cp ../samples/ControlCatalog.NetCore/bin/Debug/netcoreapp1.1/Avalonia**.dll ~/.nuget/packages/avalonia.gtk3/$1/lib/netstandard1.1/ - cp ../samples/ControlCatalog.NetCore/bin/Debug/netcoreapp1.1/Avalonia**.dll ~/.nuget/packages/avalonia.skia.desktop/$1/lib/netstandard1.3/ + cp ../samples/ControlCatalog.NetCore/bin/Debug/netcoreapp2.0/Avalonia**.dll ~/.nuget/packages/avalonia/$1/lib/netcoreapp2.0/ + cp ../samples/ControlCatalog.NetCore/bin/Debug/netcoreapp2.0/Avalonia**.dll ~/.nuget/packages/avalonia/$1/lib/netstandard2.0/ + cp ../samples/ControlCatalog.NetCore/bin/Debug/netcoreapp2.0/Avalonia**.dll ~/.nuget/packages/avalonia.gtk3/$1/lib/netstandard2.0/ diff --git a/scripts/ReplaceNugetCacheRelease.ps1 b/scripts/ReplaceNugetCacheRelease.ps1 index f3c1a0a975..f188c81c51 100644 --- a/scripts/ReplaceNugetCacheRelease.ps1 +++ b/scripts/ReplaceNugetCacheRelease.ps1 @@ -1,5 +1,4 @@ -copy ..\samples\ControlCatalog.NetCore\bin\Release\netcoreapp1.1\Avalonia**.dll ~\.nuget\packages\avalonia\$args\lib\netcoreapp1.0\ -copy ..\samples\ControlCatalog.NetCore.\bin\Release\netcoreapp1.1\Avalonia**.dll ~\.nuget\packages\avalonia\$args\lib\netstandard1.3\ -copy ..\samples\ControlCatalog.NetCore.\bin\Release\netcoreapp1.1\Avalonia**.dll ~\.nuget\packages\avalonia.gtk3\$args\lib\netstandard1.3\ -copy ..\samples\ControlCatalog.NetCore.\bin\Release\netcoreapp1.1\Avalonia**.dll ~\.nuget\packages\avalonia.skia.desktop\$args\lib\netstandard1.3\ -copy ..\samples\ControlCatalog.NetCore.\bin\Release\netcoreapp1.1\Avalonia**.dll ~\.nuget\packages\avalonia.win32\$args\lib\netstandard1.3\ +copy ..\samples\ControlCatalog.NetCore\bin\Release\netcoreapp2.0\Avalonia**.dll ~\.nuget\packages\avalonia\$args\lib\netcoreapp2.0\ +copy ..\samples\ControlCatalog.NetCore.\bin\Release\netcoreapp2.0\Avalonia**.dll ~\.nuget\packages\avalonia\$args\lib\netstandard2.0\ +copy ..\samples\ControlCatalog.NetCore.\bin\Release\netcoreapp2.0\Avalonia**.dll ~\.nuget\packages\avalonia.gtk3\$args\lib\netstandard2.0\ +copy ..\samples\ControlCatalog.NetCore.\bin\Release\netcoreapp2.0\Avalonia**.dll ~\.nuget\packages\avalonia.win32\$args\lib\netstandard2.0\ \ No newline at end of file From 83b21aab08167e474909951660441b2164f6350b Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Sat, 14 Oct 2017 11:15:11 +0200 Subject: [PATCH 35/69] Disable osx builds They're failing and not that useful anyway. --- .travis.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 52a400d19a..ea09278cdd 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,7 +1,6 @@ language: csharp os: - linux - - osx dist: trusty osx_image: xcode8.3 env: From 268587c4320c43b9eb861a88119ab2e6ba4d8f9f Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Sat, 14 Oct 2017 11:31:47 +0200 Subject: [PATCH 36/69] Fix DropDown popup opening. When the `DropDown` control is clicked, toggle the opening of the popup. Fixes #1169. --- src/Avalonia.Controls/DropDown.cs | 20 +++++++------- .../DropDownTests.cs | 26 +++++++++++++++++-- 2 files changed, 34 insertions(+), 12 deletions(-) diff --git a/src/Avalonia.Controls/DropDown.cs b/src/Avalonia.Controls/DropDown.cs index 5349fb1ca7..fa2e0c1e16 100644 --- a/src/Avalonia.Controls/DropDown.cs +++ b/src/Avalonia.Controls/DropDown.cs @@ -120,21 +120,21 @@ namespace Avalonia.Controls /// protected override void OnPointerPressed(PointerPressedEventArgs e) { - if (!IsDropDownOpen && ((IVisual)e.Source).GetVisualRoot() is PopupRoot) - { - IsDropDownOpen = true; - e.Handled = true; - } - if (!e.Handled) { - if (UpdateSelectionFromEventSource(e.Source)) + if (((IVisual)e.Source).GetVisualRoot() is PopupRoot) { - _popup?.Close(); - e.Handled = true; + if (UpdateSelectionFromEventSource(e.Source)) + { + _popup?.Close(); + e.Handled = true; + } + } + else + { + IsDropDownOpen = !IsDropDownOpen; } } - base.OnPointerPressed(e); } diff --git a/tests/Avalonia.Controls.UnitTests/DropDownTests.cs b/tests/Avalonia.Controls.UnitTests/DropDownTests.cs index 30cca90b4a..b5de8c67fa 100644 --- a/tests/Avalonia.Controls.UnitTests/DropDownTests.cs +++ b/tests/Avalonia.Controls.UnitTests/DropDownTests.cs @@ -1,21 +1,43 @@ // Copyright (c) The Avalonia Project. All rights reserved. // Licensed under the MIT license. See licence.md file in the project root for full license information. -using System.Linq; using Avalonia.Controls.Presenters; using Avalonia.Controls.Primitives; using Avalonia.Controls.Shapes; using Avalonia.Controls.Templates; +using Avalonia.Input; using Avalonia.LogicalTree; using Avalonia.Media; using Avalonia.UnitTests; -using Avalonia.VisualTree; using Xunit; namespace Avalonia.Controls.UnitTests { public class DropDownTests { + [Fact] + public void Clicking_On_Control_Toggles_IsDropDownOpen() + { + var target = new DropDown + { + Items = new[] { "Foo", "Bar" }, + }; + + target.RaiseEvent(new PointerPressedEventArgs + { + RoutedEvent = InputElement.PointerPressedEvent, + }); + + Assert.True(target.IsDropDownOpen); + + target.RaiseEvent(new PointerPressedEventArgs + { + RoutedEvent = InputElement.PointerPressedEvent, + }); + + Assert.False(target.IsDropDownOpen); + } + [Fact] public void SelectionBoxItem_Is_Rectangle_With_VisualBrush_When_Selection_Is_Control() { From 33b57118cfe3750ccdd52689cd945ec944114bd9 Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Sat, 14 Oct 2017 16:09:25 +0200 Subject: [PATCH 37/69] Bind TextPresenter.Text before CaretIndex. Otherwise if `TextBox.CaretIndex` is set before the `TextBox`'s template is applied then it will be coerced to null on the `TextPresenter` when created as `Text` will still be null at this point. --- src/Avalonia.Themes.Default/TextBox.xaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Avalonia.Themes.Default/TextBox.xaml b/src/Avalonia.Themes.Default/TextBox.xaml index 8acc97d663..87d8c22663 100644 --- a/src/Avalonia.Themes.Default/TextBox.xaml +++ b/src/Avalonia.Themes.Default/TextBox.xaml @@ -46,10 +46,10 @@ Text="{TemplateBinding Watermark}" IsVisible="{TemplateBinding Path=Text, Converter={Static StringConverters.NullOrEmpty}}"/> From e3d34f2eb8519da32ab2bbd8ae2703b4b9076d7e Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Sat, 14 Oct 2017 17:01:26 +0200 Subject: [PATCH 38/69] Added a failing test for #1221 --- .../VisualExtensions_GetVisualsAt.cs | 103 ++++++++++++++++++ 1 file changed, 103 insertions(+) create mode 100644 tests/Avalonia.Visuals.UnitTests/VisualTree/VisualExtensions_GetVisualsAt.cs diff --git a/tests/Avalonia.Visuals.UnitTests/VisualTree/VisualExtensions_GetVisualsAt.cs b/tests/Avalonia.Visuals.UnitTests/VisualTree/VisualExtensions_GetVisualsAt.cs new file mode 100644 index 0000000000..867d4d7450 --- /dev/null +++ b/tests/Avalonia.Visuals.UnitTests/VisualTree/VisualExtensions_GetVisualsAt.cs @@ -0,0 +1,103 @@ +using System; +using System.Linq; +using Avalonia.Controls; +using Avalonia.Media; +using Avalonia.Rendering; +using Avalonia.UnitTests; +using Avalonia.VisualTree; +using Xunit; + +namespace Avalonia.Visuals.UnitTests.VisualTree +{ + public class VisualExtensions_GetVisualsAt + { + [Fact] + public void Should_Find_Control() + { + using (TestApplication()) + { + Border target; + var root = new TestRoot + { + Width = 200, + Height = 200, + Child = new StackPanel + { + Background = Brushes.White, + Children = + { + (target = new Border + { + Width = 100, + Height = 200, + Background = Brushes.Red, + }), + new Border + { + Width = 100, + Height = 200, + Background = Brushes.Green, + } + }, + Orientation = Orientation.Horizontal, + } + }; + + root.Renderer = new DeferredRenderer(root, null); + root.Measure(Size.Infinity); + root.Arrange(new Rect(root.DesiredSize)); + + var result = target.GetVisualsAt(new Point(50, 50)); + + Assert.Same(target, result.Single()); + } + } + + [Fact] + public void Should_Not_Find_Sibling_Control() + { + using (TestApplication()) + { + Border target; + var root = new TestRoot + { + Width = 200, + Height = 200, + Child = new StackPanel + { + Background = Brushes.White, + Children = + { + (target = new Border + { + Width = 100, + Height = 200, + Background = Brushes.Red, + }), + new Border + { + Width = 100, + Height = 200, + Background = Brushes.Green, + } + }, + Orientation = Orientation.Horizontal, + } + }; + + root.Renderer = new DeferredRenderer(root, null); + root.Measure(Size.Infinity); + root.Arrange(new Rect(root.DesiredSize)); + + var result = target.GetVisualsAt(new Point(150, 50)); + + Assert.Empty(result); + } + } + + private IDisposable TestApplication() + { + return UnitTestApplication.Start(TestServices.MockPlatformRenderInterface); + } + } +} From 880cf657ec36f5a6abaa334297b601aaf71b870e Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Sat, 14 Oct 2017 17:46:49 +0200 Subject: [PATCH 39/69] Accept root in IRenderer.HitTest. Fixes #1221. --- .../Rendering/DeferredRenderer.cs | 4 +-- src/Avalonia.Visuals/Rendering/IRenderer.cs | 8 +++-- .../Rendering/ImmediateRenderer.cs | 4 +-- .../Rendering/SceneGraph/Scene.cs | 7 ++-- .../VisualTree/VisualExtensions.cs | 2 +- .../MouseDeviceTests.cs | 4 +-- tests/Avalonia.LeakTests/ControlTests.cs | 2 +- .../DeferredRendererTests_HitTesting.cs | 32 +++++++++---------- .../ImmediateRendererTests_HitTesting.cs | 22 ++++++------- 9 files changed, 46 insertions(+), 39 deletions(-) diff --git a/src/Avalonia.Visuals/Rendering/DeferredRenderer.cs b/src/Avalonia.Visuals/Rendering/DeferredRenderer.cs index 5434a35464..f7befa646a 100644 --- a/src/Avalonia.Visuals/Rendering/DeferredRenderer.cs +++ b/src/Avalonia.Visuals/Rendering/DeferredRenderer.cs @@ -106,7 +106,7 @@ namespace Avalonia.Rendering public void Dispose() => Stop(); /// - public IEnumerable HitTest(Point p, Func filter) + public IEnumerable HitTest(Point p, IVisual root, Func filter) { if (_renderLoop == null && (_dirty == null || _dirty.Count > 0)) { @@ -114,7 +114,7 @@ namespace Avalonia.Rendering UpdateScene(); } - return _scene?.HitTest(p, filter) ?? Enumerable.Empty(); + return _scene?.HitTest(p, root, filter) ?? Enumerable.Empty(); } /// diff --git a/src/Avalonia.Visuals/Rendering/IRenderer.cs b/src/Avalonia.Visuals/Rendering/IRenderer.cs index aa2413bdfb..9085e63aa9 100644 --- a/src/Avalonia.Visuals/Rendering/IRenderer.cs +++ b/src/Avalonia.Visuals/Rendering/IRenderer.cs @@ -33,9 +33,13 @@ namespace Avalonia.Rendering /// Hit tests a location to find the visuals at the specified point. /// /// The point, in client coordinates. - /// An optional filter. + /// The root of the subtree to search. + /// + /// A filter predicate. If the predicate returns false then the visual and all its + /// children will be excluded from the results. + /// /// The visuals at the specified point, topmost first. - IEnumerable HitTest(Point p, Func filter); + IEnumerable HitTest(Point p, IVisual root, Func filter); /// /// Called when a resize notification is received by the control being rendered. diff --git a/src/Avalonia.Visuals/Rendering/ImmediateRenderer.cs b/src/Avalonia.Visuals/Rendering/ImmediateRenderer.cs index 4ef2b30463..2d5a864089 100644 --- a/src/Avalonia.Visuals/Rendering/ImmediateRenderer.cs +++ b/src/Avalonia.Visuals/Rendering/ImmediateRenderer.cs @@ -136,9 +136,9 @@ namespace Avalonia.Rendering } /// - public IEnumerable HitTest(Point p, Func filter) + public IEnumerable HitTest(Point p, IVisual root, Func filter) { - return HitTest(_root, p, filter); + return HitTest(root, p, filter); } /// diff --git a/src/Avalonia.Visuals/Rendering/SceneGraph/Scene.cs b/src/Avalonia.Visuals/Rendering/SceneGraph/Scene.cs index a4af106a73..9216bae8ad 100644 --- a/src/Avalonia.Visuals/Rendering/SceneGraph/Scene.cs +++ b/src/Avalonia.Visuals/Rendering/SceneGraph/Scene.cs @@ -3,6 +3,7 @@ using System; using System.Collections.Generic; +using System.Linq; using Avalonia.VisualTree; namespace Avalonia.Rendering.SceneGraph @@ -113,11 +114,13 @@ namespace Avalonia.Rendering.SceneGraph /// Gets the visuals at a point in the scene. /// /// The point. + /// The root of the subtree to search. /// A filter. May be null. /// The visuals at the specified point. - public IEnumerable HitTest(Point p, Func filter) + public IEnumerable HitTest(Point p, IVisual root, Func filter) { - return HitTest(Root, p, null, filter); + var node = FindNode(root); + return (node != null) ? HitTest(node, p, null, filter) : Enumerable.Empty(); } /// diff --git a/src/Avalonia.Visuals/VisualTree/VisualExtensions.cs b/src/Avalonia.Visuals/VisualTree/VisualExtensions.cs index 4f4bf4b9fe..2d417852fe 100644 --- a/src/Avalonia.Visuals/VisualTree/VisualExtensions.cs +++ b/src/Avalonia.Visuals/VisualTree/VisualExtensions.cs @@ -133,7 +133,7 @@ namespace Avalonia.VisualTree var root = visual.GetVisualRoot(); p = visual.TranslatePoint(p, root); - return root.Renderer.HitTest(p, filter); + return root.Renderer.HitTest(p, visual, filter); } /// diff --git a/tests/Avalonia.Input.UnitTests/MouseDeviceTests.cs b/tests/Avalonia.Input.UnitTests/MouseDeviceTests.cs index 6aca69b88f..7764c47dbf 100644 --- a/tests/Avalonia.Input.UnitTests/MouseDeviceTests.cs +++ b/tests/Avalonia.Input.UnitTests/MouseDeviceTests.cs @@ -59,7 +59,7 @@ namespace Avalonia.Input.UnitTests } }; - renderer.Setup(x => x.HitTest(It.IsAny(), It.IsAny>())) + renderer.Setup(x => x.HitTest(It.IsAny(), It.IsAny(), It.IsAny>())) .Returns(new[] { decorator }); inputManager.ProcessInput(new RawMouseEventArgs( @@ -75,7 +75,7 @@ namespace Avalonia.Input.UnitTests Assert.False(canvas.IsPointerOver); Assert.True(root.IsPointerOver); - renderer.Setup(x => x.HitTest(It.IsAny(), It.IsAny>())) + renderer.Setup(x => x.HitTest(It.IsAny(), It.IsAny(), It.IsAny>())) .Returns(new[] { canvas }); inputManager.ProcessInput(new RawMouseEventArgs( diff --git a/tests/Avalonia.LeakTests/ControlTests.cs b/tests/Avalonia.LeakTests/ControlTests.cs index 12ac8d3af6..979127cd14 100644 --- a/tests/Avalonia.LeakTests/ControlTests.cs +++ b/tests/Avalonia.LeakTests/ControlTests.cs @@ -357,7 +357,7 @@ namespace Avalonia.LeakTests { } - public IEnumerable HitTest(Point p, Func filter) => null; + public IEnumerable HitTest(Point p, IVisual root, Func filter) => null; public void Paint(Rect rect) { diff --git a/tests/Avalonia.Visuals.UnitTests/Rendering/DeferredRendererTests_HitTesting.cs b/tests/Avalonia.Visuals.UnitTests/Rendering/DeferredRendererTests_HitTesting.cs index 1044c1f2a3..9e2f1fc293 100644 --- a/tests/Avalonia.Visuals.UnitTests/Rendering/DeferredRendererTests_HitTesting.cs +++ b/tests/Avalonia.Visuals.UnitTests/Rendering/DeferredRendererTests_HitTesting.cs @@ -42,7 +42,7 @@ namespace Avalonia.Visuals.UnitTests.Rendering root.Measure(Size.Infinity); root.Arrange(new Rect(root.DesiredSize)); - var result = root.Renderer.HitTest(new Point(100, 100), null); + var result = root.Renderer.HitTest(new Point(100, 100), root, null); Assert.Equal(new[] { root.Child }, result); } @@ -70,7 +70,7 @@ namespace Avalonia.Visuals.UnitTests.Rendering root.Measure(Size.Infinity); root.Arrange(new Rect(root.DesiredSize)); - var result = root.Renderer.HitTest(new Point(100, 100), null); + var result = root.Renderer.HitTest(new Point(100, 100), root, null); Assert.Empty(result); } @@ -107,7 +107,7 @@ namespace Avalonia.Visuals.UnitTests.Rendering root.Measure(Size.Infinity); root.Arrange(new Rect(root.DesiredSize)); - var result = root.Renderer.HitTest(new Point(100, 100), null); + var result = root.Renderer.HitTest(new Point(100, 100), root, null); Assert.Empty(result); } @@ -136,7 +136,7 @@ namespace Avalonia.Visuals.UnitTests.Rendering root.Measure(Size.Infinity); root.Arrange(new Rect(root.DesiredSize)); - var result = root.Renderer.HitTest(new Point(10, 10), null); + var result = root.Renderer.HitTest(new Point(10, 10), root, null); Assert.Empty(result); } @@ -180,7 +180,7 @@ namespace Avalonia.Visuals.UnitTests.Rendering root.Measure(Size.Infinity); root.Arrange(new Rect(container.DesiredSize)); - var result = root.Renderer.HitTest(new Point(100, 100), null); + var result = root.Renderer.HitTest(new Point(100, 100), root, null); Assert.Equal(new[] { container.Children[1], container.Children[0] }, result); } @@ -234,7 +234,7 @@ namespace Avalonia.Visuals.UnitTests.Rendering root.Measure(Size.Infinity); root.Arrange(new Rect(container.DesiredSize)); - var result = root.Renderer.HitTest(new Point(100, 100), null); + var result = root.Renderer.HitTest(new Point(100, 100), root, null); Assert.Equal(new[] { container.Children[2], container.Children[0], container.Children[1] }, result); } @@ -283,7 +283,7 @@ namespace Avalonia.Visuals.UnitTests.Rendering container.Measure(Size.Infinity); container.Arrange(new Rect(container.DesiredSize)); - var result = root.Renderer.HitTest(new Point(120, 120), null); + var result = root.Renderer.HitTest(new Point(120, 120), root, null); Assert.Equal(new IVisual[] { target, container }, result); } @@ -331,7 +331,7 @@ namespace Avalonia.Visuals.UnitTests.Rendering root.Measure(Size.Infinity); root.Arrange(new Rect(container.DesiredSize)); - var result = root.Renderer.HitTest(new Point(50, 50), null); + var result = root.Renderer.HitTest(new Point(50, 50), root, null); Assert.Equal(new[] { container }, result); } @@ -404,11 +404,11 @@ namespace Avalonia.Visuals.UnitTests.Rendering root.Measure(Size.Infinity); root.Arrange(new Rect(container.DesiredSize)); - var result = root.Renderer.HitTest(new Point(50, 150), null).First(); + var result = root.Renderer.HitTest(new Point(50, 150), root, null).First(); Assert.Equal(item1, result); - result = root.Renderer.HitTest(new Point(50, 50), null).First(); + result = root.Renderer.HitTest(new Point(50, 50), root, null).First(); Assert.Equal(target, result); @@ -419,10 +419,10 @@ namespace Avalonia.Visuals.UnitTests.Rendering container.InvalidateArrange(); container.Arrange(new Rect(container.DesiredSize)); - result = root.Renderer.HitTest(new Point(50, 150), null).First(); + result = root.Renderer.HitTest(new Point(50, 150), root, null).First(); Assert.Equal(item2, result); - result = root.Renderer.HitTest(new Point(50, 50), null).First(); + result = root.Renderer.HitTest(new Point(50, 50), root, null).First(); Assert.Equal(target, result); } } @@ -452,10 +452,10 @@ namespace Avalonia.Visuals.UnitTests.Rendering var context = new DrawingContext(Mock.Of()); - var result = root.Renderer.HitTest(new Point(100, 100), null); + var result = root.Renderer.HitTest(new Point(100, 100), root, null); Assert.Equal(new[] { path }, result); - result = root.Renderer.HitTest(new Point(10, 10), null); + result = root.Renderer.HitTest(new Point(10, 10), root, null); Assert.Empty(result); } } @@ -492,10 +492,10 @@ namespace Avalonia.Visuals.UnitTests.Rendering var context = new DrawingContext(Mock.Of()); - var result = root.Renderer.HitTest(new Point(200, 200), null); + var result = root.Renderer.HitTest(new Point(200, 200), root, null); Assert.Equal(new IVisual[] { canvas, border }, result); - result = root.Renderer.HitTest(new Point(110, 110), null); + result = root.Renderer.HitTest(new Point(110, 110), root, null); Assert.Empty(result); } } diff --git a/tests/Avalonia.Visuals.UnitTests/Rendering/ImmediateRendererTests_HitTesting.cs b/tests/Avalonia.Visuals.UnitTests/Rendering/ImmediateRendererTests_HitTesting.cs index 2c3e9bf11a..c8a19a9f46 100644 --- a/tests/Avalonia.Visuals.UnitTests/Rendering/ImmediateRendererTests_HitTesting.cs +++ b/tests/Avalonia.Visuals.UnitTests/Rendering/ImmediateRendererTests_HitTesting.cs @@ -40,7 +40,7 @@ namespace Avalonia.Visuals.UnitTests.Rendering root.Arrange(new Rect(root.DesiredSize)); root.Renderer.Paint(new Rect(root.ClientSize)); - var result = root.Renderer.HitTest(new Point(100, 100), null); + var result = root.Renderer.HitTest(new Point(100, 100), root, null); Assert.Equal(new[] { root.Child, root }, result); } @@ -78,7 +78,7 @@ namespace Avalonia.Visuals.UnitTests.Rendering root.Arrange(new Rect(root.DesiredSize)); root.Renderer.Paint(new Rect(root.ClientSize)); - var result = root.Renderer.HitTest(new Point(100, 100), null); + var result = root.Renderer.HitTest(new Point(100, 100), root, null); Assert.Equal(new[] { root }, result); } @@ -108,7 +108,7 @@ namespace Avalonia.Visuals.UnitTests.Rendering root.Arrange(new Rect(root.DesiredSize)); root.Renderer.Paint(new Rect(root.ClientSize)); - var result = root.Renderer.HitTest(new Point(10, 10), null); + var result = root.Renderer.HitTest(new Point(10, 10), root, null); Assert.Equal(new[] { root }, result); } @@ -153,7 +153,7 @@ namespace Avalonia.Visuals.UnitTests.Rendering root.Arrange(new Rect(container.DesiredSize)); root.Renderer.Paint(new Rect(root.ClientSize)); - var result = root.Renderer.HitTest(new Point(100, 100), null); + var result = root.Renderer.HitTest(new Point(100, 100), root, null); Assert.Equal(new[] { container.Children[1], container.Children[0], container, root }, result); } @@ -208,7 +208,7 @@ namespace Avalonia.Visuals.UnitTests.Rendering root.Arrange(new Rect(container.DesiredSize)); root.Renderer.Paint(new Rect(root.ClientSize)); - var result = root.Renderer.HitTest(new Point(100, 100), null); + var result = root.Renderer.HitTest(new Point(100, 100), root, null); Assert.Equal( new[] @@ -267,7 +267,7 @@ namespace Avalonia.Visuals.UnitTests.Rendering container.Arrange(new Rect(container.DesiredSize)); root.Renderer.Paint(new Rect(root.ClientSize)); - var result = root.Renderer.HitTest(new Point(120, 120), null); + var result = root.Renderer.HitTest(new Point(120, 120), root, null); Assert.Equal(new IVisual[] { target, container }, result); } @@ -316,7 +316,7 @@ namespace Avalonia.Visuals.UnitTests.Rendering root.Arrange(new Rect(container.DesiredSize)); root.Renderer.Paint(new Rect(root.ClientSize)); - var result = root.Renderer.HitTest(new Point(50, 50), null); + var result = root.Renderer.HitTest(new Point(50, 50), root, null); Assert.Equal(new IVisual[] { container, root }, result); } @@ -390,11 +390,11 @@ namespace Avalonia.Visuals.UnitTests.Rendering root.Arrange(new Rect(container.DesiredSize)); root.Renderer.Paint(new Rect(root.ClientSize)); - var result = root.Renderer.HitTest(new Point(50, 150), null).First(); + var result = root.Renderer.HitTest(new Point(50, 150), root, null).First(); Assert.Equal(item1, result); - result = root.Renderer.HitTest(new Point(50, 50), null).First(); + result = root.Renderer.HitTest(new Point(50, 50), root, null).First(); Assert.Equal(target, result); @@ -406,10 +406,10 @@ namespace Avalonia.Visuals.UnitTests.Rendering container.Arrange(new Rect(container.DesiredSize)); root.Renderer.Paint(new Rect(root.ClientSize)); - result = root.Renderer.HitTest(new Point(50, 150), null).First(); + result = root.Renderer.HitTest(new Point(50, 150), root, null).First(); Assert.Equal(item2, result); - result = root.Renderer.HitTest(new Point(50, 50), null).First(); + result = root.Renderer.HitTest(new Point(50, 50), root, null).First(); Assert.Equal(target, result); } } From a3eb9e0da4ed350836155296a9a933df9d6d401c Mon Sep 17 00:00:00 2001 From: Nikita Tsukanov Date: Sat, 14 Oct 2017 19:00:27 +0300 Subject: [PATCH 40/69] Docs are now living at https://github.com/AvaloniaUI/avaloniaui.net So long and thanks for the fish --- docs/.gitignore | 3 - docs/README.md | 21 -- docs/build.cmd | 3 - docs/docfx.json | 55 ----- docs/guidelines/build.md | 43 ---- docs/guidelines/contributing.md | 60 ------ docs/guidelines/toc.yml | 4 - docs/images/avalonia-video.png | Bin 135848 -> 0 bytes docs/images/cross-platform.png | Bin 45808 -> 0 bytes docs/images/hello-world-xaml.png | Bin 125439 -> 0 bytes docs/images/inspection-support.png | Bin 231938 -> 0 bytes docs/images/screen.png | Bin 27256 -> 0 bytes docs/index.md | 37 ---- docs/intro.md | 225 --------------------- docs/serve.cmd | 2 - docs/spec/architecture.md | 101 --------- docs/spec/binding-from-code.md | 156 -------------- docs/spec/binding-from-xaml.md | 99 --------- docs/spec/defining-properties.md | 199 ------------------ docs/spec/logging.md | 54 ----- docs/spec/styles.md | 111 ---------- docs/spec/toc.yml | 14 -- docs/spec/working-with-properties.md | 102 ---------- docs/template/partials/footer.tmpl.partial | 13 -- docs/toc.yml | 10 - docs/tutorial/from-wpf.md | 161 --------------- docs/tutorial/gettingstarted.md | 10 - docs/tutorial/images/add-dialogs.png | Bin 45998 -> 0 bytes docs/tutorial/nuget.md | 86 -------- docs/tutorial/toc.yml | 6 - readme.md | 12 +- 31 files changed, 6 insertions(+), 1581 deletions(-) delete mode 100644 docs/.gitignore delete mode 100644 docs/README.md delete mode 100644 docs/build.cmd delete mode 100644 docs/docfx.json delete mode 100644 docs/guidelines/build.md delete mode 100644 docs/guidelines/contributing.md delete mode 100644 docs/guidelines/toc.yml delete mode 100644 docs/images/avalonia-video.png delete mode 100644 docs/images/cross-platform.png delete mode 100644 docs/images/hello-world-xaml.png delete mode 100644 docs/images/inspection-support.png delete mode 100644 docs/images/screen.png delete mode 100644 docs/index.md delete mode 100644 docs/intro.md delete mode 100644 docs/serve.cmd delete mode 100644 docs/spec/architecture.md delete mode 100644 docs/spec/binding-from-code.md delete mode 100644 docs/spec/binding-from-xaml.md delete mode 100644 docs/spec/defining-properties.md delete mode 100644 docs/spec/logging.md delete mode 100644 docs/spec/styles.md delete mode 100644 docs/spec/toc.yml delete mode 100644 docs/spec/working-with-properties.md delete mode 100644 docs/template/partials/footer.tmpl.partial delete mode 100644 docs/toc.yml delete mode 100644 docs/tutorial/from-wpf.md delete mode 100644 docs/tutorial/gettingstarted.md delete mode 100644 docs/tutorial/images/add-dialogs.png delete mode 100644 docs/tutorial/nuget.md delete mode 100644 docs/tutorial/toc.yml diff --git a/docs/.gitignore b/docs/.gitignore deleted file mode 100644 index 8782b2d294..0000000000 --- a/docs/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -#docfx -_site -api diff --git a/docs/README.md b/docs/README.md deleted file mode 100644 index c65b576bfa..0000000000 --- a/docs/README.md +++ /dev/null @@ -1,21 +0,0 @@ -# Avalonia Documentation - -* [API Reference](http://avalonia.github.io/) - -## Building - -Download and unzip `docfx.zip` into `Documentation` folder from [DocFX project site](https://github.com/dotnet/docfx/releases). - -**Step 1.** To create `_site` documentation folder run build script - -``` -build.cmd -``` - -**Step 2.** To browse `_site` documentation folder run serve script - -``` -serve.cmd -``` - -And you can view the generated website in your browser `http://localhost:8080`. diff --git a/docs/build.cmd b/docs/build.cmd deleted file mode 100644 index b11ad76376..0000000000 --- a/docs/build.cmd +++ /dev/null @@ -1,3 +0,0 @@ -@echo off -docfx metadata -docfx build diff --git a/docs/docfx.json b/docs/docfx.json deleted file mode 100644 index d49ee066ed..0000000000 --- a/docs/docfx.json +++ /dev/null @@ -1,55 +0,0 @@ -{ - "metadata": [ - { - "src": [ - { - "files": [ - "/src/Gtk/Avalonia.Cairo/Avalonia.Cairo.csproj", - "/src/Gtk/Avalonia.Gtk/Avalonia.Gtk.csproj", - "/src/Markup/Avalonia.Markup/Avalonia.Markup.csproj", - "/src/Markup/Avalonia.Markup.Xaml/Avalonia.Markup.Xaml.csproj", - "/src/Avalonia.Animation/Avalonia.Animation.csproj", - "/src/Avalonia.Application/Avalonia.Application.csproj", - "/src/Avalonia.Base/Avalonia.Base.csproj", - "/src/Avalonia.Controls/Avalonia.Controls.csproj", - "/src/Avalonia.Diagnostics/Avalonia.Diagnostics.csproj", - "/src/Avalonia.HtmlRenderer/Avalonia.HtmlRenderer.csproj", - "/src/Avalonia.Input/Avalonia.Input.csproj", - "/src/Avalonia.Interactivity/Avalonia.Interactivity.csproj", - "/src/Avalonia.Layout/Avalonia.Layout.csproj", - "/src/Avalonia.ReactiveUI/Avalonia.ReactiveUI.csproj", - "/src/Avalonia.Visuals/Avalonia.Visuals.csproj", - "/src/Avalonia.Styling/Avalonia.Styling.csproj", - "/src/Avalonia.Themes.Default/Avalonia.Themes.Default.csproj", - "/src/Skia/Avalonia.Skia.Desktop/Avalonia.Skia.Desktop.csproj", - "/src/Windows/Avalonia.Designer/Avalonia.Designer.csproj", - "/src/Windows/Avalonia.Direct2D1/Avalonia.Direct2D1.csproj", - "/src/Windows/Avalonia.Win32/Avalonia.Win32.csproj", - ], - "exclude": [ "**/bin/**", "**/obj/**" ], - "cwd": ".." - } - ], - "dest": "api" - }, - ], - "build": { - "content": - [ - { - "files": ["**/*.yml", "index.md", "tutorial/*.md", "guidelines/*.md", "spec/*.md"], - } - ], - "resource": [ - { - "files": ["images/**", "tutorial/images/**", "guidelines/images/**", "spec/images/**"] - } - ], - "overwrite": "apidoc/*.md", - "globalMetadata": { - "_appTitle": "Avalonia Website" - }, - "dest": "_site", - "template": [ "default", "template"] - } -} diff --git a/docs/guidelines/build.md b/docs/guidelines/build.md deleted file mode 100644 index 559790b197..0000000000 --- a/docs/guidelines/build.md +++ /dev/null @@ -1,43 +0,0 @@ -# Building Avalonia - -## Windows - -Avalonia requires at least Visual Studio 2017 and .NET Core SDK 2.0 to build on Windows. - -### Clone the Avalonia repository - -``` -git clone https://github.com/AvaloniaUI/Avalonia.git -git submodule update --init -``` - -### Open in Visual Studio - -Open the `Avalonia.sln` solution in Visual Studio 2015 or newer. The free Visual Studio Community -edition works fine. Run the `Samples\ControlCatalog.Desktop` project to see the sample application. - -## Linux/OSX - -It's *not* possible to build the *whole* project on Linux/OSX. You can only build the subset targeting .NET Standard and .NET Core (which is, however, sufficient to get UI working on Linux/OSX). If you want to something that involves changing platform-specific APIs you'll need a Windows machine. - -MonoDevelop, Xamarin Studio and Visual Studio for Mac aren't capable of properly opening our solution. You can use Rider (at least 2017.2 EAP) or VSCode instead. They will fail to load most of platform specific projects, but you don't need them to run on .NET Core. - -### Install the latest version of .NET Core - -Go to https://www.microsoft.com/net/core and follow instructions for your OS. You need SDK (not just "runtime") package. - -### Clone the Avalonia repository - -``` -git clone https://github.com/AvaloniaUI/Avalonia.git -git submodule update --init --recursive -``` - -### Build and Run Avalonia - -``` -samples/ControlCatalog.NetCore -dotnet restore -dotnet run -``` - diff --git a/docs/guidelines/contributing.md b/docs/guidelines/contributing.md deleted file mode 100644 index 771b8f49f2..0000000000 --- a/docs/guidelines/contributing.md +++ /dev/null @@ -1,60 +0,0 @@ -# Contributing # - -## Before You Start ## - -Drop into our [gitter chat room](https://gitter.im/Avalonia/Avalonia) and let us know what you're thinking of doing. We might be able to give you guidance or let you know if someone else is already working on the feature. - -## Style ## - -The codebase uses [.net core](https://github.com/dotnet/corefx/blob/master/Documentation/coding-guidelines/coding-style.md) coding style. - -Try to keep lines of code around 100 characters in length or less, though this is not a hard limit. -If you're a few characters over then don't worry too much. - -**DO NOT USE #REGIONS** full stop. - -## Pull requests ## - -A single pull request should be submitted for each change. If you're making more than one change, -please submit separate pull requests for each change for easy review. Rebase your changes to make -sense, so a history that looks like: - -* Add class A -* Feature A didn't set Foo when Bar was set -* Fix spacing -* Add class B -* Sort using statements - -Should be rebased to read: - -* Add class A -* Add class B - -Again, this makes review much easier. - -Please try not to submit pull requests that don't add new features (e.g. moving stuff around) -unless you see something that is obviously wrong or that could be written in a more terse or -idiomatic style. It takes time to review each pull request - time that I'd prefer to spend writing -new features! - -Prefer terseness to verbosity but don't try to be too clever. - -## Tests ## - -There are two types of tests currently in the codebase; unit tests and render tests. - -Unit tests should be contained in a class name that mirrors the class being tested with the suffix --Tests, e.g. - - Avalonia.Controls.UnitTests.Presenters.TextPresenterTests - -Where Avalonia.Controls.UnitTests is the name of the project. - -Unit test methods should be named in a sentence style, separated by underscores, that describes in -English what the test is testing, e.g. - - void Calling_Foo_Should_Increment_Bar() - -Render tests should describe what the produced image is: - - void Rectangle_2px_Stroke_Filled() diff --git a/docs/guidelines/toc.yml b/docs/guidelines/toc.yml deleted file mode 100644 index 25bfbbf6bf..0000000000 --- a/docs/guidelines/toc.yml +++ /dev/null @@ -1,4 +0,0 @@ -- name: Building Avalonia - href: build.md -- name: Contributing - href: contributing.md \ No newline at end of file diff --git a/docs/images/avalonia-video.png b/docs/images/avalonia-video.png deleted file mode 100644 index 2af3fd4c917635bc85859ece74ddcb116df783c2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 135848 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

S+5La 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 P_)&PM{Gj;0LEwJ@P?>c_ diff --git a/docs/images/hello-world-xaml.png b/docs/images/hello-world-xaml.png deleted file mode 100644 index 0a3ecbf91f4b911a4eb7f268444aeb102674f034..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 125439 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 Eg32?|8mrf;nqISJJ=I|!CK>H)WJ>OZ_OF)Bw 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

oo3rE=a7}gJC_>?5xbEEUEFv!$pAcKiAUI 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⪼P&>su*P9OL!u@Gp&Cjk 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 diff --git a/docs/images/screen.png b/docs/images/screen.png deleted file mode 100644 index 3214a44267e42b5650cbb96a82f87b1ae0f255bc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27256 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 diff --git a/docs/index.md b/docs/index.md deleted file mode 100644 index 37d95b203d..0000000000 --- a/docs/index.md +++ /dev/null @@ -1,37 +0,0 @@ -# The Avalonia UI Framework - -Cross platform .NET UI Framework with bindings and XAML - -## Current status - -We're pleased to announce that Avalonia is now in alpha! - -What does alpha mean? Well, it means that it's now at a stage where you can have a play and hopefully create simple applications. There's now a Visual Studio Extension containing project and item templates that will help you get started, and there's an initial complement of controls. There's still a lot missing, and you will find bugs, and the API will change, but this represents the first time where we've made it somewhat easy to have a play and experiment with the framework. - -## How do I try it out - -The easiest way to try out Avalonia is to install the [Visual Studio Extension](https://marketplace.visualstudio.com/items?itemName=AvaloniaTeam.AvaloniaforVisualStudio). - -This will add a Avalonia project template and a Window template to the standard Visual Studo "Add" dialog (yes, icons still to come :) ): - -![](images/add-dialogs.png) - -Creating a Avalonia Project will give you a simple project with a single XAML window. We even have a simple designer: - -![](images/hello-world-xaml.png) - -You can also find the project [on GitHub](https://github.com/AvaloniaUI/Avalonia/) - -## News - -You can read news about Avalonia on [Groky's blog](http://grokys.github.io/) - -## Cross Platform - -Fow now we can run on Windows, Linux and Mac. - -![](images/cross-platform.png) - -## Inspection support - -![](images/inspection-support.png) diff --git a/docs/intro.md b/docs/intro.md deleted file mode 100644 index 1303815736..0000000000 --- a/docs/intro.md +++ /dev/null @@ -1,225 +0,0 @@ -# Avalonia # - -...a next generation WPF? - -## Background ## - -As everyone who's involved in client-side .NET development knows, the past half decade have been a -very sad time. Where WPF started off as a game-changer, it now seems to have been all but forgotten. -WinRT came along and took many of the lessons of WPF but it's currently not usable on the desktop. - -After a few months of trying to reverse-engineer WPF with the [Avalonia Project](https://github.com/grokys/Avalonia) I began to come to the same conclusion that I imagine Microsoft -came to internally: for all its groundbreaking-ness at the time, WPF at its core is a dated mess, -written for .NET 1 and barely updated to even bring it up-to-date with .NET 2 features such as -generics. - -So I began to think: what if we were to start anew with modern C# features such as *(gasp)* -Generics, Observables, async, etc etc. The result of that thought is Avalonia -(https://github.com/grokys/Avalonia). - -##### DISCLAIMER -This is really **early development pre-alpha-alpha** stuff. Everything is subject to -change, I'm not even sure if the performance characteristics of Rx make Observables suitable for -binding throughout a framework. *I'm writing this only to see if the idea of exploring these ideas -appeals to anyone else.* - -So what can it do so far? Not a whole lot right now. Here's the demo application: - -![](screen.png) - -## AvaloniaProperty ## - -AvaloniaProperty is the equivalent of WPF's DependencyProperty. - -I'm not a big fan of DependencyProperty. My first thought was that I'd rather not have something -like this at all and just use basic INPC but DPs give you two important features: Inheritance and -Attached Properties. So the challenge became to improve it. - -Declaring a DependencyProperty in WPF looks something like this: - -```csharp -public static readonly DependencyProperty PropertyDeclaration = -DependencyProperty.Register( - "PropertyName", - typeof(PropertyType), - typeof(OwnerClass), - new FrameworkPropertyMetadata( - default(PropertyType), - FrameworkPropertyMetadataOptions.Inherits)); - -public PropertyType PropertyName -{ - get { return (PropertyType)this.GetValue(PropertyDeclaration); } - set { this.SetValue(PropertyDeclaration, value); } -} -``` - -Eww! All that just to declare a single property. There's **A LOT** of boilerplate there. With -generics and default parameters we can at least make it look a bit nicer: - -```csharp -public static readonly AvaloniaProperty PropertyDeclaration = -AvaloniaProperty.Register("PropertyName", inherits: true); - -public PropertyType PropertyName -{ - get { return this.GetValue(PropertyDeclaration); } - set { this.SetValue(PropertyDeclaration, value); } -} -``` - -What can we see here? - -- AvaloniaProperties are typed, so no more having to cast in the getter. -- We pass the property type and owner class as a generic type to `Register()` so we don't have to -write `typeof()` twice. -- We used default parameter values in `Register()` so that defaults don't have to be restated. - -*(ASIDE: maybe Roslyn will give us [var for fields](http://blogs.msdn.com/b/ericlippert/archive/2009/01/26/why-no-var-on-fields.aspx)...)? Lets hope...* - -## Binding - -Binding in Avalonia uses Reactive Extensions' [IObservable](http://msdn.microsoft.com/library/dd990377.aspx). To bind an IObservable to a property, use the `Bind()` method: - -```csharp -control.Bind(BorderProperty, someObject.SomeObservable()); -``` - -Note that because AvaloniaProperty is typed, we can check that the observable is of the correct type. - -To get the value of a property as an observable, call `GetObservable()`: - -```csharp -var observable = control.GetObservable(Control.FooProperty); -``` - -## Attached Properties and Binding Pt 2 - -Attached properties are set just like in WPF, using `SetValue()`. But what about the `[]` operator, also called [index initializer](https://roslyn.codeplex.com/wikipage?title=Language%20Feature%20Status&referringTitle=Home) (see *C# feature descriptions*)? The upcoming version of C# will provide a new feature that allows us to use `[]` array subscripts in object initializers. An example on how to make use of it will look like this: - -```csharp -var control = new Control -{ - Property1 = "Foo", - [Attached.Property] = "Bar", -} -``` - - -Nice... Lets take this further: - -```csharp -var control = new Control -{ - Property1 = "Foo", - [Attached.Property] = "Bar", - [!Property2] = something.SomeObservable, -} -``` - -Yep, by putting a bang in front of the property name you can **bind** to a property (attached or -otherwise) from the object initializer. - -Binding to a property on another control? Easy: - -```csharp -var control = new Control -{ - Property1 = "Foo", - [Attached.Property] = "Bar", - [!Property2] = anotherControl[!Property1], -} -``` - -Two way binding? Just add two bangs: - -```csharp -var control = new Control -{ - Property1 = "Foo", - [Attached.Property] = "Bar", - [!!Property2] = anotherControl[!!Property1], -} -``` - -## Visual and Logical trees - -Avalonia uses the same visual/logical tree separation that is used by WPF (and to some extent HTML -is moving in this direction with the Shadow DOM). The manner of accessing the two trees is slightly -different however. Rather than using Visual/LogicalTreeHelper you can cast any control to an -`IVisual` or `ILogical` to reveal the tree operations. There's also the VisualExtensions class which -provides some useful extension methods such as `GetVisualAncestor(this IVisual visual)` or -`GetVisualAt(this IVisual visual, Point p)`. - -Again like WPF, Controls are lookless with the visual appearance being defined by the Template -property, which is determined by... - -## Styles - -Styles in Avalonia diverge from styles in WPF quite a lot, and move towards a more CSS-like system. -It's probably easiest to show in an example. Here is the default style for the CheckBox control: - -```csharp -new Style(x => x.OfType()) -{ - Setters = new[] - { - new Setter(Button.TemplateProperty, ControlTemplate.Create(this.Template)) - } -}; - -new Style(x => x.OfType().Template().Id("checkMark")) -{ - Setters = new[] - { - new Setter(Shape.IsVisibleProperty, false) - } -}; - -new Style(x => x.OfType().Class(":checked").Template().Id("checkMark")) -{ - Setters = new[] - { - new Setter(Shape.IsVisibleProperty, true) - } -}; -``` - -Let's see what's happening here: - -```csharp -new Style(x => x.OfType()) -``` - -The constructor for the Style class defines the selector. Here we're saying "*this style applies to -all controls in the the visual tree of type CheckBox*". A more complex selector: - -```csharp -new Style(x => x.OfType().Class(":checked").Template().Id("checkMark")) -``` - -This selector matches *"all controls with Id == "checkMark" in the template of a CheckBox with the -class `:checked`"*. Each control has an Id property, and Ids in templates are considered to be in a -separate namespace. - -Inside the Style class we then have a collection of setters similar to WPF. - -This system means that there's no more need for WPF's Triggers - the styling works with classes -(which are arbitrary strings) similar to CSS. Similar to CSS, classes with a leading `:` are set -by the control itself in response to events like `mouseover` and `click`. - -Similar to WPF, styles can be defined on each control, with a global application style collection -at the root. This means that different subsections of the visual tree can have a completely -different look-and-feel. - -## XAML - -As you can see, all of the examples here are defined in code - but a XAML implementation is being -worked on. The current progress can be reviewed at [https://github.com/SuperJMN/Avalonia](https://github.com/SuperJMN/Avalonia). - -## That's all for now - -There's a lot more to see, and even more to do, so if you want to have a play you can get the code -here: [https://github.com/grokys/Avalonia](https://github.com/grokys/Avalonia) - -Feedback is always welcome! diff --git a/docs/serve.cmd b/docs/serve.cmd deleted file mode 100644 index 8d19925938..0000000000 --- a/docs/serve.cmd +++ /dev/null @@ -1,2 +0,0 @@ -@echo off -docfx serve _site diff --git a/docs/spec/architecture.md b/docs/spec/architecture.md deleted file mode 100644 index 1245bdbfd4..0000000000 --- a/docs/spec/architecture.md +++ /dev/null @@ -1,101 +0,0 @@ -# Avalonia Architecture - -At the highest level, avalonia is split up into a "core" and two "subsystems". - -* The core is a set of Portable Class Libraries that can run anywhere. -* The Windowing subsystem is responsible for creating windows, handling input and scheduling timers. -* The Rendering subsystem is responsible for drawing. - -There are currently two Windowing and two Rendering subsystems: - -## Windowing Subsystems - -* Avalonia.Win32 uses the Win32 API (this also works on 64-bit windows). -* Avalonia.Gtk uses the GTK2 toolkit and can be run on both Windows and *nix. - -## Rendering Subsystems - -* Avalonia.Direct2D1 uses Microsoft's Direct2D1 API. -* Avalonia.Cairo uses Cairo for rendering and Pango for text layout. - -## Core - -The Avalonia core is split up into several assemblies. Note that they're not separated like this -because you will want to use them separately; they are separate to maintain separation of concerns -and a layered architecture. It is fully possible that they will be ILMerged into a single assembly -for distribution. - -The assemblies are as follows, from lowest to highest level: - -### Avalonia.Base - -The main classes in this assembly are `AvaloniaObject` and `AvaloniaProperty`. - -These are Avalonia's versions of XAML's `DependencyObject` and `DependencyProperty`. It also -defines a `AvaloniaDispatcher` which is - surprise - our version of XAML's `Dispatcher`. - -### Avalonia.Animation - -The main class in the assembly is `Animatable`. - -Allows AvaloniaProperties to be animated and provides various utilities related to animation. - -### Avalonia.Visuals - -The main class in this assembly is `Visual` and its interface `IVisual`. - -Defines the "Visual" layer which is a 2D scene graph, with each node being a `IVisual`/`Visual`. -Also defines primitives such as `Point`/`Rect`/`Matrix`, plus `Geometry`, `Bitmap`, `Brush` and -whatever else you might need in order to draw to the screen. - -### Avalonia.Styling - -The main interface in this assembly is `IStyleable`. - -Defines a CSS-like system for styling controls. - -### Avalonia.Layout - -The main class in this assembly is `Layoutable`. - -Defines a XAML-like layout system using `Measure` and `Arrange`. Also defines `LayoutManager` which -carries out the actual layout. - -### Avalonia.Interactivity - -The main class in this assembly is `Interactive`. - -Defines a system of routed events similar to those found in XAML. - -### Avalonia.Input - -The main class in this assembly is `InputElement`. - -Handles input from various devices such as `MouseDevice` and `KeyboardDevice`, together with -`FocusManager` for tracking input focus. Input is sent from the windowing subsystem to -`InputManager` in the form of "Raw" events which are then translated into routed events for the -controls. - -### Avalonia.Controls - -There are many important classes in this assembly, but the root of them is `Control`. - -Finally defines the actual controls. The `Control` class is analogous to WPF's `FrameworkElement` -whereas the `TemplatedControl` class is our version of WPF's `Control`. This is also where you'll -find all of the basic controls you'd expect. - -### Avalonia.Themes.Default - -Defines a default theme using a set of styles and control templates. - -### Avalonia.Application - -The main class in this assembly is `Application`. - -This ties everything together, setting up the service locator, defining the default theme etc. - -### Avalonia.Diagnostics - -Adds utilities for debugging avalonia applications, such as `DevTools` which provides a Snoop/WPF -Inspector/Browser DevTools window for inspecting the state of the application. - diff --git a/docs/spec/binding-from-code.md b/docs/spec/binding-from-code.md deleted file mode 100644 index 76f3aa55c9..0000000000 --- a/docs/spec/binding-from-code.md +++ /dev/null @@ -1,156 +0,0 @@ -# Binding from Code - -Avalonia binding from code works somewhat differently to WPF/UWP. At the low level, Avalonia's -binding system is based on Reactive Extensions' `IObservable` which is then built upon by XAML -bindings (which can also be instantiated in code). - -## Binding to an observable - -You can bind a property to an observable using the `AvaloniaObject.Bind` method: - -```csharp -// We use an Rx Subject here so we can push new values using OnNext -var source = new Subject(); -var textBlock = new TextBlock(); - -// Bind TextBlock.Text to source -textBlock.Bind(TextBlock.TextProperty, source); - -// Set textBlock.Text to "hello" -source.OnNext("hello"); -// Set textBlock.Text to "world!" -source.OnNext("world!"); -``` - -## Binding priorities - -You can also pass a priority to a binding. *Note: Priorities only apply to styled properties: they* -*are ignored for direct properties.* - -The priority is passed using the `BindingPriority` enum, which looks like this: - -```csharp -///

-/// The priority of a binding. -/// -public enum BindingPriority -{ - /// - /// A value that comes from an animation. - /// - Animation = -1, - - /// - /// A local value: this is the default. - /// - LocalValue = 0, - - /// - /// A triggered style binding. - /// - /// - /// A style trigger is a selector such as .class which overrides a - /// binding. In this way, a basic control can have - /// for example a Background from the templated parent which changes when the - /// control has the :pointerover class. - /// - StyleTrigger, - - /// - /// A binding to a property on the templated parent. - /// - TemplatedParent, - - /// - /// A style binding. - /// - Style, - - /// - /// The binding is uninitialized. - /// - Unset = int.MaxValue, -} -``` - -Bindings with a priority with a smaller number take precedence over bindings with a higher value -priority, and bindings added more recently take precedence over other bindings with the same -priority. Whenever the binding produces `AvaloniaProperty.UnsetValue` then the next binding in the -priority order is selected. - -## Setting a binding in an object initializer - -It is often useful to set up bindings in object initializers. You can do this using the indexer: - -```csharp -var source = new Subject(); -var textBlock = new TextBlock -{ - Foreground = Brushes.Red, - MaxWidth = 200, - [!TextBlock.TextProperty] = source.ToBinding(), -}; -``` - -Using this method you can also easily bind a property on one control to a property on another: - -```csharp -var textBlock1 = new TextBlock(); -var textBlock2 = new TextBlock -{ - Foreground = Brushes.Red, - MaxWidth = 200, - [!TextBlock.TextProperty] = textBlock1[!TextBlock.TextProperty], -}; -``` - -Of course the indexer can be used outside object initializers too: - -```csharp -textBlock2[!TextBlock.TextProperty] = textBlock1[!TextBlock.TextProperty]; -``` - -# Transforming binding values - -Because we're working with observables, we can easily transform the values we're binding! - -```csharp -var source = new Subject(); -var textBlock = new TextBlock -{ - Foreground = Brushes.Red, - MaxWidth = 200, - [!TextBlock.TextProperty] = source.Select(x => "Hello " + x).ToBinding(), -}; -``` - -# Using XAML bindings from code - -Sometimes when you want the additional features that XAML bindings provide, it's easier to use XAML bindings from code. For example, using only observables you could bind to a property on `DataContext` like this: - -```csharp -var textBlock = new TextBlock(); -var viewModelProperty = textBlock.GetObservable(TextBlock.DataContext) - .OfType() - .Select(x => x?.Name); -textBlock.Bind(TextBlock, viewModelProperty); -``` - -However, it might be preferable to use a XAML binding in this case: - -```csharp -var textBlock = new TextBlock -{ - [!TextBlock.TextProperty] = new Binding("Name") -}; -``` - -By using XAML binding objects, you get access to binding to named controls and [all the other features that XAML bindings bring](binding-from.xaml.md): - -```csharp -var textBlock = new TextBlock -{ - [!TextBlock.TextProperty] = new Binding("Text") { ElementName = "other" } -}; -``` - diff --git a/docs/spec/binding-from-xaml.md b/docs/spec/binding-from-xaml.md deleted file mode 100644 index 143e3627c8..0000000000 --- a/docs/spec/binding-from-xaml.md +++ /dev/null @@ -1,99 +0,0 @@ -# Binding from XAML - -Binding from XAML works on the whole the same as in other XAML frameworks: you use the `{Binding}` -markup extension. Avalonia does have some extra syntacic niceties however. Here's an overview of -what you can currently do in Avalonia: - -## Binding to a property on the DataContext - -By default a binding binds to a property on the `DataContext`, e.g.: - -```xml - - - - -``` - -An empty binding binds to DataContext itself - -```xml - - - - -``` - -This usage is identical to WPF/UWP etc. - -## Two way bindings and more - -You can also specify a binding `Mode`: - -```xml - - -``` - -This usage is identical to WPF/UWP etc. - -## Binding to a property on the templated parent - -When you're creating a control template and you want to bind to the templated parent you can use: - -```xml - - - -``` - -This usage is identical to WPF/UWP etc. - -## Binding to a named control - -If you want to bind to a property on another (named) control, you can use `ElementName` as in -WPF/UWP: - -```xml - - -``` - -However Avalonia also introduces a shorthand syntax for this: - -```xml - -``` - -## Negating bindings - -You can also negate the value of a binding using the `!` operator: - -```xml - -``` - -Here, the `TextBox` will only be enabled when the view model signals that it has no errors. Behind -the scenes, Avalonia tries to convert the incoming value to a boolean, and if it can be converted -it negates the value. If the incoming value cannot be converted to a boolean then no value will be -pushed to the binding target. - -This syntax is specific to Avalonia. - -## Binding to tasks and observables - -You can subscribe to the result of a task or an observable by using the `^` stream binding operator. - -```xml - - -``` - -This syntax is specific to Avalonia. - -*Note: the stream operator is actually extensible, see -[here](https://github.com/AvaloniaUI/Avalonia/blob/master/src/Markup/Avalonia.Markup/Data/Plugins/IStreamPlugin.cs) -for the interface to implement and [here](https://github.com/AvaloniaUI/Avalonia/blob/master/src/Markup/Avalonia.Markup/Data/ExpressionObserver.cs#L47) -for the registration.* diff --git a/docs/spec/defining-properties.md b/docs/spec/defining-properties.md deleted file mode 100644 index d9e925aa1c..0000000000 --- a/docs/spec/defining-properties.md +++ /dev/null @@ -1,199 +0,0 @@ -# Defining Properties - -If you are creating a control, you will want to define properties on your -control. The process in Avalonia is broadly similar to other XAML languages -with a few differences - the main one being that Perpsex's equivalent of -`DependencyProperty` is called `StyledProperty`. - -## Registering Styled Properties - -A styled property is analogous to a `DependencyProperty` in other XAML -frameworks. - -You register a styled property by calling `AvaloniaProperty.Register` and -storing the result in a `static readonly` field. You then create a standard C# -property to access it. - -Here's how the `Border` control defines its `Background` property: - -```c# - public static readonly StyledProperty BackgroundProperty = - AvaloniaProperty.Register(nameof(Background)); - - public Brush Background - { - get { return GetValue(BackgroundProperty); } - set { SetValue(BackgroundProperty, value); } - } -``` - -The `AvaloniaProperty.Register` method also accepts a number of other parameters: - -- `defaultValue`: This gives the property a default value. Be sure to only pass -value types and immutable types here as passing a reference type will cause the -same object to be used on all instances on which the property is registered. -- `inherits`: Specified that the property's default value should come from -the parent control. -- `defaultBindingMode`: The default binding mode for the property. Can be set to -`OneWay`, `TwoWay`, `OneTime` or `OneWayToSource`. -- `validate`: A validation/coercion function of type -`Func`. The function accepts the instance of the class -on which the property is being set and the value and returns the coerced value -or throws an exception for an invalid value. - -## Using a StyledProperty on Another Class - -Sometimes the property you want to add to your control already exists on another -control, `Background` being a good example. To register a property defined on -another control, you call `StyledProperty.AddOwner`: - - -```c# - public static readonly StyledProperty BackgroundProperty = - Border.BackgroundProperty.AddOwner(); - - public Brush Background - { - get { return GetValue(BackgroundProperty); } - set { SetValue(BackgroundProperty, value); } - } -``` - -*Note: Unlike WPF, a property must be registered on a class otherwise it cannot -be set on an object of that class.* - -## Attached Properties - -Attached properties are defined almost identically to styled properties except -that they are registered using the `RegisterAttached` method and their accessors -are defined as static methods. - -Here's how `Grid` defines its `Grid.Column` attached property: - -```c# - public static readonly AttachedProperty ColumnProperty = - AvaloniaProperty.RegisterAttached("Column"); - - public static int GetColumn(Control element) - { - return element.GetValue(ColumnProperty); - } - - public static void SetColumn(Control element, int value) - { - element.SetValue(ColumnProperty, value); - } -``` - -## Readonly AvaloniaProperties - -To create a readonly property you use the `AvaloniaProperty.RegisterDirect` -method. Here is how `Visual` registers the readonly `Bounds` property: - -```c# - public static readonly DirectProperty BoundsProperty = - AvaloniaProperty.RegisterDirect( - nameof(Bounds), - o => o.Bounds); - - private Rect _bounds; - - public Rect Bounds - { - get { return _bounds; } - private set { SetAndRaise(BoundsProperty, ref _bounds, value); } - } -``` - -As can be seen, readonly properties are stored as a field on the object. When -registering the property, a getter is passed which is used to access the -property value through `GetValue` and then `SetAndRaise` is used to notify -listeners to changes to the property. - -## Direct AvaloniaProperties - -As its name suggests, `RegisterDirect` isn't just used for registering readonly -properties. You can also pass a *setter* to `RegisterDirect` to expose a -standard C# property as a Avalonia property. - -A `StyledProperty` which is registered using `AvaloniaProperty.Register` -maintains a prioritized list of values and bindings that allow styles to work. -However, this is overkill for many properties, such as `ItemsControl.Items` - -this will never be styled and the overhead involved with styled properties is -unnecessary. - -Here is how `ItemsControl.Items` is registered: - -```c# - public static readonly DirectProperty ItemsProperty = - AvaloniaProperty.RegisterDirect( - nameof(Items), - o => o.Items, - (o, v) => o.Items = v); - - private IEnumerable _items = new AvaloniaList(); - - public IEnumerable Items - { - get { return _items; } - set { SetAndRaise(ItemsProperty, ref _items, value); } - } -``` - - -Direct properties are a lightweight version of styled properties that support -the following: - -- AvaloniaObject.GetValue -- AvaloniaObject.SetValue for non-readonly properties -- PropertyChanged -- Binding (only with LocalValue priority) -- GetObservable -- AddOwner -- Metadata - -They don't support the following: - -- Validation/Coercion (although this could be done in the property setter) -- Overriding default values. -- Inherited values - -## Using a DirectProperty on Another Class - -In the same way that you can call `AddOwner` on a styled property, you can also -add an owner to a direct property. Because direct properties reference fields -on the control, you must also add a field for the property: - -```c# - public static readonly DirectProperty ItemsProperty = - ItemsControl.ItemsProperty.AddOwner( - o => o.Items, - (o, v) => o.Items = v); - - private IEnumerable _items = new AvaloniaList(); - - public IEnumerable Items - { - get { return _items; } - set { SetAndRaise(ItemsProperty, ref _items, value); } - } -``` - -## When to use a Direct vs a Styled Property - -Direct properties have advantages and disadvantages: - -Pros: -- No additional object is allocated per-instance for the property -- Property getter is a standard C# property getter -- Property setter is is a standard C# property setter that raises an event. - -Cons: -- Cannot inherit value from parent control -- Cannot take advantage of Avalonia's styling system -- Property value is a field and as such is allocated whether the property is -set on the object or not - -So use direct properties when you have the following requirements: -- Property will not need to be styled -- Property will usually or always have a value diff --git a/docs/spec/logging.md b/docs/spec/logging.md deleted file mode 100644 index 60b8689d84..0000000000 --- a/docs/spec/logging.md +++ /dev/null @@ -1,54 +0,0 @@ -# Avalonia Logging - -Avalonia uses [Serilog](https://github.com/serilog/serilog) for logging via -the Avalonia.Logging.Serilog assembly. - -The following method should be present in your App.xaml.cs file: - -```C# -private void InitializeLogging() -{ -#if DEBUG - SerilogLogger.Initialize(new LoggerConfiguration() - .MinimumLevel.Warning() - .WriteTo.Trace(outputTemplate: "{Area}: {Message}") - .CreateLogger()); -#endif -} -``` - -By default, this logging setup will write log messages with a severity of -`Warning` or higher to `System.Diagnostics.Trace`. See the [Serilog -documentation](https://github.com/serilog/serilog/wiki/Configuration-Basics) -for more information on the options here. - -## Areas - -Each Avalonia log message has an "Area" that can be used to filter the log to -include only the type of events that you are interested in. These are currently: - -- Property -- Binding -- Visual -- Layout -- Control - -To limit the log output to a specific area you can add a filter; for example -to enable verbose logging but only about layout: - -```C# -SerilogLogger.Initialize(new LoggerConfiguration() - .Filter.ByIncludingOnly(Matching.WithProperty("Area", LogArea.Layout)) - .MinimumLevel.Verbose() - .WriteTo.Trace(outputTemplate: "{Area}: {Message}") - .CreateLogger()); -``` - -## Removing Serilog - -If you don't want a dependency on Serilog in your application, simply remove -the reference to Avalonia.Logging.Serilog and the code that initializes it. If -you do however still want some kinda of logging, there are two steps: - -- Implement `Avalonia.Logging.ILogSink` -- Assign your implementation to `Logger.Sink` diff --git a/docs/spec/styles.md b/docs/spec/styles.md deleted file mode 100644 index c1b27d6418..0000000000 --- a/docs/spec/styles.md +++ /dev/null @@ -1,111 +0,0 @@ -# Styling in Avalonia - -The main difference between Avalonia and existing XAML toolkits such as WPF and -UWP is in styling. Styling in Avalonia uses a CSS-like system that aims to be -more powerful and flexible than existing XAML styling systems. For convenience -for the rest of this document we'll refer to existing XAML toolkit's styling as -"WPF styling" as that's where it originated. - -## Basics - -- Styles are defined on the `Control.Styles` collection (as opposed to in -`ResourceDictionaries` in WPF). -- Styles have a `Selector` and a collection of `Setter`s -- Selector works like a CSS selector. -- Setters function like WPF's setters. -- Styles are applied to a control and all its descendants, depending on whether - the selector matches. - -## Simple example - -Make all `Button`s in a `StackPanel` have a blue `Background`: - -```xaml - - - - - - -``` - -This is very similar to WPF, except `TargetType` is replaced by `Selector`. - -_Note that currently (as of Alpha 2) you **always** need to specify the fully -qualified property name (i.e. `Button.Background` instead of simply -`Background`). This restriction will be lifted in future._ - -## Style Classes - -As in CSS, controls can be given *style classes* which can be used in selectors: - -```xaml - - - - - - - -``` - -Each control can be given 0 or more style classes. This is different to WPF -where only a single style can be applied to a control: in Avalonia any number -of separate styles can be applied to a control. If more than one style affects -a particular property, the style closest to the control will take precedence. - -Style classes can also be manipulated in code using the `Classes` collection: - -```csharp -control.Classes.Add("blue"); -control.Classes.Remove("red"); -``` - -## Pseudoclasses - -Also as in CSS, controls can have pseudoclasses; these are classes that are -defined by the control itself rather than by the user. Pseudoclasses start -with a `:` character. - -One example of a pseudoclass is the `:pointerover` -pseudoclass (`:hover` in CSS - we may change to that in future). - -Pseudoclasses provide the functionality of `Triggers` in WPF and -`VisualStateManager` in UWP: - -```xaml - - - - - - -``` - -Other pseudoclasses include `:focus`, `:disabled`, `:pressed` for buttons, -`:checked` for checkboxes etc. - -## Named Controls - -Named controls can be selected using `#` as in CSS, e.g. `Button#Name`. - -## Children - -As with CSS, you can select children and descendants: - -- `StackPanel > Button#Foo` selects a `Button` named `"Foo"` that is the child - of a `StackPanel`. -- `StackPanel Button.foo` selects all `Button`s with the `foo` class that are - descendants of a `StackPanel`. - -## Templates - -You can select controls in the template of a lookless control by using the -`/template/` selector, so `Button /template/ Border#outline` selects `Border` -controls named `"outline"` in the template of a `Button`. diff --git a/docs/spec/toc.yml b/docs/spec/toc.yml deleted file mode 100644 index b0981017e0..0000000000 --- a/docs/spec/toc.yml +++ /dev/null @@ -1,14 +0,0 @@ -- name: Avalonia Architecture - href: architecture.md -- name: Styling in Avalonia - href: styles.md -- name: Defining Properties - href: defining-properties.md -- name: Working with Properties - href: working-with-properties.md -- name: Logging - href: logging.md -- name: Binding from XAML - href: binding-from-xaml.md -- name: Binding from Code - href: binding-from-code.md diff --git a/docs/spec/working-with-properties.md b/docs/spec/working-with-properties.md deleted file mode 100644 index a8a383b733..0000000000 --- a/docs/spec/working-with-properties.md +++ /dev/null @@ -1,102 +0,0 @@ -# Working with Properties - -Avalonia controls expose their properties as standard CLR properties, so for -reading and writing values there's no surprises: - -```c# - // Create a TextBlock and set its Text property. - var textBlock = new TextBlock(); - textBlock.Text = "Hello World!"; -``` - - -However there's a lot more you can do with properties such as subscribing to -changes on the property, and binding. - -# Subscribing to Changes to a Property - -You can subscribe to changes on a property by calling the `GetObservable` -method. This returns an `IObservable` which can be used to listen for changes -to the property: - -```c# - var textBlock = new TextBlock(); - var text = textBlock.GetObservable(TextBlock.TextProperty); -``` - -Each property that can be subscribed to has a static readonly field called -`[PropertyName]Property` which is passed to `GetObservable` in order to -subscribe to the property's changes. - -`IObservable` (part of Reactive Extensions, or rx for short) is out of scope -for this guide, but here's an example which uses the returned observable to -print a message with the changing property values to the console: - -```c# - var textBlock = new TextBlock(); - var text = textBlock.GetObservable(TextBlock.TextProperty); - text.Subscribe(value => Console.WriteLine(value + " Changed")); -``` - -When the returned observable is subscribed, it will return the current value -of the property immediately and then push a new value each time the property -changes. If you don't want the current value, you can use the rx `Skip` -operator: - -```c# - var text = textBlock.GetObservable(TextBlock.TextProperty).Skip(1); -``` - -# Binding a property - -Observables don't just go one way! You can also use them to bind properties. -For example here we create two `TextBlock`s and bind the second's `Text` -property to the first: - -```c# - var textBlock1 = new TextBlock(); - var textBlock2 = new TextBlock(); - - // Get an observable for the first text block's Text property. - var source = textBlock1.GetObservable(TextBlock.TextProperty); - - // And bind it to the second. - textBlock2.Bind(TextBlock.TextProperty, source); - - // Changes to the first TextBlock's Text property will now be propagated - // to the second. - textBlock1.Text = "Goodbye Cruel World"; - - // Prints "Goodbye Cruel World" - Console.WriteLine(textBlock2.Text); -``` - -To read more about creating bindings from code, see [Binding from Code](binding-from-code.md). - -# Subscribing to a Property on Any Object - -The `GetObservable` method returns an observable that tracks changes to a -property on a single instance. However, if you're writing a control you may -want to implement an `OnPropertyChanged` method. In WPF this is done by passing -a static `PropertyChangedCallback` to the `DependencyProperty` registration -method, but in Avalonia it's slightly different (and hopefully easier!) - -The field which defines the property is derived from `AvaloniaProperty` and this -has a `Changed` observable which is fired every time the property changes on -*any* object. In addition there is an `AddClassHandler` extension method which -can automatically route the event to a method on your control. - -For example if you want to listen to changes to your control's `Foo` property -you'd do it like this: - -```c# - static MyControl() - { - FooProperty.Changed.AddClassHandler(x => x.FooChanged); - } - - private void FooChanged(AvaloniaPropertyChangedEventArgs e) - { - // The 'e' parameter describes what's changed. - } -``` diff --git a/docs/template/partials/footer.tmpl.partial b/docs/template/partials/footer.tmpl.partial deleted file mode 100644 index c9b8ba35e3..0000000000 --- a/docs/template/partials/footer.tmpl.partial +++ /dev/null @@ -1,13 +0,0 @@ -{{!Copyright (c) Microsoft. All rights reserved. Licensed under the MIT license. See LICENSE file in the project root for full license information.}} - -
-
- -
diff --git a/docs/toc.yml b/docs/toc.yml deleted file mode 100644 index 3720b4fcbe..0000000000 --- a/docs/toc.yml +++ /dev/null @@ -1,10 +0,0 @@ -- name: Home - href: index.md -- name: Getting Started - href: tutorial/ -- name: Guidelines - href: guidelines/ -- name: Specifications - href: spec/ -- name: API Documentation - href: api/ diff --git a/docs/tutorial/from-wpf.md b/docs/tutorial/from-wpf.md deleted file mode 100644 index d244fb076b..0000000000 --- a/docs/tutorial/from-wpf.md +++ /dev/null @@ -1,161 +0,0 @@ -# Avalonia for WPF Developers - -Avalonia is in general very similar to WPF, but you will find differences. Here -are the most common: - -## Styling - -The most obvious difference from other XAML frameworks is that Avalonia uses a -[CSS-like styling system](../spec/styles.md). Styles aren't stored in a -`Resources` collection as in WPF, they are stored in a separate `Styles` -collection: - - - - - - - Header - - -## DataTemplates - -As styles aren't stored in `Resources`, neither are `DataTemplates` ([in fact -there is no `Resources` collection](#resources)). Instead, `DataTemplates` are -placed in a `DataTemplates` collection on each control (and on `Application`): - - - - - - - - - - - - - -Data templates in Avalonia can also target interfaces and derived classes (which -cannot be done in WPF) and so the order of `DataTemplate`s can be important: -`DataTemplate`s within the same collection are evaluated in declaration order -so you need to place them from most-specific to least-specific as you would in -code. - -## HierachicalDataTemplate - -WPF's `HierarchicalDataTemplate` is called `TreeDataTemplate` in Avalonia (as the -former is difficult to type!). The two are almost entirely equivalent except -that the `ItemTemplate` property is not present in Avalonia. - -## UIElement, FrameworkElement and Control - -WPF's `UIElement` and `FrameworkElement` are non-templated control base classes, -which roughly equate to the Avalonia `Control` class. WPF's `Control` class on -the other hand is a templated control - Avalonia's equivalent of this is -`TemplatedControl`. - -So to recap: - -- `UIElement`: `Control` -- `FrameworkElement`: `Control` -- `Control`: `TemplatedControl` - -## DependencyProperty - -The Avalonia equivalent of `DependencyProperty` is `StyledProperty`, however -Avalonia [has a richer property system than WPF](../spec/defining-properties.md), -and includes `DirectProperty` for turning standard CLR properties into Avalonia -properties. The common base class of `StyledProperty` and `DirectProperty` -is `AvaloniaProperty`. - -## Grid - -Column and row definitions can be specified in Avalonia using strings, avoiding -the clunky syntax in WPF: - - - -A common use of `Grid` in WPF is to stack two controls on top of each other. -For this purpose in Avalonia you can just use a `Panel` which is more lightweight -than `Grid`. - -We don't yet support `SharedSizeScope` in `Grid`. - -## ItemsControl - -In WPF, `ItemsControl` and derived classes such as `ListBox` have two separate -items properties: `Items` and `ItemsSource`. Avalonia however just has a single -one: `Items`. - -## Tunnelling Events - -Avalonia has tunnelling events (unlike UWP!) but they're not exposed via -separate `Preview` CLR event handlers. To subscribe to a tunnelling event you -must call `AddHandler` with `RoutingStrategies.Tunnel`: - -``` -target.AddHandler(InputElement.KeyDownEvent, OnPreviewKeyDown, RoutingStrategies.Tunnel); - -void OnPreviewKeyDown(object sender, KeyEventArgs e) -{ - // Handler code -} -``` - -## Class Handlers - -In WPF, class handlers for events can be added by calling -[EventManager.RegisterClassHandler](https://msdn.microsoft.com/en-us/library/ms597875.aspx). -An example of registering a class handler in WPF might be: - - static MyControl() - { - EventManager.RegisterClassHandler(typeof(MyControl), MyEvent, HandleMyEvent)); - } - - private static void HandleMyEvent(object sender, RoutedEventArgs e) - { - } - -The equivalent of this in Avalonia would be: - - static MyControl() - { - MyEvent.AddClassHandler(x => x.HandleMyEvent); - } - - private void HandleMyEvent(object sender, RoutedEventArgs e) - { - } - -Notice that in WPF you have to add the class handler as a static method, whereas -in Avalonia the class handler is not static: the notification is automatically -directed to the correct instance. - -## PropertyChangedCallback - -Listening to changes on DependencyProperties in WPF can be complex. When you -register a `DependencyProperty` you can supply a static `PropertyChangedCallback` -but if you want to listen to changes from elsewhere [things can get complicated -and error-prone](http://stackoverflow.com/questions/23682232). - -In Avalonia, there is no `PropertyChangedCallback` at the time of registration, -instead a class listener is [added to the control's static constructor in much -the same way that event class listeners are added](../spec/working-with-properties.md#subscribing-to-a-property-on-any-object). - -## RenderTransforms and RenderTransformOrigin - -RenderTransformOrigins are different in WPF and Avalonia: If you apply a `RenderTransform`, keep in mind that our default value for the RenderTransformOrigin is `RelativePoint.Center`. In WPF the default value is `RelativePoint.TopLeft` (0, 0). In controls like Viewbox (currently being developed) the same code will lead to a different rendering behavior: - -In WPF: -![WPF](https://files.gitter.im/AvaloniaUI/Avalonia/cDrM/image.png) - -In Avalonia: -![Avalonia](https://files.gitter.im/AvaloniaUI/Avalonia/KGk7/image.png) - -In AvaloniaUI, to get the same scale transform we should indicate that the RenderTransformOrigin is the TopLeft part of the Visual. diff --git a/docs/tutorial/gettingstarted.md b/docs/tutorial/gettingstarted.md deleted file mode 100644 index 5b7fe436a7..0000000000 --- a/docs/tutorial/gettingstarted.md +++ /dev/null @@ -1,10 +0,0 @@ -# Getting Started - -## Windows - -![](images/add-dialogs.png) - -The easiest way to try out Avalonia is to install the [Visual Studio Extension](https://marketplace.visualstudio.com/items?itemName=AvaloniaTeam.AvaloniaforVisualStudio). - -This will add a Avalonia project template and a Window template to the standard Visual Studo “Add” -dialog (yes, icons still to come :) ): diff --git a/docs/tutorial/images/add-dialogs.png b/docs/tutorial/images/add-dialogs.png deleted file mode 100644 index d1f1d2f81a2b49007ffc986f99d9ac57a762f6cc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 45998 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 O&&JZ;g8Z}lt^Wan*%sIU diff --git a/docs/tutorial/nuget.md b/docs/tutorial/nuget.md deleted file mode 100644 index b5f8f50242..0000000000 --- a/docs/tutorial/nuget.md +++ /dev/null @@ -1,86 +0,0 @@ -# Avalonia NuGet Packages - -Avalonia is divided into several `NuGet` packages. - -* The `Avalonia` package contains core portable class libraries. -* The `Dekstop` and `Mobile` packages contain platform specific windowing and rendering back-ends. -* The `Avalonia.Desktop` package is intended to be used by the end users targeting multiple desktop platforms (`Windows`, `Linux` and `OSX`). -* The `Avalonia.iOS` and `Avalonia.Android` packages are intended to be used by the end users targeting specific mobile platforms. -* The `Avalonia.Mobile` package is intended to be used by the end users targeting multiple mobile platforms (`Android` and `iOS`). - -## Core - -* Avalonia (.nupkg) - - Avalonia.Animation (.dll) - - Avalonia.Base (.dll) - - Avalonia.Controls (.dll) - - Avalonia.DesignerSupport (.dll) - - Avalonia.Diagnostics (.dll) - - Avalonia.Input (.dll) - - Avalonia.Interactivity (.dll) - - Avalonia.Layout (.dll) - - Avalonia.Logging.Serilog (.dll) - - Avalonia.Visuals (.dll) - - Avalonia.Styling (.dll) - - Avalonia.ReactiveUI (.dll) - - Avalonia.Themes.Default (.dll) - - Avalonia.Markup (.dll) - - Avalonia.Markup.Xaml (.dll) - - Serilog (.nupkg) - - Splat (.nupkg) - - Sprache (.nupkg) - - System.Reactive (.nupkg) - -* Avalonia.HtmlRenderer (.nupkg) - - Avalonia (.nupkg) - -## Desktop - -* Avalonia.Win32 (.nupkg) - - Avalonia.Win32 (.dll) - - Avalonia (.nupkg) - -* Avalonia.Direct2D1 (.nupkg) - - Avalonia.Direct2D1 (.dll) - - Avalonia (.nupkg) - - SharpDX (.nupkg) - - SharpDX.Direct2D1 (.nupkg) - - SharpDX.DXGI (.nupkg) - -* Avalonia.Gtk (.nupkg) - - Avalonia.Gtk (.dll) - - Avalonia (.nupkg) - -* Avalonia.Cairo (.nupkg) - - Avalonia.Cairo (.dll) - - Avalonia (.nupkg) - -* Avalonia.Skia.Desktop (.nupkg) - - Avalonia.Skia.Desktop (.dll) - - Avalonia (.nupkg) - - SkiaSharp (.nupkg) - -* Avalonia.Desktop (.nupkg) - - Avalonia.Win32 (.nupkg) - - Avalonia.Direct2D1 (.nupkg) - - Avalonia.Gtk (.nupkg) - - Avalonia.Cairo (.nupkg) - - Avalonia.Skia.Desktop (.nupkg) - -## Mobile - -* Avalonia.Android (.nupkg) - - Avalonia.Android (.dll) - - Avalonia.Skia.Android (.dll) - - Avalonia (.nupkg) - - SkiaSharp (.nupkg) - -* Avalonia.iOS (.nupkg) - - Avalonia.iOS (.dll) - - Avalonia.Skia.iOS (.dll) - - Avalonia (.nupkg) - - SkiaSharp (.nupkg) - -* Avalonia.Mobile (.nupkg) - - Avalonia.Android (.nupkg) - - Avalonia.iOS (.nupkg) diff --git a/docs/tutorial/toc.yml b/docs/tutorial/toc.yml deleted file mode 100644 index 4f46813cd8..0000000000 --- a/docs/tutorial/toc.yml +++ /dev/null @@ -1,6 +0,0 @@ -- name: Getting Started - href: gettingstarted.md -- name: Avalonia NuGet Packages - href: nuget.md -- name: Avalonia for WPF Developers - href: from-wpf.md diff --git a/readme.md b/readme.md index 28cb638a7c..906c3a4b5c 100644 --- a/readme.md +++ b/readme.md @@ -14,11 +14,11 @@ Avalonia is a WPF-inspired cross-platform XAML-based UI framework providing a fl | Control catalog | Desktop platforms | Mobile platforms | |---|---|---| -| | | | +| | | | ## Getting Started -Avalonia [Visual Studio Extension](https://marketplace.visualstudio.com/items?itemName=AvaloniaTeam.AvaloniaforVisualStudio) contains project and control templates that will help you get started. After installing it, open "New Project" dialog in Visual Studio, choose "Avalonia" in "Visual C#" section, select "Avalonia .NET Core Application" and press OK (screenshot). Now you can write code and markup that will work on multiple platforms! +Avalonia [Visual Studio Extension](https://marketplace.visualstudio.com/items?itemName=AvaloniaTeam.AvaloniaforVisualStudio) contains project and control templates that will help you get started. After installing it, open "New Project" dialog in Visual Studio, choose "Avalonia" in "Visual C#" section, select "Avalonia .NET Core Application" and press OK (screenshot). Now you can write code and markup that will work on multiple platforms! Avalonia is delivered via NuGet package manager. You can find the packages here: ([stable(ish)](https://www.nuget.org/packages/Avalonia/), [nightly](https://github.com/AvaloniaUI/Avalonia/wiki/Using-nightly-build-feed)) @@ -35,16 +35,16 @@ https://ci.appveyor.com/project/AvaloniaUI/Avalonia/branch/master/artifacts ## Documentation -As mentioned above, Avalonia is still in alpha and as such there's not much documentation yet. You can take a look at the [getting started page](docs/tutorial/gettingstarted.md) for an overview of how to get started but probably the best thing to do for now is to already know a little bit about WPF/Silverlight/UWP/XAML and ask questions in our [Gitter room](https://gitter.im/AvaloniaUI/Avalonia). +As mentioned above, Avalonia is still in alpha and as such there's not much documentation yet. You can take a look at the [getting started page](http://avaloniaui.net/tutorial/gettingstarted) for an overview of how to get started but probably the best thing to do for now is to already know a little bit about WPF/Silverlight/UWP/XAML and ask questions in our [Gitter room](https://gitter.im/AvaloniaUI/Avalonia). -There's also a high-level [architecture document](docs/spec/architecture.md) that is currently a little bit out of date, and I've also started writing blog posts on Avalonia at http://grokys.github.io/. +There's also a high-level [architecture document](http://avaloniaui.net/spec/architecture) that is currently a little bit out of date, and I've also started writing blog posts on Avalonia at http://grokys.github.io/. Contributions are always welcome! ## Building and Using -See the [build instructions here](docs/guidelines/build.md). +See the [build instructions here](http://avaloniaui.net/guidelines/build). ## Contributing -Please read the [contribution guidelines](docs/guidelines/contributing.md) before submitting a pull request. +Please read the [contribution guidelines](http://avaloniaui.net/guidelines/contributing) before submitting a pull request. From ac9a8d74b87b451529c18a4f9832b97efcee018a Mon Sep 17 00:00:00 2001 From: brandonhood Date: Sat, 14 Oct 2017 18:23:36 -0400 Subject: [PATCH 41/69] Update Control.cs Updated the setter for Name to use IsNullOrWhiteSpace to both protect against null and do the emptiness check --- src/Avalonia.Controls/Control.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Avalonia.Controls/Control.cs b/src/Avalonia.Controls/Control.cs index 14beb2eab7..89c4f9279a 100644 --- a/src/Avalonia.Controls/Control.cs +++ b/src/Avalonia.Controls/Control.cs @@ -175,9 +175,9 @@ namespace Avalonia.Controls set { - if (value.Trim() == string.Empty) + if (String.IsNullOrWhiteSpace(value)) { - throw new InvalidOperationException("Cannot set Name to empty string."); + throw new InvalidOperationException("Cannot set Name to null or empty string."); } if (_styled) From 4ecbea9d5e12324663799fa9eb3bbd60a54cbcd6 Mon Sep 17 00:00:00 2001 From: Jeremy Koritzinsky Date: Sun, 15 Oct 2017 14:54:23 -0500 Subject: [PATCH 42/69] Remove unneeded markup extensions. --- Avalonia.sln | 3 ++- .../Avalonia.Markup.Xaml.csproj | 2 -- .../MarkupExtensions/StaticExtension.cs | 25 ------------------- .../MarkupExtensions/TypeExtension.cs | 23 ----------------- 4 files changed, 2 insertions(+), 51 deletions(-) delete mode 100644 src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/StaticExtension.cs delete mode 100644 src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/TypeExtension.cs diff --git a/Avalonia.sln b/Avalonia.sln index 7f516667ee..c6509817ce 100644 --- a/Avalonia.sln +++ b/Avalonia.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 15 -VisualStudioVersion = 15.0.26730.3 +VisualStudioVersion = 15.0.26730.10 MinimumVisualStudioVersion = 10.0.40219.1 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Avalonia.Base", "src\Avalonia.Base\Avalonia.Base.csproj", "{B09B78D8-9B26-48B0-9149-D64A2F120F3F}" EndProject @@ -204,6 +204,7 @@ Global tests\Avalonia.RenderTests\Avalonia.RenderTests.projitems*{48840edd-24bf-495d-911e-2eb12ae75d3b}*SharedItemsImports = 13 src\Shared\PlatformSupport\PlatformSupport.projitems*{4a1abb09-9047-4bd5-a4ad-a055e52c5ee0}*SharedItemsImports = 4 src\Shared\PlatformSupport\PlatformSupport.projitems*{7863ea94-f0fb-4386-bf8c-e5bfa761560a}*SharedItemsImports = 4 + src\Shared\PlatformSupport\PlatformSupport.projitems*{7b92af71-6287-4693-9dcb-bd5b6e927e23}*SharedItemsImports = 4 src\Shared\RenderHelpers\RenderHelpers.projitems*{7d2d3083-71dd-4cc9-8907-39a0d86fb322}*SharedItemsImports = 4 src\Windows\Avalonia.Win32\Avalonia.Win32.Shared.projitems*{811a76cf-1cf6-440f-963b-bbe31bd72a82}*SharedItemsImports = 4 src\Windows\Avalonia.Win32\Avalonia.Win32.Shared.projitems*{9defc6b7-845b-4d8f-afc0-d32bf0032b8c}*SharedItemsImports = 13 diff --git a/src/Markup/Avalonia.Markup.Xaml/Avalonia.Markup.Xaml.csproj b/src/Markup/Avalonia.Markup.Xaml/Avalonia.Markup.Xaml.csproj index de015fc947..e07c22d750 100644 --- a/src/Markup/Avalonia.Markup.Xaml/Avalonia.Markup.Xaml.csproj +++ b/src/Markup/Avalonia.Markup.Xaml/Avalonia.Markup.Xaml.csproj @@ -77,9 +77,7 @@ - - diff --git a/src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/StaticExtension.cs b/src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/StaticExtension.cs deleted file mode 100644 index c084e362c2..0000000000 --- a/src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/StaticExtension.cs +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright (c) The Avalonia Project. All rights reserved. -// Licensed under the MIT license. See licence.md file in the project root for full license information. - -using System; - -namespace Avalonia.Markup.Xaml.MarkupExtensions -{ - public class StaticExtension : Portable.Xaml.Markup.StaticExtension - { - public StaticExtension() - { - } - - public StaticExtension(string member) - : base(member) - { - } - - public override object ProvideValue(IServiceProvider serviceProvider) - { - return base.ProvideValue(serviceProvider); - } - } - -} \ No newline at end of file diff --git a/src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/TypeExtension.cs b/src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/TypeExtension.cs deleted file mode 100644 index 062096e746..0000000000 --- a/src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/TypeExtension.cs +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright (c) The Avalonia Project. All rights reserved. -// Licensed under the MIT license. See licence.md file in the project root for full license information. - -using System; - -namespace Avalonia.Markup.Xaml.MarkupExtensions -{ - public class TypeExtension : Portable.Xaml.Markup.TypeExtension - { - public TypeExtension() - { - } - - public TypeExtension(string typeName) : base(typeName) - { - } - - public override object ProvideValue(IServiceProvider serviceProvider) - { - return base.ProvideValue(serviceProvider); - } - } -} \ No newline at end of file From b0a1f3f3dff53d82efa4c3b763a69fed7aa04989 Mon Sep 17 00:00:00 2001 From: Jeremy Koritzinsky Date: Sun, 15 Oct 2017 15:42:19 -0500 Subject: [PATCH 43/69] Update tests to use `x:Static`. --- tests/Avalonia.Markup.Xaml.UnitTests/Xaml/BasicTests.cs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/tests/Avalonia.Markup.Xaml.UnitTests/Xaml/BasicTests.cs b/tests/Avalonia.Markup.Xaml.UnitTests/Xaml/BasicTests.cs index ce370790c3..8c7dad1bce 100644 --- a/tests/Avalonia.Markup.Xaml.UnitTests/Xaml/BasicTests.cs +++ b/tests/Avalonia.Markup.Xaml.UnitTests/Xaml/BasicTests.cs @@ -609,8 +609,8 @@ namespace Avalonia.Markup.Xaml.UnitTests.Xaml public void Multi_Xaml_Binding_Is_Parsed() { var xaml = -@" +@" "; @@ -818,10 +818,11 @@ do we need it?")] { var xaml = @" - + "; From 745517f68e601c2941b88fe10a249c9cbd5dd1e9 Mon Sep 17 00:00:00 2001 From: Jeremy Koritzinsky Date: Sun, 15 Oct 2017 15:47:48 -0500 Subject: [PATCH 44/69] Updated usage of Static and Type to be x:Static and x:Type. --- samples/ControlCatalog/SideBar.xaml | 6 +++--- samples/RenderTest/SideBar.xaml | 6 +++--- src/Avalonia.Themes.Default/TabControl.xaml | 6 +++--- src/Avalonia.Themes.Default/TextBox.xaml | 8 ++++---- .../Xaml/DataTemplateTests.cs | 9 +++++---- 5 files changed, 18 insertions(+), 17 deletions(-) diff --git a/samples/ControlCatalog/SideBar.xaml b/samples/ControlCatalog/SideBar.xaml index c03bc432d4..7fcd828ba3 100644 --- a/samples/ControlCatalog/SideBar.xaml +++ b/samples/ControlCatalog/SideBar.xaml @@ -1,11 +1,11 @@ - +