Browse Source

Revert "Merge pull request #11287 from AvaloniaUI/fixes/dont-focus-invisible-control"

This reverts commit 5f9bc80826, reversing
changes made to b5d7bd7df4.
release/11.0.0-preview8
Dan Walmsley 3 years ago
parent
commit
7718da4358
  1. 7
      src/Avalonia.Base/Input/FocusManager.cs
  2. 4
      src/Avalonia.Base/Input/InputElement.cs
  3. 240
      tests/Avalonia.Base.UnitTests/Input/InputElement_Focus.cs
  4. 1
      tests/Avalonia.Controls.UnitTests/MaskedTextBoxTests.cs
  5. 1
      tests/Avalonia.Controls.UnitTests/TextBoxTests.cs
  6. 8
      tests/Avalonia.Controls.UnitTests/VirtualizingStackPanelTests.cs
  7. 4
      tests/Avalonia.LeakTests/ControlTests.cs

7
src/Avalonia.Base/Input/FocusManager.cs

@ -122,11 +122,6 @@ namespace Avalonia.Input
{
scope = scope ?? throw new ArgumentNullException(nameof(scope));
if (element is not null && !CanFocus(element))
{
return;
}
if (_focusScopes.TryGetValue(scope, out var existingElement))
{
if (element != existingElement)
@ -247,6 +242,6 @@ namespace Avalonia.Input
}
}
private static bool IsVisible(IInputElement e) => (e as Visual)?.IsEffectivelyVisible ?? true;
private static bool IsVisible(IInputElement e) => (e as Visual)?.IsVisible ?? true;
}
}

4
src/Avalonia.Base/Input/InputElement.cs

@ -647,10 +647,6 @@ namespace Avalonia.Input
{
PseudoClasses.Set(":focus-within", change.GetNewValue<bool>());
}
else if (change.Property == IsVisibleProperty && !change.GetNewValue<bool>() && IsFocused)
{
FocusManager.Instance?.Focus(null);
}
}
/// <summary>

240
tests/Avalonia.Base.UnitTests/Input/InputElement_Focus.cs

