diff --git a/appveyor.yml b/appveyor.yml index 55e703d0d5..5fe05598af 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -5,8 +5,6 @@ configuration: environment: DOTNET_SKIP_FIRST_TIME_EXPERIENCE: 1 DOTNET_CLI_TELEMETRY_OPTOUT: 1 - NUGET_API_KEY: - secure: Xv89dlP2MSBZKhl1nrWSxqcDgCXB0HRhOd4SWQ+jRJ7QoLxQel5mLTipXM++J3G5 NUGET_API_URL: https://www.nuget.org/api/v2/package MYGET_API_KEY: secure: OtVfyN3ErqQrDTnWH2HDfJDlCiu/i4/X4wFmK3ZXXP7HmCiXYPSbTjMPwwdOxRaK diff --git a/src/Avalonia.Controls/TextBox.cs b/src/Avalonia.Controls/TextBox.cs index e939ace66d..3ec3d6ed5b 100644 --- a/src/Avalonia.Controls/TextBox.cs +++ b/src/Avalonia.Controls/TextBox.cs @@ -103,7 +103,7 @@ namespace Avalonia.Controls if (acceptsReturn) { return wrapping == TextWrapping.NoWrap ? - ScrollBarVisibility.Visible : + ScrollBarVisibility.Auto : ScrollBarVisibility.Disabled; } else diff --git a/src/Avalonia.Visuals/Rendering/SceneGraph/IVisualNode.cs b/src/Avalonia.Visuals/Rendering/SceneGraph/IVisualNode.cs index 681f00799b..1668f592ec 100644 --- a/src/Avalonia.Visuals/Rendering/SceneGraph/IVisualNode.cs +++ b/src/Avalonia.Visuals/Rendering/SceneGraph/IVisualNode.cs @@ -93,5 +93,7 @@ namespace Avalonia.Rendering.SceneGraph /// to hit test children they must be hit tested manually. /// bool HitTest(Point p); + + bool Disposed { get; } } } diff --git a/src/Avalonia.Visuals/Rendering/SceneGraph/Scene.cs b/src/Avalonia.Visuals/Rendering/SceneGraph/Scene.cs index 352d41d024..ffa0b0bcc5 100644 --- a/src/Avalonia.Visuals/Rendering/SceneGraph/Scene.cs +++ b/src/Avalonia.Visuals/Rendering/SceneGraph/Scene.cs @@ -98,7 +98,10 @@ namespace Avalonia.Rendering.SceneGraph public void Dispose() { - Root.Dispose(); + foreach (var node in _index.Values) + { + node.Dispose(); + } } /// @@ -137,6 +140,8 @@ namespace Avalonia.Rendering.SceneGraph Contract.Requires(node != null); _index.Remove(node.Visual); + + node.Dispose(); } private VisualNode Clone(VisualNode source, IVisualNode parent, Dictionary index) diff --git a/src/Avalonia.Visuals/Rendering/SceneGraph/VisualNode.cs b/src/Avalonia.Visuals/Rendering/SceneGraph/VisualNode.cs index 427f819200..3ee689b6d2 100644 --- a/src/Avalonia.Visuals/Rendering/SceneGraph/VisualNode.cs +++ b/src/Avalonia.Visuals/Rendering/SceneGraph/VisualNode.cs @@ -113,6 +113,11 @@ namespace Avalonia.Rendering.SceneGraph /// The child to add. public void AddChild(IVisualNode child) { + if (child.Disposed) + { + throw new ObjectDisposedException("Visual node for {node.Visual}"); + } + EnsureChildrenCreated(); _children.Add(child); } @@ -135,7 +140,6 @@ namespace Avalonia.Rendering.SceneGraph { EnsureChildrenCreated(); _children.Remove(child); - child.Dispose(); } /// @@ -145,13 +149,13 @@ namespace Avalonia.Rendering.SceneGraph /// The child to add. public void ReplaceChild(int index, IVisualNode node) { - EnsureChildrenCreated(); - var old = _children[index]; - _children[index] = node; - if (node != old) + if (node.Disposed) { - old.Dispose(); + throw new ObjectDisposedException("Visual node for {node.Visual}"); } + + EnsureChildrenCreated(); + _children[index] = node; } /// @@ -332,13 +336,11 @@ namespace Avalonia.Rendering.SceneGraph _drawOperationsCloned = false; } } + + public bool Disposed { get; } public void Dispose() { - foreach (var child in Children) - { - child.Dispose(); - } _drawOperationsRefCounter?.Dispose(); } diff --git a/src/Shared/SharedAssemblyInfo.cs b/src/Shared/SharedAssemblyInfo.cs index 548a46dde4..98047b4cc8 100644 --- a/src/Shared/SharedAssemblyInfo.cs +++ b/src/Shared/SharedAssemblyInfo.cs @@ -14,6 +14,6 @@ using System.Runtime.CompilerServices; [assembly: AssemblyTrademark("")] [assembly: NeutralResourcesLanguage("en")] -[assembly: AssemblyVersion("0.5.2")] -[assembly: AssemblyFileVersion("0.5.2")] -[assembly: AssemblyInformationalVersion("0.5.2")] +[assembly: AssemblyVersion("0.6.0")] +[assembly: AssemblyFileVersion("0.6.0")] +[assembly: AssemblyInformationalVersion("0.6.0")] diff --git a/tests/Avalonia.Controls.UnitTests/TextBoxTests.cs b/tests/Avalonia.Controls.UnitTests/TextBoxTests.cs index b091f6826e..5ddc8e71e7 100644 --- a/tests/Avalonia.Controls.UnitTests/TextBoxTests.cs +++ b/tests/Avalonia.Controls.UnitTests/TextBoxTests.cs @@ -4,10 +4,12 @@ using System; using System.Reactive.Linq; using Avalonia.Controls.Presenters; +using Avalonia.Controls.Primitives; using Avalonia.Controls.Templates; using Avalonia.Data; using Avalonia.Input; using Avalonia.Markup.Xaml.Data; +using Avalonia.Media; using Avalonia.Platform; using Avalonia.UnitTests; using Moq; @@ -245,6 +247,28 @@ namespace Avalonia.Controls.UnitTests } } + [Theory] + [InlineData(new object[] { false, TextWrapping.NoWrap, ScrollBarVisibility.Hidden })] + [InlineData(new object[] { false, TextWrapping.Wrap, ScrollBarVisibility.Hidden })] + [InlineData(new object[] { true, TextWrapping.NoWrap, ScrollBarVisibility.Auto })] + [InlineData(new object[] { true, TextWrapping.Wrap, ScrollBarVisibility.Disabled })] + public void Has_Correct_Horizontal_ScrollBar_Visibility( + bool acceptsReturn, + TextWrapping wrapping, + ScrollBarVisibility expected) + { + using (UnitTestApplication.Start(Services)) + { + var target = new TextBox + { + AcceptsReturn = acceptsReturn, + TextWrapping = wrapping, + }; + + Assert.Equal(expected, ScrollViewer.GetHorizontalScrollBarVisibility(target)); + } + } + private static TestServices Services => TestServices.MockThreadingInterface.With( standardCursorFactory: Mock.Of());