Browse Source

Merge branch 'master' into fixes/2458-window-onclosing

pull/2542/head
Steven Kirk 7 years ago
committed by GitHub
parent
commit
5673c32c63
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 2
      src/Avalonia.Controls/Application.cs
  2. 18
      src/Avalonia.Controls/Primitives/SelectingItemsControl.cs
  3. 2
      src/Avalonia.Styling/Controls/IResourceProvider.cs
  4. 2
      src/Avalonia.Styling/Controls/ResourceDictionary.cs
  5. 10
      src/Avalonia.Styling/Controls/ResourceProviderExtensions.cs
  6. 2
      src/Avalonia.Styling/StyledElement.cs
  7. 2
      src/Avalonia.Styling/Styling/Style.cs
  8. 2
      src/Avalonia.Styling/Styling/Styles.cs
  9. 2
      src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/DynamicResourceExtension.cs
  10. 2
      src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/ResourceInclude.cs
  11. 2
      src/Markup/Avalonia.Markup.Xaml/Styling/StyleInclude.cs
  12. 133
      tests/Avalonia.Controls.UnitTests/TreeViewTests.cs

2
src/Avalonia.Controls/Application.cs

@ -362,7 +362,7 @@ namespace Avalonia
}
/// <inheritdoc/>
bool IResourceProvider.TryGetResource(string key, out object value)
bool IResourceProvider.TryGetResource(object key, out object value)
{
value = null;
return (_resources?.TryGetResource(key, out value) ?? false) ||

18
src/Avalonia.Controls/Primitives/SelectingItemsControl.cs

@ -644,20 +644,20 @@ namespace Avalonia.Controls.Primitives
/// <param name="desired">The desired items.</param>
internal static void SynchronizeItems(IList items, IEnumerable<object> desired)
{
int index = 0;
var index = 0;
foreach (var i in desired)
foreach (object item in desired)
{
if (index < items.Count)
int itemIndex = items.IndexOf(item);
if (itemIndex == -1)
{
if (items[index] != i)
{
items[index] = i;
}
items.Insert(index, item);
}
else
else if(itemIndex != index)
{
items.Add(i);
items.RemoveAt(itemIndex);
items.Insert(index, item);
}
++index;

2
src/Avalonia.Styling/Controls/IResourceProvider.cs

@ -28,6 +28,6 @@ namespace Avalonia.Controls
/// <returns>
/// True if the resource if found, otherwise false.
/// </returns>
bool TryGetResource(string key, out object value);
bool TryGetResource(object key, out object value);
}
}

2
src/Avalonia.Styling/Controls/ResourceDictionary.cs

@ -69,7 +69,7 @@ namespace Avalonia.Controls
}
/// <inheritdoc/>
public bool TryGetResource(string key, out object value)
public bool TryGetResource(object key, out object value)
{
if (TryGetValue(key, out value))
{

10
src/Avalonia.Styling/Controls/ResourceProviderExtensions.cs

@ -11,7 +11,7 @@ namespace Avalonia.Controls
/// <param name="control">The control.</param>
/// <param name="key">The resource key.</param>
/// <returns>The resource, or <see cref="AvaloniaProperty.UnsetValue"/> if not found.</returns>
public static object FindResource(this IResourceNode control, string key)
public static object FindResource(this IResourceNode control, object key)
{
if (control.TryFindResource(key, out var value))
{
@ -28,7 +28,7 @@ namespace Avalonia.Controls
/// <param name="key">The resource key.</param>
/// <param name="value">On return, contains the resource if found, otherwise null.</param>
/// <returns>True if the resource was found; otherwise false.</returns>
public static bool TryFindResource(this IResourceNode control, string key, out object value)
public static bool TryFindResource(this IResourceNode control, object key, out object value)
{
Contract.Requires<ArgumentNullException>(control != null);
Contract.Requires<ArgumentNullException>(key != null);
@ -52,7 +52,7 @@ namespace Avalonia.Controls
return false;
}
public static IObservable<object> GetResourceObservable(this IResourceNode target, string key)
public static IObservable<object> GetResourceObservable(this IResourceNode target, object key)
{
return new ResourceObservable(target, key);
}
@ -60,9 +60,9 @@ namespace Avalonia.Controls
private class ResourceObservable : LightweightObservableBase<object>
{
private readonly IResourceNode _target;
private readonly string _key;
private readonly object _key;
public ResourceObservable(IResourceNode target, string key)
public ResourceObservable(IResourceNode target, object key)
{
_target = target;
_key = key;

2
src/Avalonia.Styling/StyledElement.cs

@ -415,7 +415,7 @@ namespace Avalonia
}
/// <inheritdoc/>
bool IResourceProvider.TryGetResource(string key, out object value)
bool IResourceProvider.TryGetResource(object key, out object value)
{
value = null;
return (_resources?.TryGetResource(key, out value) ?? false) ||

2
src/Avalonia.Styling/Styling/Style.cs

@ -171,7 +171,7 @@ namespace Avalonia.Styling
}
/// <inheritdoc/>
public bool TryGetResource(string key, out object result)
public bool TryGetResource(object key, out object result)
{
result = null;
return _resources?.TryGetResource(key, out result) ?? false;

2
src/Avalonia.Styling/Styling/Styles.cs

@ -178,7 +178,7 @@ namespace Avalonia.Styling
}
/// <inheritdoc/>
public bool TryGetResource(string key, out object value)
public bool TryGetResource(object key, out object value)
{
if (_resources != null && _resources.TryGetValue(key, out value))
{

2
src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/DynamicResourceExtension.cs

@ -26,7 +26,7 @@ namespace Avalonia.Markup.Xaml.MarkupExtensions
ResourceKey = resourceKey;
}
public string ResourceKey { get; set; }
public object ResourceKey { get; set; }
public override object ProvideValue(IServiceProvider serviceProvider) => ProvideTypedValue(serviceProvider);

2
src/Markup/Avalonia.Markup.Xaml/MarkupExtensions/ResourceInclude.cs

@ -47,7 +47,7 @@ namespace Avalonia.Markup.Xaml.MarkupExtensions
bool IResourceProvider.HasResources => Loaded.HasResources;
/// <inhertidoc/>
bool IResourceProvider.TryGetResource(string key, out object value)
bool IResourceProvider.TryGetResource(object key, out object value)
{
return Loaded.TryGetResource(key, out value);
}

2
src/Markup/Avalonia.Markup.Xaml/Styling/StyleInclude.cs

@ -86,7 +86,7 @@ namespace Avalonia.Markup.Xaml.Styling
}
/// <inheritdoc/>
public bool TryGetResource(string key, out object value) => Loaded.TryGetResource(key, out value);
public bool TryGetResource(object key, out object value) => Loaded.TryGetResource(key, out value);
/// <inheritdoc/>
void ISetStyleParent.NotifyResourcesChanged(ResourcesChangedEventArgs e)

133
tests/Avalonia.Controls.UnitTests/TreeViewTests.cs

@ -10,6 +10,7 @@ using Avalonia.Controls.Templates;
using Avalonia.Data;
using Avalonia.Data.Core;
using Avalonia.Input;
using Avalonia.Input.Platform;
using Avalonia.LogicalTree;
using Avalonia.UnitTests;
using Xunit;
@ -425,7 +426,6 @@ namespace Avalonia.Controls.UnitTests
Assert.True(called);
}
[Fact]
public void LogicalChildren_Should_Be_Set()
{
@ -623,6 +623,135 @@ namespace Avalonia.Controls.UnitTests
}
}
[Fact]
public void Pressing_SelectAll_Gesture_Should_Select_All_Nodes()
{
using (UnitTestApplication.Start())
{
var tree = CreateTestTreeData();
var target = new TreeView
{
Template = CreateTreeViewTemplate(),
Items = tree,
SelectionMode = SelectionMode.Multiple
};
var visualRoot = new TestRoot();
visualRoot.Child = target;
CreateNodeDataTemplate(target);
ApplyTemplates(target);
var rootNode = tree[0];
var keymap = AvaloniaLocator.Current.GetService<PlatformHotkeyConfiguration>();
var selectAllGesture = keymap.SelectAll.First();
var keyEvent = new KeyEventArgs
{
RoutedEvent = InputElement.KeyDownEvent,
Key = selectAllGesture.Key,
Modifiers = selectAllGesture.Modifiers
};
target.RaiseEvent(keyEvent);
TreeTestHelper.AssertChildrenSelected(target, rootNode);
}
}
[Fact]
public void Pressing_SelectAll_Gesture_With_Downward_Range_Selected_Should_Select_All_Nodes()
{
using (UnitTestApplication.Start())
{
var tree = CreateTestTreeData();
var target = new TreeView
{
Template = CreateTreeViewTemplate(),
Items = tree,
SelectionMode = SelectionMode.Multiple
};
var visualRoot = new TestRoot();
visualRoot.Child = target;
CreateNodeDataTemplate(target);
ApplyTemplates(target);
var rootNode = tree[0];
var from = rootNode.Children[0];
var to = rootNode.Children.Last();
var fromContainer = (TreeViewItem)target.ItemContainerGenerator.Index.ContainerFromItem(from);
var toContainer = (TreeViewItem)target.ItemContainerGenerator.Index.ContainerFromItem(to);
TreeTestHelper.ClickContainer(fromContainer, InputModifiers.None);
TreeTestHelper.ClickContainer(toContainer, InputModifiers.Shift);
var keymap = AvaloniaLocator.Current.GetService<PlatformHotkeyConfiguration>();
var selectAllGesture = keymap.SelectAll.First();
var keyEvent = new KeyEventArgs
{
RoutedEvent = InputElement.KeyDownEvent,
Key = selectAllGesture.Key,
Modifiers = selectAllGesture.Modifiers
};
target.RaiseEvent(keyEvent);
TreeTestHelper.AssertChildrenSelected(target, rootNode);
}
}
[Fact]
public void Pressing_SelectAll_Gesture_With_Upward_Range_Selected_Should_Select_All_Nodes()
{
using (UnitTestApplication.Start())
{
var tree = CreateTestTreeData();
var target = new TreeView
{
Template = CreateTreeViewTemplate(),
Items = tree,
SelectionMode = SelectionMode.Multiple
};
var visualRoot = new TestRoot();
visualRoot.Child = target;
CreateNodeDataTemplate(target);
ApplyTemplates(target);
var rootNode = tree[0];
var from = rootNode.Children.Last();
var to = rootNode.Children[0];
var fromContainer = (TreeViewItem)target.ItemContainerGenerator.Index.ContainerFromItem(from);
var toContainer = (TreeViewItem)target.ItemContainerGenerator.Index.ContainerFromItem(to);
TreeTestHelper.ClickContainer(fromContainer, InputModifiers.None);
TreeTestHelper.ClickContainer(toContainer, InputModifiers.Shift);
var keymap = AvaloniaLocator.Current.GetService<PlatformHotkeyConfiguration>();
var selectAllGesture = keymap.SelectAll.First();
var keyEvent = new KeyEventArgs
{
RoutedEvent = InputElement.KeyDownEvent,
Key = selectAllGesture.Key,
Modifiers = selectAllGesture.Modifiers
};
target.RaiseEvent(keyEvent);
TreeTestHelper.AssertChildrenSelected(target, rootNode);
}
}
private void ApplyTemplates(TreeView tree)
{
tree.ApplyTemplate();
@ -765,7 +894,7 @@ namespace Avalonia.Controls.UnitTests
}
}
private class Node : NotifyingBase
private class Node : NotifyingBase
{
private IAvaloniaList<Node> _children;

Loading…
Cancel
Save