@ -26,138 +26,6 @@ namespace Avalonia.Base.UnitTests.Input
Assert.Same(target, FocusManager.Instance.Current);
}
}
[Fact]
public void Invisible_Controls_Should_Not_Receive_Focus()
{
Button target;
using (UnitTestApplication.Start(TestServices.RealFocus))
{
var root = new TestRoot
{
Child = target = new Button() { IsVisible = false}
};
Assert.Null(FocusManager.Instance.Current);
target.Focus();
Assert.False(target.IsFocused);
Assert.False(target.IsKeyboardFocusWithin);
Assert.Null(FocusManager.Instance.Current);
}
}
[Fact]
public void Effectively_Invisible_Controls_Should_Not_Receive_Focus()
{
var target = new Button();
Panel container;
using (UnitTestApplication.Start(TestServices.RealFocus))
{
var root = new TestRoot
{
Child = container = new Panel
{
IsVisible = false,
Children = { target }
}
};
Assert.Null(FocusManager.Instance.Current);
target.Focus();
Assert.False(target.IsFocused);
Assert.False(target.IsKeyboardFocusWithin);
Assert.Null(FocusManager.Instance.Current);
}
}
[Fact]
public void Trying_To_Focus_Invisible_Control_Should_Not_Change_Focus()
{
Button first;
Button second;
using (UnitTestApplication.Start(TestServices.RealFocus))
{
var root = new TestRoot
{
Child = new StackPanel
{
Children =
{
(first = new Button()),
(second = new Button() { IsVisible = false}),
}
}
};
first.Focus();
Assert.Same(first, FocusManager.Instance.Current);
second.Focus();
Assert.Same(first, FocusManager.Instance.Current);
}
}
[Fact]
public void Disabled_Controls_Should_Not_Receive_Focus()
{
Button target;
using (UnitTestApplication.Start(TestServices.RealFocus))
{
var root = new TestRoot
{
Child = target = new Button() { IsEnabled = false }
};
Assert.Null(FocusManager.Instance.Current);
target.Focus();
Assert.False(target.IsFocused);
Assert.False(target.IsKeyboardFocusWithin);
Assert.Null(FocusManager.Instance.Current);
}
}
[Fact]
public void Effectively_Disabled_Controls_Should_Not_Receive_Focus()
{
var target = new Button();
Panel container;
using (UnitTestApplication.Start(TestServices.RealFocus))
{
var root = new TestRoot
{
Child = container = new Panel
{
IsEnabled = false,
Children = { target }
}
};
Assert.Null(FocusManager.Instance.Current);
target.Focus();
Assert.False(target.IsFocused);
Assert.False(target.IsKeyboardFocusWithin);
Assert.Null(FocusManager.Instance.Current);
}
}
[Fact]
public void Focus_Should_Not_Get_Restored_To_Enabled_Control()
@ -186,90 +54,6 @@ namespace Avalonia.Base.UnitTests.Input
}
}
[Fact]
public void Focus_Should_Be_Cleared_When_Control_Is_Hidden()
{
Button target;
using (UnitTestApplication.Start(TestServices.RealFocus))
{
var root = new TestRoot
{
Child = target = new Button()
};
target.Focus();
target.IsVisible = false;
Assert.Null(FocusManager.Instance.Current);
}
}
[Fact(Skip = "Need to implement IsEffectivelyVisible change notifications.")]
public void Focus_Should_Be_Cleared_When_Control_Is_Effectively_Hidden()
{
Border container;
Button target;
using (UnitTestApplication.Start(TestServices.RealFocus))
{
var root = new TestRoot
{
Child = container = new Border
{
Child = target = new Button(),
}
};
target.Focus();
container.IsVisible = false;
Assert.Null(FocusManager.Instance.Current);
}
}
[Fact]
public void Focus_Should_Be_Cleared_When_Control_Is_Disabled()
{
Button target;
using (UnitTestApplication.Start(TestServices.RealFocus))
{
var root = new TestRoot
{
Child = target = new Button()
};
target.Focus();
target.IsEnabled = false;
Assert.Null(FocusManager.Instance.Current);
}
}
[Fact]
public void Focus_Should_Be_Cleared_When_Control_Is_Effectively_Disabled()
{
Border container;
Button target;
using (UnitTestApplication.Start(TestServices.RealFocus))
{
var root = new TestRoot
{
Child = container = new Border
{
Child = target = new Button(),
}
};
target.Focus();
container.IsEnabled = false;
Assert.Null(FocusManager.Instance.Current);
}
}
[Fact]
public void Focus_Should_Be_Cleared_When_Control_Is_Removed_From_VisualTree()
{
@ -294,8 +78,8 @@ namespace Avalonia.Base.UnitTests.Input
{
using (UnitTestApplication.Start(TestServices.RealFocus))
{
var target1 = new Decorator { Focusable = true };
var target2 = new Decorator { Focusable = true };
var target1 = new Decorator();
var target2 = new Decorator();
var root = new TestRoot
{
Child = new StackPanel
@ -331,8 +115,8 @@ namespace Avalonia.Base.UnitTests.Input
{
using (UnitTestApplication.Start(TestServices.RealFocus))
{
var target1 = new Decorator { Focusable = true };
var target2 = new Decorator { Focusable = true };
var target1 = new Decorator();
var target2 = new Decorator();
var root = new TestRoot
{
Child = new StackPanel
@ -373,8 +157,8 @@ namespace Avalonia.Base.UnitTests.Input
{
using (UnitTestApplication.Start(TestServices.RealFocus))
{
var target1 = new Decorator { Focusable = true };
var target2 = new Decorator { Focusable = true };
var target1 = new Decorator();
var target2 = new Decorator();
var root = new TestRoot
{
Child = new StackPanel
@ -406,8 +190,8 @@ namespace Avalonia.Base.UnitTests.Input
{
using (UnitTestApplication.Start(TestServices.RealFocus))
{
var target1 = new Decorator { Focusable = true };
var target2 = new Decorator { Focusable = true };
var target1 = new Decorator();
var target2 = new Decorator();
var panel1 = new Panel { Children = { target1 } };
var panel2 = new Panel { Children = { target2 } };
var root = new TestRoot
@ -461,8 +245,8 @@ namespace Avalonia.Base.UnitTests.Input
{
using (UnitTestApplication.Start(TestServices.RealFocus))
{
var target1 = new Decorator { Focusable = true };
var target2 = new Decorator { Focusable = true };
var target1 = new Decorator();
var target2 = new Decorator();
var root = new TestRoot
{
Child = new StackPanel
@ -506,8 +290,8 @@ namespace Avalonia.Base.UnitTests.Input
{
using (UnitTestApplication.Start(TestServices.RealFocus))
{
var target1 = new Decorator { Focusable = true };
var target2 = new Decorator { Focusable = true };
var target1 = new Decorator();
var target2 = new Decorator();
var root1 = new TestRoot
{

1
tests/Avalonia.Controls.UnitTests/MaskedTextBoxTests.cs

@ -657,6 +657,7 @@ namespace Avalonia.Controls.UnitTests
{
Template = CreateTemplate(),
Text = "1234",
IsVisible = false
};
var root = new TestRoot { Child = target1 };

1
tests/Avalonia.Controls.UnitTests/TextBoxTests.cs

@ -594,6 +594,7 @@ namespace Avalonia.Controls.UnitTests
{
Template = CreateTemplate(),
Text = "1234",
IsVisible = false
};
var root = new TestRoot { Child = target1 };

8
tests/Avalonia.Controls.UnitTests/VirtualizingStackPanelTests.cs

@ -298,9 +298,7 @@ namespace Avalonia.Controls.UnitTests
using var app = App();
var (target, scroll, itemsControl) = CreateTarget();
var focused = target.GetRealizedElements().First()!;
focused.Focusable = true;
focused.Focus();
target.GetRealizedElements().First()!.Focus();
Assert.True(target.GetRealizedElements().First()!.IsKeyboardFocusWithin);
scroll.Offset = new Vector(0, 200);
@ -316,7 +314,6 @@ namespace Avalonia.Controls.UnitTests
var (target, scroll, itemsControl) = CreateTarget();
var focused = target.GetRealizedElements().First()!;
focused.Focusable = true;
focused.Focus();
Assert.True(focused.IsKeyboardFocusWithin);
@ -334,7 +331,6 @@ namespace Avalonia.Controls.UnitTests
var (target, scroll, itemsControl) = CreateTarget();
var focused = target.GetRealizedElements().First()!;
focused.Focusable = true;
focused.Focus();
Assert.True(focused.IsKeyboardFocusWithin);
@ -354,14 +350,12 @@ namespace Avalonia.Controls.UnitTests
var (target, scroll, itemsControl) = CreateTarget();
var originalFocused = target.GetRealizedElements().First()!;
originalFocused.Focusable = true;
originalFocused.Focus();
scroll.Offset = new Vector(0, 500);
Layout(target);
var newFocused = target.GetRealizedElements().First()!;
newFocused.Focusable = true;
newFocused.Focus();
Assert.False(originalFocused.IsVisible);

4
tests/Avalonia.LeakTests/ControlTests.cs

@ -558,7 +558,7 @@ namespace Avalonia.LeakTests
control.ContextMenu = null;
}
var window = new Window { Focusable = true };
var window = new Window();
window.Show();
Assert.Same(window, FocusManager.Instance.Current);
@ -605,7 +605,7 @@ namespace Avalonia.LeakTests
contextMenu.Close();
}
var window = new Window { Focusable = true };
var window = new Window();
window.Show();
Assert.Same(window, FocusManager.Instance.Current);

Loading…
Cancel
Save