Browse Source

Merge branch 'master' into jmacato/missing-skia-api-lottie

pull/5683/head
Jumar Macato 6 years ago
committed by GitHub
parent
commit
6e43d295d0
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 2
      build/ReactiveUI.props
  2. 12
      src/Avalonia.Build.Tasks/DeterministicIdGenerator.cs
  3. 4
      src/Avalonia.Build.Tasks/XamlCompilerTaskExecutor.cs
  4. 4
      src/Avalonia.Controls/Slider.cs
  5. 18
      src/Avalonia.ReactiveUI/AppBuilderExtensions.cs
  6. 5
      src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/AvaloniaXamlIlCompilerConfiguration.cs
  7. 2
      src/Markup/Avalonia.Markup.Xaml/Templates/DataTemplate.cs
  8. 3
      src/Markup/Avalonia.Markup.Xaml/Templates/ItemsPanelTemplate.cs
  9. 2
      src/Markup/Avalonia.Markup.Xaml/Templates/Template.cs
  10. 8
      src/Markup/Avalonia.Markup.Xaml/Templates/TemplateContent.cs
  11. 8
      src/Markup/Avalonia.Markup.Xaml/Templates/TreeDataTemplate.cs
  12. 25
      tests/Avalonia.Markup.Xaml.UnitTests/Xaml/DataTemplateTests.cs

2
build/ReactiveUI.props

@ -1,5 +1,5 @@
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup> <ItemGroup>
<PackageReference Include="ReactiveUI" Version="12.1.1" /> <PackageReference Include="ReactiveUI" Version="13.2.10" />
</ItemGroup> </ItemGroup>
</Project> </Project>

12
src/Avalonia.Build.Tasks/DeterministicIdGenerator.cs

@ -0,0 +1,12 @@
using System;
using XamlX.Transform;
namespace Avalonia.Build.Tasks
{
public class DeterministicIdGenerator : IXamlIdentifierGenerator
{
private int _nextId = 1;
public string GenerateIdentifierPart() => (_nextId++).ToString();
}
}

4
src/Avalonia.Build.Tasks/XamlCompilerTaskExecutor.cs

