diff --git a/Avalonia.sln b/Avalonia.sln index 683e5af545..a6fdcbd421 100644 --- a/Avalonia.sln +++ b/Avalonia.sln @@ -4,7 +4,7 @@ VisualStudioVersion = 14.0.25420.1 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Avalonia.Base", "src\Avalonia.Base\Avalonia.Base.csproj", "{B09B78D8-9B26-48B0-9149-D64A2F120F3F}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Avalonia.SceneGraph", "src\Avalonia.SceneGraph\Avalonia.SceneGraph.csproj", "{EB582467-6ABB-43A1-B052-E981BA910E3A}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Avalonia.Visuals", "src\Avalonia.Visuals\Avalonia.Visuals.csproj", "{EB582467-6ABB-43A1-B052-E981BA910E3A}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Avalonia.Layout", "src\Avalonia.Layout\Avalonia.Layout.csproj", "{42472427-4774-4C81-8AFF-9F27B8E31721}" EndProject @@ -39,7 +39,7 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Avalonia.Styling.UnitTests" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Avalonia.Controls.UnitTests", "tests\Avalonia.Controls.UnitTests\Avalonia.Controls.UnitTests.csproj", "{5CCB5571-7C30-4E7D-967D-0E2158EBD91F}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Avalonia.SceneGraph.UnitTests", "tests\Avalonia.SceneGraph.UnitTests\Avalonia.SceneGraph.UnitTests.csproj", "{76716382-3159-460E-BDA6-C5715CF606D7}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Avalonia.Visuals.UnitTests", "tests\Avalonia.Visuals.UnitTests\Avalonia.Visuals.UnitTests.csproj", "{76716382-3159-460E-BDA6-C5715CF606D7}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Avalonia.Base.UnitTests", "tests\Avalonia.Base.UnitTests\Avalonia.Base.UnitTests.csproj", "{2905FF23-53FB-45E6-AA49-6AF47A172056}" EndProject diff --git a/appveyor.yml b/appveyor.yml index 2909da65b7..db7d129dd1 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -20,6 +20,11 @@ build_script: - ps: .\build.ps1 -Target "AppVeyor" -Platform "$env:platform" -Configuration "$env:configuration" after_build: - .\packages\JetBrains.dotMemoryUnit.2.1.20150828.125449\tools\dotMemoryUnit.exe -targetExecutable="%xunit20%\xunit.console.x86.exe" -returnTargetExitCode --"tests\Avalonia.LeakTests\bin\Release\Avalonia.LeakTests.dll" + +- "SET PATH=C:\\Python34;C:\\Python34\\Scripts;%PATH%" +- pip install codecov +- codecov -f "./artifacts/coverage.xml" + test: off artifacts: - path: artifacts\nuget\*.nupkg diff --git a/build.cake b/build.cake index d97d17218c..e902c5d24e 100644 --- a/build.cake +++ b/build.cake @@ -10,6 +10,7 @@ /////////////////////////////////////////////////////////////////////////////// #tool "nuget:?package=xunit.runner.console&version=2.1.0" +#tool "nuget:?package=OpenCover" /////////////////////////////////////////////////////////////////////////////// // USINGS @@ -92,6 +93,7 @@ var artifactsDir = (DirectoryPath)Directory("./artifacts"); var nugetRoot = artifactsDir.Combine("nuget"); var zipRoot = artifactsDir.Combine("zip"); var binRoot = artifactsDir.Combine("bin"); +var testsRoot = artifactsDir.Combine("tests"); var dirSuffix = configuration; var dirSuffixSkia = (isPlatformAnyCPU ? "x86" : platform) + "/" + configuration; @@ -240,8 +242,8 @@ var coreLibraries = new string[][] new [] { "./src/", "Avalonia.Layout", ".xml" }, new [] { "./src/", "Avalonia.Logging.Serilog", ".dll" }, new [] { "./src/", "Avalonia.Logging.Serilog", ".xml" }, - new [] { "./src/", "Avalonia.SceneGraph", ".dll" }, - new [] { "./src/", "Avalonia.SceneGraph", ".xml" }, + new [] { "./src/", "Avalonia.Visuals", ".dll" }, + new [] { "./src/", "Avalonia.Visuals", ".xml" }, new [] { "./src/", "Avalonia.Styling", ".dll" }, new [] { "./src/", "Avalonia.Styling", ".xml" }, new [] { "./src/", "Avalonia.ReactiveUI", ".dll" }, @@ -585,6 +587,7 @@ Task("Clean") CleanDirectory(nugetRoot); CleanDirectory(zipRoot); CleanDirectory(binRoot); + CleanDirectory(testsRoot); }); Task("Restore-NuGet-Packages") @@ -659,29 +662,56 @@ Task("Run-Unit-Tests") if (isRunningOnWindows) { - var windowsTests = GetFiles("./tests/Avalonia.DesignerSupport.Tests/bin/" + dirSuffix + "/*.Tests.dll") + - GetFiles("./tests/Avalonia.LeakTests/bin/" + dirSuffix + "/*.LeakTests.dll") + - GetFiles("./tests/Avalonia.RenderTests/bin/" + dirSuffix + "/*.RenderTests.dll"); + var leakTests = GetFiles("./tests/Avalonia.LeakTests/bin/" + dirSuffix + "/*.LeakTests.dll"); - unitTests.AddRange(windowsTests); + unitTests.AddRange(leakTests); } var toolPath = (isPlatformAnyCPU || isPlatformX86) ? "./tools/xunit.runner.console/tools/xunit.console.x86.exe" : "./tools/xunit.runner.console/tools/xunit.console.exe"; - var settings = new XUnit2Settings + var xUnitSettings = new XUnit2Settings { ToolPath = toolPath, - Parallelism = ParallelismOption.None + Parallelism = ParallelismOption.None, + ShadowCopy = false }; - settings.NoAppDomain = !isRunningOnWindows; + xUnitSettings.NoAppDomain = !isRunningOnWindows; - foreach (var file in unitTests) + var openCoverOutput = artifactsDir.GetFilePath(new FilePath("./coverage.xml")); + var openCoverSettings = new OpenCoverSettings() + .WithFilter("+[Avalonia.*]* -[*Test*]* -[ControlCatalog*]*") + .WithFilter("-[Avalonia.*]OmniXaml.* -[Avalonia.*]Glass.*") + .WithFilter("-[Avalonia.HtmlRenderer]TheArtOfDev.HtmlRenderer.* +[Avalonia.HtmlRenderer]TheArtOfDev.HtmlRenderer.Avalonia.* -[Avalonia.ReactiveUI]*"); + + openCoverSettings.ReturnTargetCodeOffset = 0; + + foreach(var test in unitTests.Where(testFile => FileExists(testFile))) + { + CopyDirectory(test.GetDirectory(), testsRoot); + } + + var testsInDirectoryToRun = new List(); + if(isRunningOnWindows) + { + testsInDirectoryToRun.AddRange(GetFiles("./artifacts/tests/*Tests.dll")); + } + else + { + testsInDirectoryToRun.AddRange(GetFiles("./artifacts/tests/*.UnitTests.dll")); + } + + if(isRunningOnWindows) + { + OpenCover(context => { + context.XUnit2(testsInDirectoryToRun, xUnitSettings); + }, openCoverOutput, openCoverSettings); + } + else { - Information("Running test " + file.GetFilenameWithoutExtension()); - XUnit2(file.FullPath, settings); + XUnit2(testsInDirectoryToRun, xUnitSettings); } }); diff --git a/docs/docfx.json b/docs/docfx.json index 2b86d31d57..d49ee066ed 100644 --- a/docs/docfx.json +++ b/docs/docfx.json @@ -18,7 +18,7 @@ "/src/Avalonia.Interactivity/Avalonia.Interactivity.csproj", "/src/Avalonia.Layout/Avalonia.Layout.csproj", "/src/Avalonia.ReactiveUI/Avalonia.ReactiveUI.csproj", - "/src/Avalonia.SceneGraph/Avalonia.SceneGraph.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", diff --git a/docs/spec/architecture.md b/docs/spec/architecture.md index 8966308a24..1245bdbfd4 100644 --- a/docs/spec/architecture.md +++ b/docs/spec/architecture.md @@ -40,7 +40,7 @@ The main class in the assembly is `Animatable`. Allows AvaloniaProperties to be animated and provides various utilities related to animation. -### Avalonia.SceneGraph +### Avalonia.Visuals The main class in this assembly is `Visual` and its interface `IVisual`. diff --git a/docs/tutorial/nuget.md b/docs/tutorial/nuget.md index 314575258c..b5f8f50242 100644 --- a/docs/tutorial/nuget.md +++ b/docs/tutorial/nuget.md @@ -20,7 +20,7 @@ Avalonia is divided into several `NuGet` packages. - Avalonia.Interactivity (.dll) - Avalonia.Layout (.dll) - Avalonia.Logging.Serilog (.dll) - - Avalonia.SceneGraph (.dll) + - Avalonia.Visuals (.dll) - Avalonia.Styling (.dll) - Avalonia.ReactiveUI (.dll) - Avalonia.Themes.Default (.dll) diff --git a/readme.md b/readme.md index 0da6980146..0cc2b05e9d 100644 --- a/readme.md +++ b/readme.md @@ -1,9 +1,9 @@ # Avalonia -[![Gitter](https://badges.gitter.im/Join Chat.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) +| Gitter Chat | Windows Build Status | Linux/Mac Build Status | Code Coverage | +|---|---|---|---| +| [![Gitter](https://badges.gitter.im/Join Chat.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) | [![codecov](https://codecov.io/gh/AvaloniaUI/Avalonia/branch/master/graph/badge.svg)](https://codecov.io/gh/AvaloniaUI/Avalonia) | A multi-platform .NET UI framework. It can run on Windows, Linux, Mac OS X, iOS and Android. diff --git a/samples/BindingTest/BindingTest.csproj b/samples/BindingTest/BindingTest.csproj index a1d79472d8..2dc0cd445b 100644 --- a/samples/BindingTest/BindingTest.csproj +++ b/samples/BindingTest/BindingTest.csproj @@ -148,9 +148,9 @@ {6417b24e-49c2-4985-8db2-3ab9d898ec91} Avalonia.ReactiveUI - + {eb582467-6abb-43a1-b052-e981ba910e3a} - Avalonia.SceneGraph + Avalonia.Visuals {f1baa01a-f176-4c6a-b39d-5b40bb1b148f} diff --git a/samples/BindingTest/MainWindow.xaml b/samples/BindingTest/MainWindow.xaml index 02c364346d..95f671fd84 100644 --- a/samples/BindingTest/MainWindow.xaml +++ b/samples/BindingTest/MainWindow.xaml @@ -41,6 +41,10 @@ + + + + diff --git a/samples/BindingTest/ViewModels/MainWindowViewModel.cs b/samples/BindingTest/ViewModels/MainWindowViewModel.cs index 94f7ff595a..4b58bf2279 100644 --- a/samples/BindingTest/ViewModels/MainWindowViewModel.cs +++ b/samples/BindingTest/ViewModels/MainWindowViewModel.cs @@ -3,6 +3,8 @@ using System.Collections.ObjectModel; using System.Linq; using ReactiveUI; using System.Reactive.Linq; +using System.Threading.Tasks; +using System.Threading; namespace BindingTest.ViewModels { @@ -12,6 +14,7 @@ namespace BindingTest.ViewModels private double _doubleValue = 5.0; private string _stringValue = "Simple Binding"; private bool _booleanFlag = false; + private string _currentTime; public MainWindowViewModel() { @@ -37,6 +40,15 @@ namespace BindingTest.ViewModels BooleanFlag = !BooleanFlag; StringValue = param.ToString(); }); + + Task.Run(() => + { + while (true) + { + CurrentTime = DateTimeOffset.Now.ToString(); + Thread.Sleep(1000); + } + }); } public ObservableCollection Items { get; } @@ -67,6 +79,12 @@ namespace BindingTest.ViewModels set { this.RaiseAndSetIfChanged(ref _booleanFlag, value); } } + public string CurrentTime + { + get { return _currentTime; } + private set { this.RaiseAndSetIfChanged(ref _currentTime, value); } + } + public ReactiveCommand StringValueCommand { get; } public DataAnnotationsErrorViewModel DataAnnotationsValidation { get; } = new DataAnnotationsErrorViewModel(); diff --git a/samples/ControlCatalog.Android/ControlCatalog.Android.csproj b/samples/ControlCatalog.Android/ControlCatalog.Android.csproj index f83b1f3422..5b39aa3dfb 100644 --- a/samples/ControlCatalog.Android/ControlCatalog.Android.csproj +++ b/samples/ControlCatalog.Android/ControlCatalog.Android.csproj @@ -129,9 +129,9 @@ {42472427-4774-4c81-8aff-9f27b8e31721} Avalonia.Layout - + {eb582467-6abb-43a1-b052-e981ba910e3a} - Avalonia.SceneGraph + Avalonia.Visuals {f1baa01a-f176-4c6a-b39d-5b40bb1b148f} diff --git a/samples/ControlCatalog.Desktop/ControlCatalog.Desktop.csproj b/samples/ControlCatalog.Desktop/ControlCatalog.Desktop.csproj index 82f4ee1c28..53cb277233 100644 --- a/samples/ControlCatalog.Desktop/ControlCatalog.Desktop.csproj +++ b/samples/ControlCatalog.Desktop/ControlCatalog.Desktop.csproj @@ -112,9 +112,9 @@ {B61B66A3-B82D-4875-8001-89D3394FE0C9} Avalonia.Logging.Serilog - + {eb582467-6abb-43a1-b052-e981ba910e3a} - Avalonia.SceneGraph + Avalonia.Visuals {F1BAA01A-F176-4C6A-B39D-5B40BB1B148F} diff --git a/samples/ControlCatalog.iOS/ControlCatalog.iOS.csproj b/samples/ControlCatalog.iOS/ControlCatalog.iOS.csproj index 0e85a4e865..1c4d31b62c 100644 --- a/samples/ControlCatalog.iOS/ControlCatalog.iOS.csproj +++ b/samples/ControlCatalog.iOS/ControlCatalog.iOS.csproj @@ -144,9 +144,9 @@ {42472427-4774-4C81-8AFF-9F27B8E31721} Avalonia.Layout - + {EB582467-6ABB-43A1-B052-E981BA910E3A} - Avalonia.SceneGraph + Avalonia.Visuals {F1BAA01A-F176-4C6A-B39D-5B40BB1B148F} diff --git a/samples/ControlCatalog/ControlCatalog.csproj b/samples/ControlCatalog/ControlCatalog.csproj index 63c82d9e8a..f4a0915dd1 100644 --- a/samples/ControlCatalog/ControlCatalog.csproj +++ b/samples/ControlCatalog/ControlCatalog.csproj @@ -197,9 +197,9 @@ {6417B24E-49C2-4985-8DB2-3AB9D898EC91} Avalonia.ReactiveUI - + {EB582467-6ABB-43A1-B052-E981BA910E3A} - Avalonia.SceneGraph + Avalonia.Visuals {F1BAA01A-F176-4C6A-B39D-5B40BB1B148F} diff --git a/samples/RenderTest/RenderTest.csproj b/samples/RenderTest/RenderTest.csproj index 49ce4603ce..f117c76342 100644 --- a/samples/RenderTest/RenderTest.csproj +++ b/samples/RenderTest/RenderTest.csproj @@ -139,9 +139,9 @@ {6417b24e-49c2-4985-8db2-3ab9d898ec91} Avalonia.ReactiveUI - + {eb582467-6abb-43a1-b052-e981ba910e3a} - Avalonia.SceneGraph + Avalonia.Visuals {f1baa01a-f176-4c6a-b39d-5b40bb1b148f} diff --git a/samples/VirtualizationTest/VirtualizationTest.csproj b/samples/VirtualizationTest/VirtualizationTest.csproj index 512d4c361f..9e80dfdc8f 100644 --- a/samples/VirtualizationTest/VirtualizationTest.csproj +++ b/samples/VirtualizationTest/VirtualizationTest.csproj @@ -127,9 +127,9 @@ {6417b24e-49c2-4985-8db2-3ab9d898ec91} Avalonia.ReactiveUI - + {eb582467-6abb-43a1-b052-e981ba910e3a} - Avalonia.SceneGraph + Avalonia.Visuals {f1baa01a-f176-4c6a-b39d-5b40bb1b148f} diff --git a/samples/interop/GtkInteropDemo/GtkInteropDemo.csproj b/samples/interop/GtkInteropDemo/GtkInteropDemo.csproj index 0d87af8838..738a1e776c 100644 --- a/samples/interop/GtkInteropDemo/GtkInteropDemo.csproj +++ b/samples/interop/GtkInteropDemo/GtkInteropDemo.csproj @@ -112,9 +112,9 @@ {6417b24e-49c2-4985-8db2-3ab9d898ec91} Avalonia.ReactiveUI - + {eb582467-6abb-43a1-b052-e981ba910e3a} - Avalonia.SceneGraph + Avalonia.Visuals {f1baa01a-f176-4c6a-b39d-5b40bb1b148f} diff --git a/samples/interop/WindowsInteropTest/WindowsInteropTest.csproj b/samples/interop/WindowsInteropTest/WindowsInteropTest.csproj index 827f73d7ae..671ebd0020 100644 --- a/samples/interop/WindowsInteropTest/WindowsInteropTest.csproj +++ b/samples/interop/WindowsInteropTest/WindowsInteropTest.csproj @@ -136,9 +136,9 @@ {6417b24e-49c2-4985-8db2-3ab9d898ec91} Avalonia.ReactiveUI - + {eb582467-6abb-43a1-b052-e981ba910e3a} - Avalonia.SceneGraph + Avalonia.Visuals {f1baa01a-f176-4c6a-b39d-5b40bb1b148f} diff --git a/src/Android/Avalonia.Android/Avalonia.Android.csproj b/src/Android/Avalonia.Android/Avalonia.Android.csproj index a412930b85..70c70ad56e 100644 --- a/src/Android/Avalonia.Android/Avalonia.Android.csproj +++ b/src/Android/Avalonia.Android/Avalonia.Android.csproj @@ -124,9 +124,9 @@ {6417b24e-49c2-4985-8db2-3ab9d898ec91} Avalonia.ReactiveUI - + {eb582467-6abb-43a1-b052-e981ba910e3a} - Avalonia.SceneGraph + Avalonia.Visuals {f1baa01a-f176-4c6a-b39d-5b40bb1b148f} diff --git a/src/Android/Avalonia.AndroidTestApplication/Avalonia.AndroidTestApplication.csproj b/src/Android/Avalonia.AndroidTestApplication/Avalonia.AndroidTestApplication.csproj index d86215248a..e004121323 100644 --- a/src/Android/Avalonia.AndroidTestApplication/Avalonia.AndroidTestApplication.csproj +++ b/src/Android/Avalonia.AndroidTestApplication/Avalonia.AndroidTestApplication.csproj @@ -160,9 +160,9 @@ {6417b24e-49c2-4985-8db2-3ab9d898ec91} Avalonia.ReactiveUI - + {eb582467-6abb-43a1-b052-e981ba910e3a} - Avalonia.SceneGraph + Avalonia.Visuals {f1baa01a-f176-4c6a-b39d-5b40bb1b148f} diff --git a/src/Avalonia.Base/AvaloniaObject.cs b/src/Avalonia.Base/AvaloniaObject.cs index 48e937d6b2..409abfe8fa 100644 --- a/src/Avalonia.Base/AvaloniaObject.cs +++ b/src/Avalonia.Base/AvaloniaObject.cs @@ -12,6 +12,7 @@ using Avalonia.Diagnostics; using Avalonia.Logging; using Avalonia.Threading; using Avalonia.Utilities; +using System.Reactive.Concurrency; namespace Avalonia { @@ -304,6 +305,11 @@ namespace Avalonia VerifyAccess(); + var description = GetDescription(source); + + var scheduler = AvaloniaLocator.Current.GetService() ?? ImmediateScheduler.Instance; + source = source.ObserveOn(scheduler); + if (property.IsDirect) { if (property.IsReadOnly) @@ -316,7 +322,7 @@ namespace Avalonia this, "Bound {Property} to {Binding} with priority LocalValue", property, - GetDescription(source)); + description); IDisposable subscription = null; @@ -358,7 +364,7 @@ namespace Avalonia this, "Bound {Property} to {Binding} with priority {Priority}", property, - GetDescription(source), + description, priority); return v.Add(source, (int)priority); diff --git a/src/Avalonia.Base/Threading/AvaloniaScheduler.cs b/src/Avalonia.Base/Threading/AvaloniaScheduler.cs index de32057a00..f9d67470c1 100644 --- a/src/Avalonia.Base/Threading/AvaloniaScheduler.cs +++ b/src/Avalonia.Base/Threading/AvaloniaScheduler.cs @@ -3,6 +3,7 @@ using System; using System.Reactive.Concurrency; +using System.Reactive.Disposables; namespace Avalonia.Threading { @@ -26,13 +27,31 @@ namespace Avalonia.Threading /// public override IDisposable Schedule(TState state, TimeSpan dueTime, Func action) { - return DispatcherTimer.Run( - () => + var composite = new CompositeDisposable(2); + if (dueTime == TimeSpan.Zero) + { + if (!Dispatcher.UIThread.CheckAccess()) { - action(this, state); - return false; - }, - dueTime); + var cancellation = new CancellationDisposable(); + Dispatcher.UIThread.InvokeAsync(() => + { + if (!cancellation.Token.IsCancellationRequested) + { + composite.Add(action(this, state)); + } + }, DispatcherPriority.DataBind); + composite.Add(cancellation); + } + else + { + return action(this, state); + } + } + else + { + composite.Add(DispatcherTimer.RunOnce(() => composite.Add(action(this, state)), dueTime)); + } + return composite; } } } diff --git a/src/Avalonia.Controls/Application.cs b/src/Avalonia.Controls/Application.cs index 326556f629..3d13608226 100644 --- a/src/Avalonia.Controls/Application.cs +++ b/src/Avalonia.Controls/Application.cs @@ -11,6 +11,7 @@ using Avalonia.Layout; using Avalonia.Rendering; using Avalonia.Styling; using Avalonia.Threading; +using System.Reactive.Concurrency; namespace Avalonia { @@ -175,7 +176,8 @@ namespace Avalonia .Bind().ToTransient() .Bind().ToConstant(_styler) .Bind().ToSingleton() - .Bind().ToConstant(this); + .Bind().ToConstant(this) + .Bind().ToConstant(AvaloniaScheduler.Instance); } } } diff --git a/src/Avalonia.Controls/Avalonia.Controls.csproj b/src/Avalonia.Controls/Avalonia.Controls.csproj index 3d27a5e501..10fbe746e3 100644 --- a/src/Avalonia.Controls/Avalonia.Controls.csproj +++ b/src/Avalonia.Controls/Avalonia.Controls.csproj @@ -256,9 +256,9 @@ {42472427-4774-4C81-8AFF-9F27B8E31721} Avalonia.Layout - + {EB582467-6ABB-43A1-B052-E981BA910E3A} - Avalonia.SceneGraph + Avalonia.Visuals {F1BAA01A-F176-4C6A-B39D-5B40BB1B148F} diff --git a/src/Avalonia.Controls/Generators/IItemContainerGenerator.cs b/src/Avalonia.Controls/Generators/IItemContainerGenerator.cs index ba584e33b9..d139c95fd4 100644 --- a/src/Avalonia.Controls/Generators/IItemContainerGenerator.cs +++ b/src/Avalonia.Controls/Generators/IItemContainerGenerator.cs @@ -22,6 +22,11 @@ namespace Avalonia.Controls.Generators /// IDataTemplate ItemTemplate { get; set; } + /// + /// Gets the ContainerType, or null if its an untyped ContainerGenerator. + /// + Type ContainerType { get; } + /// /// Signalled whenever new containers are materialized. /// diff --git a/src/Avalonia.Controls/Generators/ItemContainerGenerator.cs b/src/Avalonia.Controls/Generators/ItemContainerGenerator.cs index 4d65210002..882d2f4ddd 100644 --- a/src/Avalonia.Controls/Generators/ItemContainerGenerator.cs +++ b/src/Avalonia.Controls/Generators/ItemContainerGenerator.cs @@ -50,6 +50,9 @@ namespace Avalonia.Controls.Generators /// public IControl Owner { get; } + /// + public virtual Type ContainerType => null; + /// public ItemContainerInfo Materialize( int index, diff --git a/src/Avalonia.Controls/Generators/ItemContainerGenerator`1.cs b/src/Avalonia.Controls/Generators/ItemContainerGenerator`1.cs index 3aa2181cd4..259c524d59 100644 --- a/src/Avalonia.Controls/Generators/ItemContainerGenerator`1.cs +++ b/src/Avalonia.Controls/Generators/ItemContainerGenerator`1.cs @@ -34,6 +34,9 @@ namespace Avalonia.Controls.Generators ContentTemplateProperty = contentTemplateProperty; } + /// + public override Type ContainerType => typeof(T); + /// /// Gets the container's Content property. /// diff --git a/src/Avalonia.Controls/ItemsControl.cs b/src/Avalonia.Controls/ItemsControl.cs index 8f92cc43b7..5d12c9963f 100644 --- a/src/Avalonia.Controls/ItemsControl.cs +++ b/src/Avalonia.Controls/ItemsControl.cs @@ -4,7 +4,6 @@ using System.Collections; using System.Collections.Generic; using System.Collections.Specialized; -using System.Diagnostics.CodeAnalysis; using System.Linq; using Avalonia.Collections; using Avalonia.Controls.Generators; @@ -226,19 +225,35 @@ namespace Avalonia.Controls /// The details of the containers. protected virtual void OnContainersMaterialized(ItemContainerEventArgs e) { - var toAdd = new List(); - foreach (var container in e.Containers) { // If the item is its own container, then it will be added to the logical tree when // it was added to the Items collection. if (container.ContainerControl != null && container.ContainerControl != container.Item) { - toAdd.Add(container.ContainerControl); + if (ItemContainerGenerator.ContainerType == null) + { + var containerControl = container.ContainerControl as ContentPresenter; + + if (containerControl != null) + { + ((ISetLogicalParent)containerControl).SetParent(this); + containerControl.SetValue(TemplatedParentProperty, null); + + containerControl.UpdateChild(); + + if (containerControl.Child != null) + { + LogicalChildren.Add(containerControl.Child); + } + } + } + else + { + LogicalChildren.Add(container.ContainerControl); + } } } - - LogicalChildren.AddRange(toAdd); } /// @@ -248,19 +263,32 @@ namespace Avalonia.Controls /// The details of the containers. protected virtual void OnContainersDematerialized(ItemContainerEventArgs e) { - var toRemove = new List(); - foreach (var container in e.Containers) { // If the item is its own container, then it will be removed from the logical tree // when it is removed from the Items collection. if (container?.ContainerControl != container?.Item) { - toRemove.Add(container.ContainerControl); + if (ItemContainerGenerator.ContainerType == null) + { + var containerControl = container.ContainerControl as ContentPresenter; + + if (containerControl != null) + { + ((ISetLogicalParent)containerControl).SetParent(null); + + if (containerControl.Child != null) + { + LogicalChildren.Remove(containerControl.Child); + } + } + } + else + { + LogicalChildren.Remove(container.ContainerControl); + } } } - - LogicalChildren.RemoveAll(toRemove); } /// diff --git a/src/Avalonia.DesignerSupport/Avalonia.DesignerSupport.csproj b/src/Avalonia.DesignerSupport/Avalonia.DesignerSupport.csproj index 7c26e0275c..478d0eaa57 100644 --- a/src/Avalonia.DesignerSupport/Avalonia.DesignerSupport.csproj +++ b/src/Avalonia.DesignerSupport/Avalonia.DesignerSupport.csproj @@ -73,9 +73,9 @@ {42472427-4774-4C81-8AFF-9F27B8E31721} Avalonia.Layout - + {EB582467-6ABB-43A1-B052-E981BA910E3A} - Avalonia.SceneGraph + Avalonia.Visuals {F1BAA01A-F176-4C6A-B39D-5B40BB1B148F} diff --git a/src/Avalonia.Diagnostics/Avalonia.Diagnostics.csproj b/src/Avalonia.Diagnostics/Avalonia.Diagnostics.csproj index 7ac724fcf4..5381f55288 100644 --- a/src/Avalonia.Diagnostics/Avalonia.Diagnostics.csproj +++ b/src/Avalonia.Diagnostics/Avalonia.Diagnostics.csproj @@ -78,9 +78,9 @@ {6417B24E-49C2-4985-8DB2-3AB9D898EC91} Avalonia.ReactiveUI - + {EB582467-6ABB-43A1-B052-E981BA910E3A} - Avalonia.SceneGraph + Avalonia.Visuals {F1BAA01A-F176-4C6A-B39D-5B40BB1B148F} diff --git a/src/Avalonia.DotNetFrameworkRuntime/Avalonia.DotNetFrameworkRuntime.csproj b/src/Avalonia.DotNetFrameworkRuntime/Avalonia.DotNetFrameworkRuntime.csproj index ff481f769e..f11b67dcc9 100644 --- a/src/Avalonia.DotNetFrameworkRuntime/Avalonia.DotNetFrameworkRuntime.csproj +++ b/src/Avalonia.DotNetFrameworkRuntime/Avalonia.DotNetFrameworkRuntime.csproj @@ -65,9 +65,9 @@ {D2221C82-4A25-4583-9B43-D791E3F6820C} Avalonia.Controls - + {eb582467-6abb-43a1-b052-e981ba910e3a} - Avalonia.SceneGraph + Avalonia.Visuals {f1baa01a-f176-4c6a-b39d-5b40bb1b148f} diff --git a/src/Avalonia.HtmlRenderer/Avalonia.HtmlRenderer.csproj b/src/Avalonia.HtmlRenderer/Avalonia.HtmlRenderer.csproj index be0e107f91..dd0a6f2cef 100644 --- a/src/Avalonia.HtmlRenderer/Avalonia.HtmlRenderer.csproj +++ b/src/Avalonia.HtmlRenderer/Avalonia.HtmlRenderer.csproj @@ -161,9 +161,9 @@ {42472427-4774-4C81-8AFF-9F27B8E31721} Avalonia.Layout - + {EB582467-6ABB-43A1-B052-E981BA910E3A} - Avalonia.SceneGraph + Avalonia.Visuals {F1BAA01A-F176-4C6A-B39D-5B40BB1B148F} diff --git a/src/Avalonia.Input/Avalonia.Input.csproj b/src/Avalonia.Input/Avalonia.Input.csproj index 45a1ce9015..5e0fb50b67 100644 --- a/src/Avalonia.Input/Avalonia.Input.csproj +++ b/src/Avalonia.Input/Avalonia.Input.csproj @@ -58,9 +58,9 @@ {42472427-4774-4C81-8AFF-9F27B8E31721} Avalonia.Layout - + {EB582467-6ABB-43A1-B052-E981BA910E3A} - Avalonia.SceneGraph + Avalonia.Visuals diff --git a/src/Avalonia.Interactivity/Avalonia.Interactivity.csproj b/src/Avalonia.Interactivity/Avalonia.Interactivity.csproj index a9ddc316ca..499a55ef12 100644 --- a/src/Avalonia.Interactivity/Avalonia.Interactivity.csproj +++ b/src/Avalonia.Interactivity/Avalonia.Interactivity.csproj @@ -54,9 +54,9 @@ {42472427-4774-4C81-8AFF-9F27B8E31721} Avalonia.Layout - + {EB582467-6ABB-43A1-B052-E981BA910E3A} - Avalonia.SceneGraph + Avalonia.Visuals diff --git a/src/Avalonia.Layout/Avalonia.Layout.csproj b/src/Avalonia.Layout/Avalonia.Layout.csproj index 4db2398dbe..4bc27fc96b 100644 --- a/src/Avalonia.Layout/Avalonia.Layout.csproj +++ b/src/Avalonia.Layout/Avalonia.Layout.csproj @@ -50,9 +50,9 @@ {B09B78D8-9B26-48B0-9149-D64A2F120F3F} Avalonia.Base - + {EB582467-6ABB-43A1-B052-E981BA910E3A} - Avalonia.SceneGraph + Avalonia.Visuals diff --git a/src/Avalonia.Styling/Avalonia.Styling.csproj b/src/Avalonia.Styling/Avalonia.Styling.csproj index 067900e5ca..3566ed7268 100644 --- a/src/Avalonia.Styling/Avalonia.Styling.csproj +++ b/src/Avalonia.Styling/Avalonia.Styling.csproj @@ -111,9 +111,9 @@ {B09B78D8-9B26-48B0-9149-D64A2F120F3F} Avalonia.Base - + {EB582467-6ABB-43A1-B052-E981BA910E3A} - Avalonia.SceneGraph + Avalonia.Visuals diff --git a/src/Avalonia.Themes.Default/Avalonia.Themes.Default.csproj b/src/Avalonia.Themes.Default/Avalonia.Themes.Default.csproj index cd0bf77eae..578bb9cdff 100644 --- a/src/Avalonia.Themes.Default/Avalonia.Themes.Default.csproj +++ b/src/Avalonia.Themes.Default/Avalonia.Themes.Default.csproj @@ -68,9 +68,9 @@ {42472427-4774-4C81-8AFF-9F27B8E31721} Avalonia.Layout - + {EB582467-6ABB-43A1-B052-E981BA910E3A} - Avalonia.SceneGraph + Avalonia.Visuals {F1BAA01A-F176-4C6A-B39D-5B40BB1B148F} diff --git a/src/Avalonia.SceneGraph/Animation/CrossFade.cs b/src/Avalonia.Visuals/Animation/CrossFade.cs similarity index 100% rename from src/Avalonia.SceneGraph/Animation/CrossFade.cs rename to src/Avalonia.Visuals/Animation/CrossFade.cs diff --git a/src/Avalonia.SceneGraph/Animation/IPageTransition.cs b/src/Avalonia.Visuals/Animation/IPageTransition.cs similarity index 100% rename from src/Avalonia.SceneGraph/Animation/IPageTransition.cs rename to src/Avalonia.Visuals/Animation/IPageTransition.cs diff --git a/src/Avalonia.SceneGraph/Animation/PageSlide.cs b/src/Avalonia.Visuals/Animation/PageSlide.cs similarity index 100% rename from src/Avalonia.SceneGraph/Animation/PageSlide.cs rename to src/Avalonia.Visuals/Animation/PageSlide.cs diff --git a/src/Avalonia.SceneGraph/Avalonia.SceneGraph.csproj b/src/Avalonia.Visuals/Avalonia.Visuals.csproj similarity index 97% rename from src/Avalonia.SceneGraph/Avalonia.SceneGraph.csproj rename to src/Avalonia.Visuals/Avalonia.Visuals.csproj index 3d2347683d..d9736e4c6e 100644 --- a/src/Avalonia.SceneGraph/Avalonia.SceneGraph.csproj +++ b/src/Avalonia.Visuals/Avalonia.Visuals.csproj @@ -9,7 +9,7 @@ Library Properties Avalonia - Avalonia.SceneGraph + Avalonia.Visuals en-US 512 {786C830F-07A1-408B-BD7F-6EE04809D6DB};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} @@ -26,7 +26,7 @@ DEBUG;TRACE prompt 4 - bin\Debug\Avalonia.SceneGraph.XML + bin\Debug\Avalonia.Visuals.xml CS1591 @@ -36,7 +36,7 @@ TRACE prompt 4 - bin\Release\Avalonia.SceneGraph.XML + bin\Release\Avalonia.Visuals.xml CS1591 true diff --git a/src/Avalonia.SceneGraph/Avalonia.SceneGraph.v2.ncrunchproject b/src/Avalonia.Visuals/Avalonia.Visuals.v2.ncrunchproject similarity index 100% rename from src/Avalonia.SceneGraph/Avalonia.SceneGraph.v2.ncrunchproject rename to src/Avalonia.Visuals/Avalonia.Visuals.v2.ncrunchproject diff --git a/src/Avalonia.SceneGraph/INamed.cs b/src/Avalonia.Visuals/INamed.cs similarity index 100% rename from src/Avalonia.SceneGraph/INamed.cs rename to src/Avalonia.Visuals/INamed.cs diff --git a/src/Avalonia.SceneGraph/Matrix.cs b/src/Avalonia.Visuals/Matrix.cs similarity index 100% rename from src/Avalonia.SceneGraph/Matrix.cs rename to src/Avalonia.Visuals/Matrix.cs diff --git a/src/Avalonia.SceneGraph/Media/AlignmentX.cs b/src/Avalonia.Visuals/Media/AlignmentX.cs similarity index 100% rename from src/Avalonia.SceneGraph/Media/AlignmentX.cs rename to src/Avalonia.Visuals/Media/AlignmentX.cs diff --git a/src/Avalonia.SceneGraph/Media/AlignmentY.cs b/src/Avalonia.Visuals/Media/AlignmentY.cs similarity index 100% rename from src/Avalonia.SceneGraph/Media/AlignmentY.cs rename to src/Avalonia.Visuals/Media/AlignmentY.cs diff --git a/src/Avalonia.SceneGraph/Media/ArcSegment.cs b/src/Avalonia.Visuals/Media/ArcSegment.cs similarity index 100% rename from src/Avalonia.SceneGraph/Media/ArcSegment.cs rename to src/Avalonia.Visuals/Media/ArcSegment.cs diff --git a/src/Avalonia.SceneGraph/Media/BezierSegment .cs b/src/Avalonia.Visuals/Media/BezierSegment .cs similarity index 100% rename from src/Avalonia.SceneGraph/Media/BezierSegment .cs rename to src/Avalonia.Visuals/Media/BezierSegment .cs diff --git a/src/Avalonia.SceneGraph/Media/Brush.cs b/src/Avalonia.Visuals/Media/Brush.cs similarity index 100% rename from src/Avalonia.SceneGraph/Media/Brush.cs rename to src/Avalonia.Visuals/Media/Brush.cs diff --git a/src/Avalonia.SceneGraph/Media/BrushMappingMode.cs b/src/Avalonia.Visuals/Media/BrushMappingMode.cs similarity index 100% rename from src/Avalonia.SceneGraph/Media/BrushMappingMode.cs rename to src/Avalonia.Visuals/Media/BrushMappingMode.cs diff --git a/src/Avalonia.SceneGraph/Media/Brushes.cs b/src/Avalonia.Visuals/Media/Brushes.cs similarity index 100% rename from src/Avalonia.SceneGraph/Media/Brushes.cs rename to src/Avalonia.Visuals/Media/Brushes.cs diff --git a/src/Avalonia.SceneGraph/Media/Color.cs b/src/Avalonia.Visuals/Media/Color.cs similarity index 100% rename from src/Avalonia.SceneGraph/Media/Color.cs rename to src/Avalonia.Visuals/Media/Color.cs diff --git a/src/Avalonia.SceneGraph/Media/Colors.cs b/src/Avalonia.Visuals/Media/Colors.cs similarity index 100% rename from src/Avalonia.SceneGraph/Media/Colors.cs rename to src/Avalonia.Visuals/Media/Colors.cs diff --git a/src/Avalonia.SceneGraph/Media/DashStyle.cs b/src/Avalonia.Visuals/Media/DashStyle.cs similarity index 100% rename from src/Avalonia.SceneGraph/Media/DashStyle.cs rename to src/Avalonia.Visuals/Media/DashStyle.cs diff --git a/src/Avalonia.SceneGraph/Media/DrawingContext.cs b/src/Avalonia.Visuals/Media/DrawingContext.cs similarity index 100% rename from src/Avalonia.SceneGraph/Media/DrawingContext.cs rename to src/Avalonia.Visuals/Media/DrawingContext.cs diff --git a/src/Avalonia.SceneGraph/Media/EllipseGeometry.cs b/src/Avalonia.Visuals/Media/EllipseGeometry.cs similarity index 100% rename from src/Avalonia.SceneGraph/Media/EllipseGeometry.cs rename to src/Avalonia.Visuals/Media/EllipseGeometry.cs diff --git a/src/Avalonia.SceneGraph/Media/FillRule.cs b/src/Avalonia.Visuals/Media/FillRule.cs similarity index 100% rename from src/Avalonia.SceneGraph/Media/FillRule.cs rename to src/Avalonia.Visuals/Media/FillRule.cs diff --git a/src/Avalonia.SceneGraph/Media/FontStyle.cs b/src/Avalonia.Visuals/Media/FontStyle.cs similarity index 100% rename from src/Avalonia.SceneGraph/Media/FontStyle.cs rename to src/Avalonia.Visuals/Media/FontStyle.cs diff --git a/src/Avalonia.SceneGraph/Media/FontWeight.cs b/src/Avalonia.Visuals/Media/FontWeight.cs similarity index 100% rename from src/Avalonia.SceneGraph/Media/FontWeight.cs rename to src/Avalonia.Visuals/Media/FontWeight.cs diff --git a/src/Avalonia.SceneGraph/Media/FormattedText.cs b/src/Avalonia.Visuals/Media/FormattedText.cs similarity index 100% rename from src/Avalonia.SceneGraph/Media/FormattedText.cs rename to src/Avalonia.Visuals/Media/FormattedText.cs diff --git a/src/Avalonia.SceneGraph/Media/FormattedTextLine.cs b/src/Avalonia.Visuals/Media/FormattedTextLine.cs similarity index 100% rename from src/Avalonia.SceneGraph/Media/FormattedTextLine.cs rename to src/Avalonia.Visuals/Media/FormattedTextLine.cs diff --git a/src/Avalonia.SceneGraph/Media/Geometry.cs b/src/Avalonia.Visuals/Media/Geometry.cs similarity index 100% rename from src/Avalonia.SceneGraph/Media/Geometry.cs rename to src/Avalonia.Visuals/Media/Geometry.cs diff --git a/src/Avalonia.SceneGraph/Media/GradientBrush.cs b/src/Avalonia.Visuals/Media/GradientBrush.cs similarity index 100% rename from src/Avalonia.SceneGraph/Media/GradientBrush.cs rename to src/Avalonia.Visuals/Media/GradientBrush.cs diff --git a/src/Avalonia.SceneGraph/Media/GradientSpreadMethod.cs b/src/Avalonia.Visuals/Media/GradientSpreadMethod.cs similarity index 100% rename from src/Avalonia.SceneGraph/Media/GradientSpreadMethod.cs rename to src/Avalonia.Visuals/Media/GradientSpreadMethod.cs diff --git a/src/Avalonia.SceneGraph/Media/GradientStop.cs b/src/Avalonia.Visuals/Media/GradientStop.cs similarity index 100% rename from src/Avalonia.SceneGraph/Media/GradientStop.cs rename to src/Avalonia.Visuals/Media/GradientStop.cs diff --git a/src/Avalonia.SceneGraph/Media/IBrush.cs b/src/Avalonia.Visuals/Media/IBrush.cs similarity index 100% rename from src/Avalonia.SceneGraph/Media/IBrush.cs rename to src/Avalonia.Visuals/Media/IBrush.cs diff --git a/src/Avalonia.SceneGraph/Media/IDrawingContext.cs b/src/Avalonia.Visuals/Media/IDrawingContext.cs similarity index 100% rename from src/Avalonia.SceneGraph/Media/IDrawingContext.cs rename to src/Avalonia.Visuals/Media/IDrawingContext.cs diff --git a/src/Avalonia.SceneGraph/Media/ISolidColorBrush.cs b/src/Avalonia.Visuals/Media/ISolidColorBrush.cs similarity index 100% rename from src/Avalonia.SceneGraph/Media/ISolidColorBrush.cs rename to src/Avalonia.Visuals/Media/ISolidColorBrush.cs diff --git a/src/Avalonia.SceneGraph/Media/ImageBush.cs b/src/Avalonia.Visuals/Media/ImageBush.cs similarity index 100% rename from src/Avalonia.SceneGraph/Media/ImageBush.cs rename to src/Avalonia.Visuals/Media/ImageBush.cs diff --git a/src/Avalonia.SceneGraph/Media/Imaging/Bitmap.cs b/src/Avalonia.Visuals/Media/Imaging/Bitmap.cs similarity index 100% rename from src/Avalonia.SceneGraph/Media/Imaging/Bitmap.cs rename to src/Avalonia.Visuals/Media/Imaging/Bitmap.cs diff --git a/src/Avalonia.SceneGraph/Media/Imaging/IBitmap.cs b/src/Avalonia.Visuals/Media/Imaging/IBitmap.cs similarity index 100% rename from src/Avalonia.SceneGraph/Media/Imaging/IBitmap.cs rename to src/Avalonia.Visuals/Media/Imaging/IBitmap.cs diff --git a/src/Avalonia.SceneGraph/Media/Imaging/RenderTargetBitmap.cs b/src/Avalonia.Visuals/Media/Imaging/RenderTargetBitmap.cs similarity index 100% rename from src/Avalonia.SceneGraph/Media/Imaging/RenderTargetBitmap.cs rename to src/Avalonia.Visuals/Media/Imaging/RenderTargetBitmap.cs diff --git a/src/Avalonia.SceneGraph/Media/LineGeometry.cs b/src/Avalonia.Visuals/Media/LineGeometry.cs similarity index 100% rename from src/Avalonia.SceneGraph/Media/LineGeometry.cs rename to src/Avalonia.Visuals/Media/LineGeometry.cs diff --git a/src/Avalonia.SceneGraph/Media/LineSegment.cs b/src/Avalonia.Visuals/Media/LineSegment.cs similarity index 100% rename from src/Avalonia.SceneGraph/Media/LineSegment.cs rename to src/Avalonia.Visuals/Media/LineSegment.cs diff --git a/src/Avalonia.SceneGraph/Media/LinearGradientBrush.cs b/src/Avalonia.Visuals/Media/LinearGradientBrush.cs similarity index 100% rename from src/Avalonia.SceneGraph/Media/LinearGradientBrush.cs rename to src/Avalonia.Visuals/Media/LinearGradientBrush.cs diff --git a/src/Avalonia.SceneGraph/Media/MatrixTransform.cs b/src/Avalonia.Visuals/Media/MatrixTransform.cs similarity index 100% rename from src/Avalonia.SceneGraph/Media/MatrixTransform.cs rename to src/Avalonia.Visuals/Media/MatrixTransform.cs diff --git a/src/Avalonia.SceneGraph/Media/MediaExtensions.cs b/src/Avalonia.Visuals/Media/MediaExtensions.cs similarity index 100% rename from src/Avalonia.SceneGraph/Media/MediaExtensions.cs rename to src/Avalonia.Visuals/Media/MediaExtensions.cs diff --git a/src/Avalonia.SceneGraph/Media/Mutable/SolidColorBrush.cs b/src/Avalonia.Visuals/Media/Mutable/SolidColorBrush.cs similarity index 100% rename from src/Avalonia.SceneGraph/Media/Mutable/SolidColorBrush.cs rename to src/Avalonia.Visuals/Media/Mutable/SolidColorBrush.cs diff --git a/src/Avalonia.SceneGraph/Media/PathFigure.cs b/src/Avalonia.Visuals/Media/PathFigure.cs similarity index 100% rename from src/Avalonia.SceneGraph/Media/PathFigure.cs rename to src/Avalonia.Visuals/Media/PathFigure.cs diff --git a/src/Avalonia.SceneGraph/Media/PathGeometry.cs b/src/Avalonia.Visuals/Media/PathGeometry.cs similarity index 100% rename from src/Avalonia.SceneGraph/Media/PathGeometry.cs rename to src/Avalonia.Visuals/Media/PathGeometry.cs diff --git a/src/Avalonia.SceneGraph/Media/PathGeometryCollections.cs b/src/Avalonia.Visuals/Media/PathGeometryCollections.cs similarity index 100% rename from src/Avalonia.SceneGraph/Media/PathGeometryCollections.cs rename to src/Avalonia.Visuals/Media/PathGeometryCollections.cs diff --git a/src/Avalonia.SceneGraph/Media/PathMarkupParser.cs b/src/Avalonia.Visuals/Media/PathMarkupParser.cs similarity index 100% rename from src/Avalonia.SceneGraph/Media/PathMarkupParser.cs rename to src/Avalonia.Visuals/Media/PathMarkupParser.cs diff --git a/src/Avalonia.SceneGraph/Media/PathSegment.cs b/src/Avalonia.Visuals/Media/PathSegment.cs similarity index 100% rename from src/Avalonia.SceneGraph/Media/PathSegment.cs rename to src/Avalonia.Visuals/Media/PathSegment.cs diff --git a/src/Avalonia.SceneGraph/Media/Pen.cs b/src/Avalonia.Visuals/Media/Pen.cs similarity index 100% rename from src/Avalonia.SceneGraph/Media/Pen.cs rename to src/Avalonia.Visuals/Media/Pen.cs diff --git a/src/Avalonia.SceneGraph/Media/PenLineCap.cs b/src/Avalonia.Visuals/Media/PenLineCap.cs similarity index 100% rename from src/Avalonia.SceneGraph/Media/PenLineCap.cs rename to src/Avalonia.Visuals/Media/PenLineCap.cs diff --git a/src/Avalonia.SceneGraph/Media/PenLineJoin.cs b/src/Avalonia.Visuals/Media/PenLineJoin.cs similarity index 100% rename from src/Avalonia.SceneGraph/Media/PenLineJoin.cs rename to src/Avalonia.Visuals/Media/PenLineJoin.cs diff --git a/src/Avalonia.SceneGraph/Media/PolylineGeometry.cs b/src/Avalonia.Visuals/Media/PolylineGeometry.cs similarity index 100% rename from src/Avalonia.SceneGraph/Media/PolylineGeometry.cs rename to src/Avalonia.Visuals/Media/PolylineGeometry.cs diff --git a/src/Avalonia.SceneGraph/Media/QuadraticBezierSegment .cs b/src/Avalonia.Visuals/Media/QuadraticBezierSegment .cs similarity index 100% rename from src/Avalonia.SceneGraph/Media/QuadraticBezierSegment .cs rename to src/Avalonia.Visuals/Media/QuadraticBezierSegment .cs diff --git a/src/Avalonia.SceneGraph/Media/RadialGradientBrush.cs b/src/Avalonia.Visuals/Media/RadialGradientBrush.cs similarity index 100% rename from src/Avalonia.SceneGraph/Media/RadialGradientBrush.cs rename to src/Avalonia.Visuals/Media/RadialGradientBrush.cs diff --git a/src/Avalonia.SceneGraph/Media/RectangleGeometry.cs b/src/Avalonia.Visuals/Media/RectangleGeometry.cs similarity index 100% rename from src/Avalonia.SceneGraph/Media/RectangleGeometry.cs rename to src/Avalonia.Visuals/Media/RectangleGeometry.cs diff --git a/src/Avalonia.SceneGraph/Media/RotateTransform.cs b/src/Avalonia.Visuals/Media/RotateTransform.cs similarity index 100% rename from src/Avalonia.SceneGraph/Media/RotateTransform.cs rename to src/Avalonia.Visuals/Media/RotateTransform.cs diff --git a/src/Avalonia.SceneGraph/Media/ScaleTransform.cs b/src/Avalonia.Visuals/Media/ScaleTransform.cs similarity index 100% rename from src/Avalonia.SceneGraph/Media/ScaleTransform.cs rename to src/Avalonia.Visuals/Media/ScaleTransform.cs diff --git a/src/Avalonia.SceneGraph/Media/SolidColorBrush.cs b/src/Avalonia.Visuals/Media/SolidColorBrush.cs similarity index 100% rename from src/Avalonia.SceneGraph/Media/SolidColorBrush.cs rename to src/Avalonia.Visuals/Media/SolidColorBrush.cs diff --git a/src/Avalonia.SceneGraph/Media/StreamGeometry.cs b/src/Avalonia.Visuals/Media/StreamGeometry.cs similarity index 100% rename from src/Avalonia.SceneGraph/Media/StreamGeometry.cs rename to src/Avalonia.Visuals/Media/StreamGeometry.cs diff --git a/src/Avalonia.SceneGraph/Media/StreamGeometryContext.cs b/src/Avalonia.Visuals/Media/StreamGeometryContext.cs similarity index 100% rename from src/Avalonia.SceneGraph/Media/StreamGeometryContext.cs rename to src/Avalonia.Visuals/Media/StreamGeometryContext.cs diff --git a/src/Avalonia.SceneGraph/Media/Stretch.cs b/src/Avalonia.Visuals/Media/Stretch.cs similarity index 100% rename from src/Avalonia.SceneGraph/Media/Stretch.cs rename to src/Avalonia.Visuals/Media/Stretch.cs diff --git a/src/Avalonia.SceneGraph/Media/SweepDirection.cs b/src/Avalonia.Visuals/Media/SweepDirection.cs similarity index 100% rename from src/Avalonia.SceneGraph/Media/SweepDirection.cs rename to src/Avalonia.Visuals/Media/SweepDirection.cs diff --git a/src/Avalonia.SceneGraph/Media/TextAlignment.cs b/src/Avalonia.Visuals/Media/TextAlignment.cs similarity index 100% rename from src/Avalonia.SceneGraph/Media/TextAlignment.cs rename to src/Avalonia.Visuals/Media/TextAlignment.cs diff --git a/src/Avalonia.SceneGraph/Media/TextHitTestResult.cs b/src/Avalonia.Visuals/Media/TextHitTestResult.cs similarity index 100% rename from src/Avalonia.SceneGraph/Media/TextHitTestResult.cs rename to src/Avalonia.Visuals/Media/TextHitTestResult.cs diff --git a/src/Avalonia.SceneGraph/Media/TextWrapping.cs b/src/Avalonia.Visuals/Media/TextWrapping.cs similarity index 100% rename from src/Avalonia.SceneGraph/Media/TextWrapping.cs rename to src/Avalonia.Visuals/Media/TextWrapping.cs diff --git a/src/Avalonia.SceneGraph/Media/TileBrush.cs b/src/Avalonia.Visuals/Media/TileBrush.cs similarity index 100% rename from src/Avalonia.SceneGraph/Media/TileBrush.cs rename to src/Avalonia.Visuals/Media/TileBrush.cs diff --git a/src/Avalonia.SceneGraph/Media/Transform.cs b/src/Avalonia.Visuals/Media/Transform.cs similarity index 100% rename from src/Avalonia.SceneGraph/Media/Transform.cs rename to src/Avalonia.Visuals/Media/Transform.cs diff --git a/src/Avalonia.SceneGraph/Media/TransformGroup.cs b/src/Avalonia.Visuals/Media/TransformGroup.cs similarity index 100% rename from src/Avalonia.SceneGraph/Media/TransformGroup.cs rename to src/Avalonia.Visuals/Media/TransformGroup.cs diff --git a/src/Avalonia.SceneGraph/Media/TranslateTransform.cs b/src/Avalonia.Visuals/Media/TranslateTransform.cs similarity index 100% rename from src/Avalonia.SceneGraph/Media/TranslateTransform.cs rename to src/Avalonia.Visuals/Media/TranslateTransform.cs diff --git a/src/Avalonia.SceneGraph/Media/VisualBrush.cs b/src/Avalonia.Visuals/Media/VisualBrush.cs similarity index 100% rename from src/Avalonia.SceneGraph/Media/VisualBrush.cs rename to src/Avalonia.Visuals/Media/VisualBrush.cs diff --git a/src/Avalonia.SceneGraph/Platform/ExportRenderingSubsystemAttribute.cs b/src/Avalonia.Visuals/Platform/ExportRenderingSubsystemAttribute.cs similarity index 100% rename from src/Avalonia.SceneGraph/Platform/ExportRenderingSubsystemAttribute.cs rename to src/Avalonia.Visuals/Platform/ExportRenderingSubsystemAttribute.cs diff --git a/src/Avalonia.SceneGraph/Platform/IBitmapImpl.cs b/src/Avalonia.Visuals/Platform/IBitmapImpl.cs similarity index 100% rename from src/Avalonia.SceneGraph/Platform/IBitmapImpl.cs rename to src/Avalonia.Visuals/Platform/IBitmapImpl.cs diff --git a/src/Avalonia.SceneGraph/Platform/IFormattedTextImpl.cs b/src/Avalonia.Visuals/Platform/IFormattedTextImpl.cs similarity index 100% rename from src/Avalonia.SceneGraph/Platform/IFormattedTextImpl.cs rename to src/Avalonia.Visuals/Platform/IFormattedTextImpl.cs diff --git a/src/Avalonia.SceneGraph/Platform/IGeometryImpl.cs b/src/Avalonia.Visuals/Platform/IGeometryImpl.cs similarity index 100% rename from src/Avalonia.SceneGraph/Platform/IGeometryImpl.cs rename to src/Avalonia.Visuals/Platform/IGeometryImpl.cs diff --git a/src/Avalonia.SceneGraph/Platform/IPlatformRenderInterface.cs b/src/Avalonia.Visuals/Platform/IPlatformRenderInterface.cs similarity index 100% rename from src/Avalonia.SceneGraph/Platform/IPlatformRenderInterface.cs rename to src/Avalonia.Visuals/Platform/IPlatformRenderInterface.cs diff --git a/src/Avalonia.SceneGraph/Platform/IPlatformSettings.cs b/src/Avalonia.Visuals/Platform/IPlatformSettings.cs similarity index 100% rename from src/Avalonia.SceneGraph/Platform/IPlatformSettings.cs rename to src/Avalonia.Visuals/Platform/IPlatformSettings.cs diff --git a/src/Avalonia.SceneGraph/Platform/IRenderTarget.cs b/src/Avalonia.Visuals/Platform/IRenderTarget.cs similarity index 100% rename from src/Avalonia.SceneGraph/Platform/IRenderTarget.cs rename to src/Avalonia.Visuals/Platform/IRenderTarget.cs diff --git a/src/Avalonia.SceneGraph/Platform/IRenderTargetBitmapImpl.cs b/src/Avalonia.Visuals/Platform/IRenderTargetBitmapImpl.cs similarity index 100% rename from src/Avalonia.SceneGraph/Platform/IRenderTargetBitmapImpl.cs rename to src/Avalonia.Visuals/Platform/IRenderTargetBitmapImpl.cs diff --git a/src/Avalonia.SceneGraph/Platform/IStreamGeometryContextImpl.cs b/src/Avalonia.Visuals/Platform/IStreamGeometryContextImpl.cs similarity index 100% rename from src/Avalonia.SceneGraph/Platform/IStreamGeometryContextImpl.cs rename to src/Avalonia.Visuals/Platform/IStreamGeometryContextImpl.cs diff --git a/src/Avalonia.SceneGraph/Platform/IStreamGeometryImpl.cs b/src/Avalonia.Visuals/Platform/IStreamGeometryImpl.cs similarity index 100% rename from src/Avalonia.SceneGraph/Platform/IStreamGeometryImpl.cs rename to src/Avalonia.Visuals/Platform/IStreamGeometryImpl.cs diff --git a/src/Avalonia.SceneGraph/Point.cs b/src/Avalonia.Visuals/Point.cs similarity index 100% rename from src/Avalonia.SceneGraph/Point.cs rename to src/Avalonia.Visuals/Point.cs diff --git a/src/Avalonia.SceneGraph/Properties/AssemblyInfo.cs b/src/Avalonia.Visuals/Properties/AssemblyInfo.cs similarity index 84% rename from src/Avalonia.SceneGraph/Properties/AssemblyInfo.cs rename to src/Avalonia.Visuals/Properties/AssemblyInfo.cs index b70832a031..25f5aeb8f8 100644 --- a/src/Avalonia.SceneGraph/Properties/AssemblyInfo.cs +++ b/src/Avalonia.Visuals/Properties/AssemblyInfo.cs @@ -4,7 +4,7 @@ using System.Reflection; using Avalonia.Metadata; -[assembly: AssemblyTitle("Avalonia.SceneGraph")] +[assembly: AssemblyTitle("Avalonia.Visuals")] [assembly: XmlnsDefinition("https://github.com/avaloniaui", "Avalonia.Animation")] [assembly: XmlnsDefinition("https://github.com/avaloniaui", "Avalonia.Media")] [assembly: XmlnsDefinition("https://github.com/avaloniaui/mutable", "Avalonia.Media.Mutable")] \ No newline at end of file diff --git a/src/Avalonia.SceneGraph/Rect.cs b/src/Avalonia.Visuals/Rect.cs similarity index 100% rename from src/Avalonia.SceneGraph/Rect.cs rename to src/Avalonia.Visuals/Rect.cs diff --git a/src/Avalonia.SceneGraph/RelativePoint.cs b/src/Avalonia.Visuals/RelativePoint.cs similarity index 100% rename from src/Avalonia.SceneGraph/RelativePoint.cs rename to src/Avalonia.Visuals/RelativePoint.cs diff --git a/src/Avalonia.SceneGraph/RelativeRect.cs b/src/Avalonia.Visuals/RelativeRect.cs similarity index 100% rename from src/Avalonia.SceneGraph/RelativeRect.cs rename to src/Avalonia.Visuals/RelativeRect.cs diff --git a/src/Avalonia.SceneGraph/RenderTargetCorruptedException.cs b/src/Avalonia.Visuals/RenderTargetCorruptedException.cs similarity index 100% rename from src/Avalonia.SceneGraph/RenderTargetCorruptedException.cs rename to src/Avalonia.Visuals/RenderTargetCorruptedException.cs diff --git a/src/Avalonia.SceneGraph/Rendering/DefaultRenderLoop.cs b/src/Avalonia.Visuals/Rendering/DefaultRenderLoop.cs similarity index 100% rename from src/Avalonia.SceneGraph/Rendering/DefaultRenderLoop.cs rename to src/Avalonia.Visuals/Rendering/DefaultRenderLoop.cs diff --git a/src/Avalonia.SceneGraph/Rendering/IRenderLoop.cs b/src/Avalonia.Visuals/Rendering/IRenderLoop.cs similarity index 100% rename from src/Avalonia.SceneGraph/Rendering/IRenderLoop.cs rename to src/Avalonia.Visuals/Rendering/IRenderLoop.cs diff --git a/src/Avalonia.SceneGraph/Rendering/IRenderRoot.cs b/src/Avalonia.Visuals/Rendering/IRenderRoot.cs similarity index 100% rename from src/Avalonia.SceneGraph/Rendering/IRenderRoot.cs rename to src/Avalonia.Visuals/Rendering/IRenderRoot.cs diff --git a/src/Avalonia.SceneGraph/Rendering/IRenderer.cs b/src/Avalonia.Visuals/Rendering/IRenderer.cs similarity index 100% rename from src/Avalonia.SceneGraph/Rendering/IRenderer.cs rename to src/Avalonia.Visuals/Rendering/IRenderer.cs diff --git a/src/Avalonia.SceneGraph/Rendering/IRendererFactory.cs b/src/Avalonia.Visuals/Rendering/IRendererFactory.cs similarity index 100% rename from src/Avalonia.SceneGraph/Rendering/IRendererFactory.cs rename to src/Avalonia.Visuals/Rendering/IRendererFactory.cs diff --git a/src/Avalonia.SceneGraph/Rendering/Renderer.cs b/src/Avalonia.Visuals/Rendering/Renderer.cs similarity index 100% rename from src/Avalonia.SceneGraph/Rendering/Renderer.cs rename to src/Avalonia.Visuals/Rendering/Renderer.cs diff --git a/src/Avalonia.SceneGraph/Rendering/RendererMixin.cs b/src/Avalonia.Visuals/Rendering/RendererMixin.cs similarity index 100% rename from src/Avalonia.SceneGraph/Rendering/RendererMixin.cs rename to src/Avalonia.Visuals/Rendering/RendererMixin.cs diff --git a/src/Avalonia.SceneGraph/Size.cs b/src/Avalonia.Visuals/Size.cs similarity index 100% rename from src/Avalonia.SceneGraph/Size.cs rename to src/Avalonia.Visuals/Size.cs diff --git a/src/Avalonia.SceneGraph/Thickness.cs b/src/Avalonia.Visuals/Thickness.cs similarity index 100% rename from src/Avalonia.SceneGraph/Thickness.cs rename to src/Avalonia.Visuals/Thickness.cs diff --git a/src/Avalonia.SceneGraph/Vector.cs b/src/Avalonia.Visuals/Vector.cs similarity index 100% rename from src/Avalonia.SceneGraph/Vector.cs rename to src/Avalonia.Visuals/Vector.cs diff --git a/src/Avalonia.SceneGraph/Visual.cs b/src/Avalonia.Visuals/Visual.cs similarity index 100% rename from src/Avalonia.SceneGraph/Visual.cs rename to src/Avalonia.Visuals/Visual.cs diff --git a/src/Avalonia.SceneGraph/VisualExtensions.cs b/src/Avalonia.Visuals/VisualExtensions.cs similarity index 72% rename from src/Avalonia.SceneGraph/VisualExtensions.cs rename to src/Avalonia.Visuals/VisualExtensions.cs index 6e55070702..d69785cc59 100644 --- a/src/Avalonia.SceneGraph/VisualExtensions.cs +++ b/src/Avalonia.Visuals/VisualExtensions.cs @@ -30,7 +30,7 @@ namespace Avalonia public static Point PointToClient(this IVisual visual, Point point) { var p = GetRootAndPosition(visual); - return p.Item1.PointToClient(point + p.Item2); + return p.Item1.PointToClient(point - p.Item2); } /// @@ -45,6 +45,22 @@ namespace Avalonia return p.Item1.PointToScreen(point + p.Item2); } + /// + /// Translates a point relative to this visual to coordinates that are relative to the specified visual. + /// The visual and relativeTo should be descendants of the same root window + /// + /// The visual. + /// The point value, as relative to this visual. + /// The visual to translate the given point into. + /// A point value, now relative to the target visual rather than this source element. + public static Point TranslatePoint(this IVisual visual, Point point, IVisual relativeTo) + { + var pos = GetRootAndPosition(visual); + var relToPos = GetRootAndPosition(relativeTo); + + return point - (relToPos.Item2 - pos.Item2); + } + /// /// Gets the root of the control's visual tree and the position of the control /// in the root's coordinate space. diff --git a/src/Avalonia.SceneGraph/VisualTree/BoundsTracker.cs b/src/Avalonia.Visuals/VisualTree/BoundsTracker.cs similarity index 100% rename from src/Avalonia.SceneGraph/VisualTree/BoundsTracker.cs rename to src/Avalonia.Visuals/VisualTree/BoundsTracker.cs diff --git a/src/Avalonia.SceneGraph/VisualTree/IHostedVisualTreeRoot.cs b/src/Avalonia.Visuals/VisualTree/IHostedVisualTreeRoot.cs similarity index 100% rename from src/Avalonia.SceneGraph/VisualTree/IHostedVisualTreeRoot.cs rename to src/Avalonia.Visuals/VisualTree/IHostedVisualTreeRoot.cs diff --git a/src/Avalonia.SceneGraph/VisualTree/IVisual.cs b/src/Avalonia.Visuals/VisualTree/IVisual.cs similarity index 100% rename from src/Avalonia.SceneGraph/VisualTree/IVisual.cs rename to src/Avalonia.Visuals/VisualTree/IVisual.cs diff --git a/src/Avalonia.SceneGraph/VisualTree/IVisualTreeHost.cs b/src/Avalonia.Visuals/VisualTree/IVisualTreeHost.cs similarity index 100% rename from src/Avalonia.SceneGraph/VisualTree/IVisualTreeHost.cs rename to src/Avalonia.Visuals/VisualTree/IVisualTreeHost.cs diff --git a/src/Avalonia.SceneGraph/VisualTree/TransformedBounds.cs b/src/Avalonia.Visuals/VisualTree/TransformedBounds.cs similarity index 100% rename from src/Avalonia.SceneGraph/VisualTree/TransformedBounds.cs rename to src/Avalonia.Visuals/VisualTree/TransformedBounds.cs diff --git a/src/Avalonia.SceneGraph/VisualTree/VisualExtensions.cs b/src/Avalonia.Visuals/VisualTree/VisualExtensions.cs similarity index 100% rename from src/Avalonia.SceneGraph/VisualTree/VisualExtensions.cs rename to src/Avalonia.Visuals/VisualTree/VisualExtensions.cs diff --git a/src/Avalonia.SceneGraph/VisualTreeAttachmentEventArgs.cs b/src/Avalonia.Visuals/VisualTreeAttachmentEventArgs.cs similarity index 100% rename from src/Avalonia.SceneGraph/VisualTreeAttachmentEventArgs.cs rename to src/Avalonia.Visuals/VisualTreeAttachmentEventArgs.cs diff --git a/src/Avalonia.SceneGraph/packages.config b/src/Avalonia.Visuals/packages.config similarity index 100% rename from src/Avalonia.SceneGraph/packages.config rename to src/Avalonia.Visuals/packages.config diff --git a/src/Gtk/Avalonia.Cairo/Avalonia.Cairo.csproj b/src/Gtk/Avalonia.Cairo/Avalonia.Cairo.csproj index 16a09821cb..3ecd91eee2 100644 --- a/src/Gtk/Avalonia.Cairo/Avalonia.Cairo.csproj +++ b/src/Gtk/Avalonia.Cairo/Avalonia.Cairo.csproj @@ -98,9 +98,9 @@ {42472427-4774-4C81-8AFF-9F27B8E31721} Avalonia.Layout - + {EB582467-6ABB-43A1-B052-E981BA910E3A} - Avalonia.SceneGraph + Avalonia.Visuals {f1baa01a-f176-4c6a-b39d-5b40bb1b148f} diff --git a/src/Gtk/Avalonia.Gtk/Avalonia.Gtk.csproj b/src/Gtk/Avalonia.Gtk/Avalonia.Gtk.csproj index 7e8c118196..b001c7bc19 100644 --- a/src/Gtk/Avalonia.Gtk/Avalonia.Gtk.csproj +++ b/src/Gtk/Avalonia.Gtk/Avalonia.Gtk.csproj @@ -79,9 +79,9 @@ {62024B2D-53EB-4638-B26B-85EEAA54866E} Avalonia.Input - + {EB582467-6ABB-43A1-B052-E981BA910E3A} - Avalonia.SceneGraph + Avalonia.Visuals {42472427-4774-4C81-8AFF-9F27B8E31721} diff --git a/src/Markup/Avalonia.Markup.Xaml/Avalonia.Markup.Xaml.csproj b/src/Markup/Avalonia.Markup.Xaml/Avalonia.Markup.Xaml.csproj index 2b0d034a5a..00edd205f3 100644 --- a/src/Markup/Avalonia.Markup.Xaml/Avalonia.Markup.Xaml.csproj +++ b/src/Markup/Avalonia.Markup.Xaml/Avalonia.Markup.Xaml.csproj @@ -308,9 +308,9 @@ {42472427-4774-4C81-8AFF-9F27B8E31721} Avalonia.Layout - + {EB582467-6ABB-43A1-B052-E981BA910E3A} - Avalonia.SceneGraph + Avalonia.Visuals {F1BAA01A-F176-4C6A-B39D-5B40BB1B148F} diff --git a/src/Markup/Avalonia.Markup/Avalonia.Markup.csproj b/src/Markup/Avalonia.Markup/Avalonia.Markup.csproj index 1c3f453280..5bdbb5a827 100644 --- a/src/Markup/Avalonia.Markup/Avalonia.Markup.csproj +++ b/src/Markup/Avalonia.Markup/Avalonia.Markup.csproj @@ -103,9 +103,9 @@ {42472427-4774-4c81-8aff-9f27b8e31721} Avalonia.Layout - + {eb582467-6abb-43a1-b052-e981ba910e3a} - Avalonia.SceneGraph + Avalonia.Visuals {f1baa01a-f176-4c6a-b39d-5b40bb1b148f} diff --git a/src/Shared/PlatformSupport/StandardRuntimePlatform.cs b/src/Shared/PlatformSupport/StandardRuntimePlatform.cs index e5ede1c6b4..5c02be7d5b 100644 --- a/src/Shared/PlatformSupport/StandardRuntimePlatform.cs +++ b/src/Shared/PlatformSupport/StandardRuntimePlatform.cs @@ -16,10 +16,7 @@ namespace Avalonia.Shared.PlatformSupport public void PostThreadPoolItem(Action cb) => ThreadPool.UnsafeQueueUserWorkItem(_ => cb(), null); public IDisposable StartSystemTimer(TimeSpan interval, Action tick) { - var timer = new Timer(delegate - { - - }, null, interval, interval); + var timer = new Timer(_ => tick(), null, interval, interval); return Disposable.Create(() => timer.Dispose()); } diff --git a/src/Skia/Avalonia.Skia.Android.TestApp/Avalonia.Skia.Android.TestApp.csproj b/src/Skia/Avalonia.Skia.Android.TestApp/Avalonia.Skia.Android.TestApp.csproj index db2964fdb2..041c8d9ecb 100644 --- a/src/Skia/Avalonia.Skia.Android.TestApp/Avalonia.Skia.Android.TestApp.csproj +++ b/src/Skia/Avalonia.Skia.Android.TestApp/Avalonia.Skia.Android.TestApp.csproj @@ -110,9 +110,9 @@ {42472427-4774-4c81-8aff-9f27b8e31721} Avalonia.Layout - + {eb582467-6abb-43a1-b052-e981ba910e3a} - Avalonia.SceneGraph + Avalonia.Visuals {f1baa01a-f176-4c6a-b39d-5b40bb1b148f} diff --git a/src/Skia/Avalonia.Skia.Android/Avalonia.Skia.Android.csproj b/src/Skia/Avalonia.Skia.Android/Avalonia.Skia.Android.csproj index b3b9a57880..cf352607f0 100644 --- a/src/Skia/Avalonia.Skia.Android/Avalonia.Skia.Android.csproj +++ b/src/Skia/Avalonia.Skia.Android/Avalonia.Skia.Android.csproj @@ -77,9 +77,9 @@ {42472427-4774-4c81-8aff-9f27b8e31721} Avalonia.Layout - + {eb582467-6abb-43a1-b052-e981ba910e3a} - Avalonia.SceneGraph + Avalonia.Visuals {f1baa01a-f176-4c6a-b39d-5b40bb1b148f} diff --git a/src/Skia/Avalonia.Skia.Desktop/Avalonia.Skia.Desktop.csproj b/src/Skia/Avalonia.Skia.Desktop/Avalonia.Skia.Desktop.csproj index f5dd4180eb..d7d865225a 100644 --- a/src/Skia/Avalonia.Skia.Desktop/Avalonia.Skia.Desktop.csproj +++ b/src/Skia/Avalonia.Skia.Desktop/Avalonia.Skia.Desktop.csproj @@ -103,9 +103,9 @@ {42472427-4774-4c81-8aff-9f27b8e31721} Avalonia.Layout - + {eb582467-6abb-43a1-b052-e981ba910e3a} - Avalonia.SceneGraph + Avalonia.Visuals {f1baa01a-f176-4c6a-b39d-5b40bb1b148f} diff --git a/src/Skia/Avalonia.Skia.iOS.TestApp/Avalonia.Skia.iOS.TestApp.csproj b/src/Skia/Avalonia.Skia.iOS.TestApp/Avalonia.Skia.iOS.TestApp.csproj index 6bfba688f9..9cef634048 100644 --- a/src/Skia/Avalonia.Skia.iOS.TestApp/Avalonia.Skia.iOS.TestApp.csproj +++ b/src/Skia/Avalonia.Skia.iOS.TestApp/Avalonia.Skia.iOS.TestApp.csproj @@ -1,4 +1,4 @@ - + Debug @@ -124,9 +124,9 @@ {42472427-4774-4c81-8aff-9f27b8e31721} Avalonia.Layout - + {eb582467-6abb-43a1-b052-e981ba910e3a} - Avalonia.SceneGraph + Avalonia.Visuals {f1baa01a-f176-4c6a-b39d-5b40bb1b148f} diff --git a/src/Skia/Avalonia.Skia.iOS/Avalonia.Skia.iOS.csproj b/src/Skia/Avalonia.Skia.iOS/Avalonia.Skia.iOS.csproj index 21123fae29..28892c3c01 100644 --- a/src/Skia/Avalonia.Skia.iOS/Avalonia.Skia.iOS.csproj +++ b/src/Skia/Avalonia.Skia.iOS/Avalonia.Skia.iOS.csproj @@ -76,9 +76,9 @@ {42472427-4774-4c81-8aff-9f27b8e31721} Avalonia.Layout - + {eb582467-6abb-43a1-b052-e981ba910e3a} - Avalonia.SceneGraph + Avalonia.Visuals {f1baa01a-f176-4c6a-b39d-5b40bb1b148f} diff --git a/src/Skia/Avalonia.Skia/FormattedTextImpl.cs b/src/Skia/Avalonia.Skia/FormattedTextImpl.cs index 51f4b2b724..7e70f9354e 100644 --- a/src/Skia/Avalonia.Skia/FormattedTextImpl.cs +++ b/src/Skia/Avalonia.Skia/FormattedTextImpl.cs @@ -585,7 +585,7 @@ namespace Avalonia.Skia if (_skiaLines.Count == 0) { _lines.Add(new FormattedTextLine(0, _lineHeight)); - _size = new Size(0, _lineHeight + lastLineDescent); + _size = new Size(0, _lineHeight); } else { diff --git a/src/Windows/Avalonia.Direct2D1/Avalonia.Direct2D1.csproj b/src/Windows/Avalonia.Direct2D1/Avalonia.Direct2D1.csproj index fb494c4f85..9f9558ff76 100644 --- a/src/Windows/Avalonia.Direct2D1/Avalonia.Direct2D1.csproj +++ b/src/Windows/Avalonia.Direct2D1/Avalonia.Direct2D1.csproj @@ -109,9 +109,9 @@ {42472427-4774-4C81-8AFF-9F27B8E31721} Avalonia.Layout - + {EB582467-6ABB-43A1-B052-E981BA910E3A} - Avalonia.SceneGraph + Avalonia.Visuals {f1baa01a-f176-4c6a-b39d-5b40bb1b148f} diff --git a/src/Windows/Avalonia.Win32/Avalonia.Win32.csproj b/src/Windows/Avalonia.Win32/Avalonia.Win32.csproj index 51ad5ce05e..4b190dc469 100644 --- a/src/Windows/Avalonia.Win32/Avalonia.Win32.csproj +++ b/src/Windows/Avalonia.Win32/Avalonia.Win32.csproj @@ -113,9 +113,9 @@ {42472427-4774-4C81-8AFF-9F27B8E31721} Avalonia.Layout - + {EB582467-6ABB-43A1-B052-E981BA910E3A} - Avalonia.SceneGraph + Avalonia.Visuals {F1BAA01A-F176-4C6A-B39D-5B40BB1B148F} diff --git a/src/iOS/Avalonia.iOS/Avalonia.iOS.csproj b/src/iOS/Avalonia.iOS/Avalonia.iOS.csproj index 6385ef3352..cbe17022b1 100644 --- a/src/iOS/Avalonia.iOS/Avalonia.iOS.csproj +++ b/src/iOS/Avalonia.iOS/Avalonia.iOS.csproj @@ -72,9 +72,9 @@ {42472427-4774-4c81-8aff-9f27b8e31721} Avalonia.Layout - + {eb582467-6abb-43a1-b052-e981ba910e3a} - Avalonia.SceneGraph + Avalonia.Visuals {f1baa01a-f176-4c6a-b39d-5b40bb1b148f} diff --git a/src/iOS/Avalonia.iOSTestApplication/Avalonia.iOSTestApplication.csproj b/src/iOS/Avalonia.iOSTestApplication/Avalonia.iOSTestApplication.csproj index 385de7949c..88123bf56c 100644 --- a/src/iOS/Avalonia.iOSTestApplication/Avalonia.iOSTestApplication.csproj +++ b/src/iOS/Avalonia.iOSTestApplication/Avalonia.iOSTestApplication.csproj @@ -171,9 +171,9 @@ {42472427-4774-4c81-8aff-9f27b8e31721} Avalonia.Layout - + {eb582467-6abb-43a1-b052-e981ba910e3a} - Avalonia.SceneGraph + Avalonia.Visuals {f1baa01a-f176-4c6a-b39d-5b40bb1b148f} diff --git a/tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_Binding.cs b/tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_Binding.cs index 66fe3c7767..5e286305d2 100644 --- a/tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_Binding.cs +++ b/tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_Binding.cs @@ -11,6 +11,13 @@ using Avalonia.Data; using Avalonia.Logging; using Avalonia.UnitTests; using Xunit; +using System.Threading.Tasks; +using Avalonia.Platform; +using System.Threading; +using Moq; +using System.Reactive.Disposables; +using System.Reactive.Concurrency; +using Avalonia.Threading; namespace Avalonia.Base.UnitTests { @@ -356,6 +363,29 @@ namespace Avalonia.Base.UnitTests Assert.True(called); } } + + [Fact] + public async void Bind_With_Scheduler_Executes_On_Scheduler() + { + var target = new Class1(); + var source = new Subject(); + var currentThreadId = Thread.CurrentThread.ManagedThreadId; + + var threadingInterfaceMock = new Mock(); + threadingInterfaceMock.SetupGet(mock => mock.CurrentThreadIsLoopThread) + .Returns(() => Thread.CurrentThread.ManagedThreadId == currentThreadId); + + using (AvaloniaLocator.EnterScope()) + { + AvaloniaLocator.CurrentMutable.Bind().ToConstant(threadingInterfaceMock.Object); + AvaloniaLocator.CurrentMutable.Bind().ToConstant(AvaloniaScheduler.Instance); + + target.Bind(Class1.QuxProperty, source); + + await Task.Run(() => source.OnNext(6.7)); + } + + } /// /// Returns an observable that returns a single value but does not complete. diff --git a/tests/Avalonia.Benchmarks/Avalonia.Benchmarks.csproj b/tests/Avalonia.Benchmarks/Avalonia.Benchmarks.csproj index ada6b53cda..cb8b32c2cc 100644 --- a/tests/Avalonia.Benchmarks/Avalonia.Benchmarks.csproj +++ b/tests/Avalonia.Benchmarks/Avalonia.Benchmarks.csproj @@ -1,4 +1,4 @@ - + @@ -98,9 +98,9 @@ {42472427-4774-4c81-8aff-9f27b8e31721} Avalonia.Layout - + {eb582467-6abb-43a1-b052-e981ba910e3a} - Avalonia.SceneGraph + Avalonia.Visuals {f1baa01a-f176-4c6a-b39d-5b40bb1b148f} diff --git a/tests/Avalonia.Controls.UnitTests/Avalonia.Controls.UnitTests.csproj b/tests/Avalonia.Controls.UnitTests/Avalonia.Controls.UnitTests.csproj index b967f68b78..aea972ec42 100644 --- a/tests/Avalonia.Controls.UnitTests/Avalonia.Controls.UnitTests.csproj +++ b/tests/Avalonia.Controls.UnitTests/Avalonia.Controls.UnitTests.csproj @@ -190,9 +190,9 @@ {42472427-4774-4C81-8AFF-9F27B8E31721} Avalonia.Layout - + {EB582467-6ABB-43A1-B052-E981BA910E3A} - Avalonia.SceneGraph + Avalonia.Visuals {F1BAA01A-F176-4C6A-B39D-5B40BB1B148F} diff --git a/tests/Avalonia.Controls.UnitTests/CarouselTests.cs b/tests/Avalonia.Controls.UnitTests/CarouselTests.cs index 0e3c6f5953..e91ab02327 100644 --- a/tests/Avalonia.Controls.UnitTests/CarouselTests.cs +++ b/tests/Avalonia.Controls.UnitTests/CarouselTests.cs @@ -50,8 +50,9 @@ namespace Avalonia.Controls.UnitTests Assert.Equal(1, target.GetLogicalChildren().Count()); var child = target.GetLogicalChildren().Single(); - Assert.IsType(child); - Assert.Equal("Foo", ((ContentPresenter)child).Content); + + Assert.IsType(child); + Assert.Equal("Foo", ((TextBlock)child).Text); } [Fact] diff --git a/tests/Avalonia.Controls.UnitTests/ItemsControlTests.cs b/tests/Avalonia.Controls.UnitTests/ItemsControlTests.cs index dcbc71b9a1..e88d1881e6 100644 --- a/tests/Avalonia.Controls.UnitTests/ItemsControlTests.cs +++ b/tests/Avalonia.Controls.UnitTests/ItemsControlTests.cs @@ -9,6 +9,8 @@ using Avalonia.Controls.Templates; using Avalonia.LogicalTree; using Avalonia.VisualTree; using Xunit; +using System.Collections.ObjectModel; +using Avalonia.UnitTests; namespace Avalonia.Controls.UnitTests { @@ -61,6 +63,32 @@ namespace Avalonia.Controls.UnitTests Assert.Null(container.TemplatedParent); } + [Fact] + public void Container_Child_Should_Have_LogicalParent_Set_To_Container() + { + using (UnitTestApplication.Start(TestServices.StyledWindow)) + { + var root = new Window(); + var target = new ItemsControl(); + + root.Content = target; + + var templatedParent = new Button(); + target.TemplatedParent = templatedParent; + target.Template = GetTemplate(); + + target.Items = new[] { "Foo" }; + + root.ApplyTemplate(); + target.ApplyTemplate(); + target.Presenter.ApplyTemplate(); + + var container = (ContentPresenter)target.Presenter.Panel.Children[0]; + + Assert.Equal(container, container.Child.Parent); + } + } + [Fact] public void Control_Item_Should_Be_Logical_Child_Before_ApplyTemplate() { @@ -138,7 +166,7 @@ namespace Avalonia.Controls.UnitTests } [Fact] - public void Adding_String_Item_Should_Make_ContentPresenter_Appear_In_LogicalChildren() + public void Adding_String_Item_Should_Make_TextBlock_Appear_In_LogicalChildren() { var target = new ItemsControl(); var child = new Control(); @@ -150,7 +178,7 @@ namespace Avalonia.Controls.UnitTests var logical = (ILogical)target; Assert.Equal(1, logical.LogicalChildren.Count); - Assert.IsType(logical.LogicalChildren[0]); + Assert.IsType(logical.LogicalChildren[0]); } [Fact] @@ -171,6 +199,7 @@ namespace Avalonia.Controls.UnitTests Assert.Equal(new ILogical[0], target.GetLogicalChildren()); } + [Fact] public void Setting_Items_Should_Fire_LogicalChildren_CollectionChanged() { diff --git a/tests/Avalonia.DesignerSupport.TestApp/Avalonia.DesignerSupport.TestApp.csproj b/tests/Avalonia.DesignerSupport.TestApp/Avalonia.DesignerSupport.TestApp.csproj index e0a25ededb..3519590080 100644 --- a/tests/Avalonia.DesignerSupport.TestApp/Avalonia.DesignerSupport.TestApp.csproj +++ b/tests/Avalonia.DesignerSupport.TestApp/Avalonia.DesignerSupport.TestApp.csproj @@ -18,7 +18,7 @@ true full false - bin\Debug\ + ..\..\artifacts\tests\ DEBUG;TRACE prompt 4 @@ -27,7 +27,7 @@ AnyCPU pdbonly true - bin\Release\ + ..\..\artifacts\tests\ TRACE prompt 4 @@ -117,9 +117,9 @@ {42472427-4774-4c81-8aff-9f27b8e31721} Avalonia.Layout - + {eb582467-6abb-43a1-b052-e981ba910e3a} - Avalonia.SceneGraph + Avalonia.Visuals {f1baa01a-f176-4c6a-b39d-5b40bb1b148f} diff --git a/tests/Avalonia.DesignerSupport.Tests/Avalonia.DesignerSupport.Tests.csproj b/tests/Avalonia.DesignerSupport.Tests/Avalonia.DesignerSupport.Tests.csproj index 7a1c1207ce..97dfda5967 100644 --- a/tests/Avalonia.DesignerSupport.Tests/Avalonia.DesignerSupport.Tests.csproj +++ b/tests/Avalonia.DesignerSupport.Tests/Avalonia.DesignerSupport.Tests.csproj @@ -16,7 +16,7 @@ true full false - bin\Debug\ + ..\..\artifacts\tests\ DEBUG;TRACE prompt 4 @@ -24,7 +24,7 @@ pdbonly true - bin\Release\ + ..\..\artifacts\tests\ TRACE prompt 4 @@ -69,6 +69,12 @@ + + + {f1381f98-4d24-409a-a6c5-1c5b1e08bb08} + Avalonia.DesignerSupport.TestApp + +