@ -22,7 +22,6 @@ using XamlX.IL;
namespace Avalonia.Build.Tasks namespace Avalonia.Build.Tasks
{ {
public static partial class XamlCompilerTaskExecutor public static partial class XamlCompilerTaskExecutor
{ {
static bool CheckXamlName(IResource r) => r.Name.ToLowerInvariant().EndsWith(".xaml") static bool CheckXamlName(IResource r) => r.Name.ToLowerInvariant().EndsWith(".xaml")
@ -99,7 +98,8 @@ namespace Avalonia.Build.Tasks
XamlXmlnsMappings.Resolve(typeSystem, xamlLanguage), XamlXmlnsMappings.Resolve(typeSystem, xamlLanguage),
AvaloniaXamlIlLanguage.CustomValueConverter, AvaloniaXamlIlLanguage.CustomValueConverter,
new XamlIlClrPropertyInfoEmitter(typeSystem.CreateTypeBuilder(clrPropertiesDef)), new XamlIlClrPropertyInfoEmitter(typeSystem.CreateTypeBuilder(clrPropertiesDef)),
new XamlIlPropertyInfoAccessorFactoryEmitter(typeSystem.CreateTypeBuilder(indexerAccessorClosure))); new XamlIlPropertyInfoAccessorFactoryEmitter(typeSystem.CreateTypeBuilder(indexerAccessorClosure)),
new DeterministicIdGenerator());
var contextDef = new TypeDefinition("CompiledAvaloniaXaml", "XamlIlContext", var contextDef = new TypeDefinition("CompiledAvaloniaXaml", "XamlIlContext",

4
src/Avalonia.Controls/Slider.cs

@ -341,7 +341,9 @@ namespace Avalonia.Controls
var pointNum = orient ? x.Position.X : x.Position.Y; var pointNum = orient ? x.Position.X : x.Position.Y;
var logicalPos = MathUtilities.Clamp(pointNum / pointDen, 0.0d, 1.0d); var logicalPos = MathUtilities.Clamp(pointNum / pointDen, 0.0d, 1.0d);
var invert = orient ? 0 : 1; var invert = orient ?
IsDirectionReversed ? 1 : 0 :
IsDirectionReversed ? 0 : 1;
var calcVal = Math.Abs(invert - logicalPos); var calcVal = Math.Abs(invert - logicalPos);
var range = Maximum - Minimum; var range = Maximum - Minimum;
var finalValue = calcVal * range + Minimum; var finalValue = calcVal * range + Minimum;

18
src/Avalonia.ReactiveUI/AppBuilderExtensions.cs

@ -9,18 +9,22 @@ namespace Avalonia.ReactiveUI
{ {
/// <summary> /// <summary>
/// Initializes ReactiveUI framework to use with Avalonia. Registers Avalonia /// Initializes ReactiveUI framework to use with Avalonia. Registers Avalonia
/// scheduler and Avalonia activation for view fetcher. Always remember to /// scheduler, an activation for view fetcher, a template binding hook. Remember
/// call this method if you are using ReactiveUI in your application. /// to call this method if you are using ReactiveUI in your application.
/// </summary> /// </summary>
public static TAppBuilder UseReactiveUI<TAppBuilder>(this TAppBuilder builder) public static TAppBuilder UseReactiveUI<TAppBuilder>(this TAppBuilder builder)
where TAppBuilder : AppBuilderBase<TAppBuilder>, new() where TAppBuilder : AppBuilderBase<TAppBuilder>, new() =>
{ builder.AfterPlatformServicesSetup(_ => Locator.RegisterResolverCallbackChanged(() =>
return builder.AfterPlatformServicesSetup(_ =>
{ {
if (Locator.CurrentMutable is null)
{
return;
}
PlatformRegistrationManager.SetRegistrationNamespaces(RegistrationNamespace.Avalonia);
RxApp.MainThreadScheduler = AvaloniaScheduler.Instance; RxApp.MainThreadScheduler = AvaloniaScheduler.Instance;
Locator.CurrentMutable.RegisterConstant(new AvaloniaActivationForViewFetcher(), typeof(IActivationForViewFetcher)); Locator.CurrentMutable.RegisterConstant(new AvaloniaActivationForViewFetcher(), typeof(IActivationForViewFetcher));
Locator.CurrentMutable.RegisterConstant(new AutoDataTemplateBindingHook(), typeof(IPropertyBindingHook)); Locator.CurrentMutable.RegisterConstant(new AutoDataTemplateBindingHook(), typeof(IPropertyBindingHook));
}); }));
}
} }
} }

5
src/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/AvaloniaXamlIlCompilerConfiguration.cs

@ -14,8 +14,9 @@ namespace Avalonia.Markup.Xaml.XamlIl.CompilerExtensions
XamlXmlnsMappings xmlnsMappings, XamlXmlnsMappings xmlnsMappings,
XamlValueConverter customValueConverter, XamlValueConverter customValueConverter,
XamlIlClrPropertyInfoEmitter clrPropertyEmitter, XamlIlClrPropertyInfoEmitter clrPropertyEmitter,
XamlIlPropertyInfoAccessorFactoryEmitter accessorFactoryEmitter) XamlIlPropertyInfoAccessorFactoryEmitter accessorFactoryEmitter,
: base(typeSystem, defaultAssembly, typeMappings, xmlnsMappings, customValueConverter) IXamlIdentifierGenerator identifierGenerator = null)
: base(typeSystem, defaultAssembly, typeMappings, xmlnsMappings, customValueConverter, identifierGenerator)
{ {
ClrPropertyEmitter = clrPropertyEmitter; ClrPropertyEmitter = clrPropertyEmitter;
AccessorFactoryEmitter = accessorFactoryEmitter; AccessorFactoryEmitter = accessorFactoryEmitter;

2
src/Markup/Avalonia.Markup.Xaml/Templates/DataTemplate.cs

@ -30,7 +30,7 @@ namespace Avalonia.Markup.Xaml.Templates
public IControl Build(object data, IControl existing) public IControl Build(object data, IControl existing)
{ {
return existing ?? TemplateContent.Load(Content).Control; return existing ?? TemplateContent.Load(Content)?.Control;
} }
} }
} }

3
src/Markup/Avalonia.Markup.Xaml/Templates/ItemsPanelTemplate.cs

@ -10,8 +10,7 @@ namespace Avalonia.Markup.Xaml.Templates
[TemplateContent] [TemplateContent]
public object Content { get; set; } public object Content { get; set; }
public IPanel Build() public IPanel Build() => (IPanel)TemplateContent.Load(Content)?.Control;
=> (IPanel)TemplateContent.Load(Content).Control;
object ITemplate.Build() => Build(); object ITemplate.Build() => Build();
} }

2
src/Markup/Avalonia.Markup.Xaml/Templates/Template.cs

@ -10,7 +10,7 @@ namespace Avalonia.Markup.Xaml.Templates
[TemplateContent] [TemplateContent]
public object Content { get; set; } public object Content { get; set; }
public IControl Build() => TemplateContent.Load(Content).Control; public IControl Build() => TemplateContent.Load(Content)?.Control;
object ITemplate.Build() => Build(); object ITemplate.Build() => Build();
} }

8
src/Markup/Avalonia.Markup.Xaml/Templates/TemplateContent.cs

@ -1,6 +1,4 @@
using System; using System;
using Avalonia.Controls;
using System.Collections.Generic;
using Avalonia.Controls.Templates; using Avalonia.Controls.Templates;
namespace Avalonia.Markup.Xaml.Templates namespace Avalonia.Markup.Xaml.Templates
@ -14,6 +12,12 @@ namespace Avalonia.Markup.Xaml.Templates
{ {
return (ControlTemplateResult)direct(null); return (ControlTemplateResult)direct(null);
} }
if (templateContent is null)
{
return null;
}
throw new ArgumentException(nameof(templateContent)); throw new ArgumentException(nameof(templateContent));
} }
} }

8
src/Markup/Avalonia.Markup.Xaml/Templates/TreeDataTemplate.cs

@ -51,8 +51,12 @@ namespace Avalonia.Markup.Xaml.Templates
public IControl Build(object data) public IControl Build(object data)
{ {
var visualTreeForItem = TemplateContent.Load(Content).Control; var visualTreeForItem = TemplateContent.Load(Content)?.Control;
visualTreeForItem.DataContext = data; if (visualTreeForItem != null)
{
visualTreeForItem.DataContext = data;
}
return visualTreeForItem; return visualTreeForItem;
} }
} }

25
tests/Avalonia.Markup.Xaml.UnitTests/Xaml/DataTemplateTests.cs

@ -7,6 +7,31 @@ namespace Avalonia.Markup.Xaml.UnitTests.Xaml
{ {
public class DataTemplateTests : XamlTestBase public class DataTemplateTests : XamlTestBase
{ {
[Fact]
public void DataTemplate_Can_Be_Empty()
{
using (UnitTestApplication.Start(TestServices.StyledWindow))
{
var xaml = @"
<Window xmlns='https://github.com/avaloniaui'
xmlns:sys='clr-namespace:System;assembly=netstandard'
xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml'>
<Window.DataTemplates>
<DataTemplate DataType='{x:Type sys:String}' />
</Window.DataTemplates>
<ContentControl Name='target' Content='Foo'/>
</Window>";
var window = (Window)AvaloniaRuntimeXamlLoader.Load(xaml);
var target = window.FindControl<ContentControl>("target");
window.ApplyTemplate();
target.ApplyTemplate();
((ContentPresenter)target.Presenter).UpdateChild();
Assert.Null(target.Presenter.Child);
}
}
[Fact] [Fact]
public void DataTemplate_Can_Contain_Name() public void DataTemplate_Can_Contain_Name()
{ {

Loading…
Cancel
Save