diff --git a/.editorconfig b/.editorconfig
index 64fe33bbae..b7a03207a4 100644
--- a/.editorconfig
+++ b/.editorconfig
@@ -1,11 +1,159 @@
-; This file is for unifying the coding style for different editors and IDEs.
-; More information at http://EditorConfig.org
+# editorconfig.org
+# top-most EditorConfig file
root = true
+# Default settings:
+# A newline ending every file
+# Use 4 spaces as indentation
[*]
-end_of_line = CRLF
+insert_final_newline = true
+indent_style = space
+indent_size = 4
+# C# files
[*.cs]
-indent_style = space
+# New line preferences
+csharp_new_line_before_open_brace = all
+csharp_new_line_before_else = true
+csharp_new_line_before_catch = true
+csharp_new_line_before_finally = true
+csharp_new_line_before_members_in_object_initializers = true
+csharp_new_line_before_members_in_anonymous_types = true
+csharp_new_line_between_query_expression_clauses = true
+
+# Indentation preferences
+csharp_indent_block_contents = true
+csharp_indent_braces = false
+csharp_indent_case_contents = true
+csharp_indent_switch_labels = true
+csharp_indent_labels = one_less_than_current
+
+# avoid this. unless absolutely necessary
+dotnet_style_qualification_for_field = false:suggestion
+dotnet_style_qualification_for_property = false:suggestion
+dotnet_style_qualification_for_method = false:suggestion
+dotnet_style_qualification_for_event = false:suggestion
+
+# prefer var
+csharp_style_var_for_built_in_types = true
+csharp_style_var_when_type_is_apparent = true
+csharp_style_var_elsewhere = true:suggestion
+
+# use language keywords instead of BCL types
+dotnet_style_predefined_type_for_locals_parameters_members = true:suggestion
+dotnet_style_predefined_type_for_member_access = true:suggestion
+
+# name all constant fields using PascalCase
+dotnet_naming_rule.constant_fields_should_be_pascal_case.severity = suggestion
+dotnet_naming_rule.constant_fields_should_be_pascal_case.symbols = constant_fields
+dotnet_naming_rule.constant_fields_should_be_pascal_case.style = pascal_case_style
+
+dotnet_naming_symbols.constant_fields.applicable_kinds = field
+dotnet_naming_symbols.constant_fields.required_modifiers = const
+
+dotnet_naming_style.pascal_case_style.capitalization = pascal_case
+
+# static fields should have s_ prefix
+dotnet_naming_rule.static_fields_should_have_prefix.severity = suggestion
+dotnet_naming_rule.static_fields_should_have_prefix.symbols = static_fields
+dotnet_naming_rule.static_fields_should_have_prefix.style = static_prefix_style
+
+dotnet_naming_symbols.static_fields.applicable_kinds = field
+dotnet_naming_symbols.static_fields.required_modifiers = static
+
+dotnet_naming_style.static_prefix_style.required_prefix = s_
+dotnet_naming_style.static_prefix_style.capitalization = camel_case
+
+# internal and private fields should be _camelCase
+dotnet_naming_rule.camel_case_for_private_internal_fields.severity = suggestion
+dotnet_naming_rule.camel_case_for_private_internal_fields.symbols = private_internal_fields
+dotnet_naming_rule.camel_case_for_private_internal_fields.style = camel_case_underscore_style
+
+dotnet_naming_symbols.private_internal_fields.applicable_kinds = field
+dotnet_naming_symbols.private_internal_fields.applicable_accessibilities = private, internal
+
+dotnet_naming_style.camel_case_underscore_style.required_prefix = _
+dotnet_naming_style.camel_case_underscore_style.capitalization = camel_case
+
+# use accessibility modifiers
+dotnet_style_require_accessibility_modifiers = for_non_interface_members:suggestion
+
+# Code style defaults
+dotnet_sort_system_directives_first = true
+csharp_preserve_single_line_blocks = true
+csharp_preserve_single_line_statements = false
+
+# Expression-level preferences
+dotnet_style_object_initializer = true:suggestion
+dotnet_style_collection_initializer = true:suggestion
+dotnet_style_explicit_tuple_names = true:suggestion
+dotnet_style_coalesce_expression = true:suggestion
+dotnet_style_null_propagation = true:suggestion
+
+# Expression-bodied members
+csharp_style_expression_bodied_methods = false:none
+csharp_style_expression_bodied_constructors = false:none
+csharp_style_expression_bodied_operators = false:none
+csharp_style_expression_bodied_properties = true:none
+csharp_style_expression_bodied_indexers = true:none
+csharp_style_expression_bodied_accessors = true:none
+
+# Pattern matching
+csharp_style_pattern_matching_over_is_with_cast_check = true:suggestion
+csharp_style_pattern_matching_over_as_with_null_check = true:suggestion
+csharp_style_inlined_variable_declaration = true:suggestion
+
+# Null checking preferences
+csharp_style_throw_expression = true:suggestion
+csharp_style_conditional_delegate_call = true:suggestion
+
+# Space preferences
+csharp_space_after_cast = false
+csharp_space_after_colon_in_inheritance_clause = true
+csharp_space_after_comma = true
+csharp_space_after_dot = false
+csharp_space_after_keywords_in_control_flow_statements = true
+csharp_space_after_semicolon_in_for_statement = true
+csharp_space_around_binary_operators = before_and_after
+csharp_space_around_declaration_statements = do_not_ignore
+csharp_space_before_colon_in_inheritance_clause = true
+csharp_space_before_comma = false
+csharp_space_before_dot = false
+csharp_space_before_open_square_brackets = false
+csharp_space_before_semicolon_in_for_statement = false
+csharp_space_between_empty_square_brackets = false
+csharp_space_between_method_call_empty_parameter_list_parentheses = false
+csharp_space_between_method_call_name_and_opening_parenthesis = false
+csharp_space_between_method_call_parameter_list_parentheses = false
+csharp_space_between_method_declaration_empty_parameter_list_parentheses = false
+csharp_space_between_method_declaration_name_and_open_parenthesis = false
+csharp_space_between_method_declaration_parameter_list_parentheses = false
+csharp_space_between_parentheses = false
+csharp_space_between_square_brackets = false
+
+# Xaml files
+[*.xaml]
indent_size = 4
+
+# Xml project files
+[*.{csproj,vcxproj,vcxproj.filters,proj,nativeproj,locproj}]
+indent_size = 2
+
+# Xml build files
+[*.builds]
+indent_size = 2
+
+# Xml files
+[*.{xml,stylecop,resx,ruleset}]
+indent_size = 2
+
+# Xml config files
+[*.{props,targets,config,nuspec}]
+indent_size = 2
+
+# Shell scripts
+[*.sh]
+end_of_line = lf
+[*.{cmd, bat}]
+end_of_line = crlf
diff --git a/.gitignore b/.gitignore
index a9a8fd36b4..583a2b8a2b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -176,5 +176,9 @@ nuget
Avalonia.XBuild.sln
project.lock.json
.idea/*
-**/obj-Skia/*
-**/obj-Direct2D1/*
+
+
+##################
+## BenchmarkDotNet
+##################
+BenchmarkDotNet.Artifacts/
diff --git a/.ncrunch/Avalonia.Designer.HostApp.NetFX.v3.ncrunchproject b/.ncrunch/Avalonia.Designer.HostApp.NetFX.v3.ncrunchproject
new file mode 100644
index 0000000000..319cd523ce
--- /dev/null
+++ b/.ncrunch/Avalonia.Designer.HostApp.NetFX.v3.ncrunchproject
@@ -0,0 +1,5 @@
+
+
+ True
+
+
\ No newline at end of file
diff --git a/.ncrunch/BindingDemo.net461.v3.ncrunchproject b/.ncrunch/BindingDemo.net461.v3.ncrunchproject
new file mode 100644
index 0000000000..319cd523ce
--- /dev/null
+++ b/.ncrunch/BindingDemo.net461.v3.ncrunchproject
@@ -0,0 +1,5 @@
+
+
+ True
+
+
\ No newline at end of file
diff --git a/.ncrunch/BindingDemo.netcoreapp2.0.v3.ncrunchproject b/.ncrunch/BindingDemo.netcoreapp2.0.v3.ncrunchproject
new file mode 100644
index 0000000000..319cd523ce
--- /dev/null
+++ b/.ncrunch/BindingDemo.netcoreapp2.0.v3.ncrunchproject
@@ -0,0 +1,5 @@
+
+
+ True
+
+
\ No newline at end of file
diff --git a/.ncrunch/Previewer.v3.ncrunchproject b/.ncrunch/Previewer.v3.ncrunchproject
new file mode 100644
index 0000000000..319cd523ce
--- /dev/null
+++ b/.ncrunch/Previewer.v3.ncrunchproject
@@ -0,0 +1,5 @@
+
+
+ True
+
+
\ No newline at end of file
diff --git a/.ncrunch/RemoteDemo.v3.ncrunchproject b/.ncrunch/RemoteDemo.v3.ncrunchproject
new file mode 100644
index 0000000000..319cd523ce
--- /dev/null
+++ b/.ncrunch/RemoteDemo.v3.ncrunchproject
@@ -0,0 +1,5 @@
+
+
+ True
+
+
\ No newline at end of file
diff --git a/.ncrunch/RenderDemo.net461.v3.ncrunchproject b/.ncrunch/RenderDemo.net461.v3.ncrunchproject
new file mode 100644
index 0000000000..319cd523ce
--- /dev/null
+++ b/.ncrunch/RenderDemo.net461.v3.ncrunchproject
@@ -0,0 +1,5 @@
+
+
+ True
+
+
\ No newline at end of file
diff --git a/.ncrunch/RenderDemo.netcoreapp2.0.v3.ncrunchproject b/.ncrunch/RenderDemo.netcoreapp2.0.v3.ncrunchproject
new file mode 100644
index 0000000000..319cd523ce
--- /dev/null
+++ b/.ncrunch/RenderDemo.netcoreapp2.0.v3.ncrunchproject
@@ -0,0 +1,5 @@
+
+
+ True
+
+
\ No newline at end of file
diff --git a/.ncrunch/VirtualizationDemo.net461.v3.ncrunchproject b/.ncrunch/VirtualizationDemo.net461.v3.ncrunchproject
new file mode 100644
index 0000000000..319cd523ce
--- /dev/null
+++ b/.ncrunch/VirtualizationDemo.net461.v3.ncrunchproject
@@ -0,0 +1,5 @@
+
+
+ True
+
+
\ No newline at end of file
diff --git a/.ncrunch/VirtualizationDemo.netcoreapp2.0.v3.ncrunchproject b/.ncrunch/VirtualizationDemo.netcoreapp2.0.v3.ncrunchproject
new file mode 100644
index 0000000000..319cd523ce
--- /dev/null
+++ b/.ncrunch/VirtualizationDemo.netcoreapp2.0.v3.ncrunchproject
@@ -0,0 +1,5 @@
+
+
+ True
+
+
\ No newline at end of file
diff --git a/Avalonia.sln b/Avalonia.sln
index 54ffa00d92..e43bfe242e 100644
--- a/Avalonia.sln
+++ b/Avalonia.sln
@@ -58,6 +58,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Samples", "Samples", "{9B9E
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Shared", "Shared", "{A689DEF5-D50F-4975-8B72-124C9EB54066}"
ProjectSection(SolutionItems) = preProject
+ .editorconfig = .editorconfig
src\Shared\SharedAssemblyInfo.cs = src\Shared\SharedAssemblyInfo.cs
EndProjectSection
EndProject
@@ -71,7 +72,7 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Avalonia.Markup", "src\Mark
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Avalonia.Markup.UnitTests", "tests\Avalonia.Markup.UnitTests\Avalonia.Markup.UnitTests.csproj", "{8EF392D5-1416-45AA-9956-7CBBC3229E8A}"
EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BindingTest", "samples\BindingTest\BindingTest.csproj", "{08B3E6B9-1CD5-443C-9F61-6D49D1C5F162}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BindingDemo", "samples\BindingDemo\BindingDemo.csproj", "{08B3E6B9-1CD5-443C-9F61-6D49D1C5F162}"
EndProject
Project("{D954291E-2A0B-460D-934E-DC6B0785DB48}") = "RenderHelpers", "src\Shared\RenderHelpers\RenderHelpers.shproj", "{3C4C0CB4-0C0F-4450-A37B-148C84FF905F}"
EndProject
@@ -109,7 +110,7 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Avalonia.DesignerSupport.Te
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Avalonia.DesignerSupport.TestApp", "tests\Avalonia.DesignerSupport.TestApp\Avalonia.DesignerSupport.TestApp.csproj", "{F1381F98-4D24-409A-A6C5-1C5B1E08BB08}"
EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "VirtualizationTest", "samples\VirtualizationTest\VirtualizationTest.csproj", "{FBCAF3D0-2808-4934-8E96-3F607594517B}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "VirtualizationDemo", "samples\VirtualizationDemo\VirtualizationDemo.csproj", "{FBCAF3D0-2808-4934-8E96-3F607594517B}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Interop", "Interop", "{A0CC0258-D18C-4AB3-854F-7101680FC3F9}"
EndProject
@@ -117,7 +118,7 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WindowsInteropTest", "sampl
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Avalonia.DotNetFrameworkRuntime", "src\Avalonia.DotNetFrameworkRuntime\Avalonia.DotNetFrameworkRuntime.csproj", "{4A1ABB09-9047-4BD5-A4AD-A055E52C5EE0}"
EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "RenderTest", "samples\RenderTest\RenderTest.csproj", "{F1FDC5B0-4654-416F-AE69-E3E9BBD87801}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "RenderDemo", "samples\RenderDemo\RenderDemo.csproj", "{F1FDC5B0-4654-416F-AE69-E3E9BBD87801}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ControlCatalog.Android", "samples\ControlCatalog.Android\ControlCatalog.Android.csproj", "{29132311-1848-4FD6-AE0C-4FF841151BD3}"
EndProject
@@ -170,7 +171,7 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Avalonia.Skia.RenderTests",
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Avalonia.Remote.Protocol", "src\Avalonia.Remote.Protocol\Avalonia.Remote.Protocol.csproj", "{D78A720C-C0C6-478B-8564-F167F9BDD01B}"
EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "RemoteTest", "samples\RemoteTest\RemoteTest.csproj", "{E2999E4A-9086-401F-898C-AEB0AD38E676}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "RemoteDemo", "samples\RemoteDemo\RemoteDemo.csproj", "{E2999E4A-9086-401F-898C-AEB0AD38E676}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Tools", "Tools", "{4ED8B739-6F4E-4CD4-B993-545E6B5CE637}"
EndProject
@@ -184,6 +185,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Avalonia.MonoMac", "src\OSX
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Avalonia.Designer.HostApp.NetFX", "src\tools\Avalonia.Designer.HostApp.NetFX\Avalonia.Designer.HostApp.NetFX.csproj", "{4ADA61C8-D191-428D-9066-EF4F0D86520F}"
EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Avalonia.Skia.UnitTests", "tests\Avalonia.Skia.UnitTests\Avalonia.Skia.UnitTests.csproj", "{E1240B49-7B4B-4371-A00E-068778C5CF0B}"
+EndProject
Global
GlobalSection(SharedMSBuildProjectFiles) = preSolution
src\Shared\RenderHelpers\RenderHelpers.projitems*{3c4c0cb4-0c0f-4450-a37b-148c84ff905f}*SharedItemsImports = 13
@@ -396,6 +399,7 @@ Global
{3E908F67-5543-4879-A1DC-08EACE79B3CD}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
{3E908F67-5543-4879-A1DC-08EACE79B3CD}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
{3E908F67-5543-4879-A1DC-08EACE79B3CD}.Debug|NetCoreOnly.ActiveCfg = Debug|Any CPU
+ {3E908F67-5543-4879-A1DC-08EACE79B3CD}.Debug|NetCoreOnly.Build.0 = Debug|Any CPU
{3E908F67-5543-4879-A1DC-08EACE79B3CD}.Debug|x86.ActiveCfg = Debug|Any CPU
{3E908F67-5543-4879-A1DC-08EACE79B3CD}.Debug|x86.Build.0 = Debug|Any CPU
{3E908F67-5543-4879-A1DC-08EACE79B3CD}.Release|Any CPU.ActiveCfg = Release|Any CPU
@@ -405,6 +409,7 @@ Global
{3E908F67-5543-4879-A1DC-08EACE79B3CD}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
{3E908F67-5543-4879-A1DC-08EACE79B3CD}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
{3E908F67-5543-4879-A1DC-08EACE79B3CD}.Release|NetCoreOnly.ActiveCfg = Release|Any CPU
+ {3E908F67-5543-4879-A1DC-08EACE79B3CD}.Release|NetCoreOnly.Build.0 = Release|Any CPU
{3E908F67-5543-4879-A1DC-08EACE79B3CD}.Release|x86.ActiveCfg = Release|Any CPU
{3E908F67-5543-4879-A1DC-08EACE79B3CD}.Release|x86.Build.0 = Release|Any CPU
{62024B2D-53EB-4638-B26B-85EEAA54866E}.Ad-Hoc|Any CPU.ActiveCfg = Release|Any CPU
@@ -2469,6 +2474,46 @@ Global
{4ADA61C8-D191-428D-9066-EF4F0D86520F}.Release|NetCoreOnly.ActiveCfg = Release|Any CPU
{4ADA61C8-D191-428D-9066-EF4F0D86520F}.Release|x86.ActiveCfg = Release|Any CPU
{4ADA61C8-D191-428D-9066-EF4F0D86520F}.Release|x86.Build.0 = Release|Any CPU
+ {E1240B49-7B4B-4371-A00E-068778C5CF0B}.Ad-Hoc|Any CPU.ActiveCfg = Debug|Any CPU
+ {E1240B49-7B4B-4371-A00E-068778C5CF0B}.Ad-Hoc|Any CPU.Build.0 = Debug|Any CPU
+ {E1240B49-7B4B-4371-A00E-068778C5CF0B}.Ad-Hoc|iPhone.ActiveCfg = Debug|Any CPU
+ {E1240B49-7B4B-4371-A00E-068778C5CF0B}.Ad-Hoc|iPhone.Build.0 = Debug|Any CPU
+ {E1240B49-7B4B-4371-A00E-068778C5CF0B}.Ad-Hoc|iPhoneSimulator.ActiveCfg = Debug|Any CPU
+ {E1240B49-7B4B-4371-A00E-068778C5CF0B}.Ad-Hoc|iPhoneSimulator.Build.0 = Debug|Any CPU
+ {E1240B49-7B4B-4371-A00E-068778C5CF0B}.Ad-Hoc|NetCoreOnly.ActiveCfg = Debug|Any CPU
+ {E1240B49-7B4B-4371-A00E-068778C5CF0B}.Ad-Hoc|NetCoreOnly.Build.0 = Debug|Any CPU
+ {E1240B49-7B4B-4371-A00E-068778C5CF0B}.Ad-Hoc|x86.ActiveCfg = Debug|Any CPU
+ {E1240B49-7B4B-4371-A00E-068778C5CF0B}.Ad-Hoc|x86.Build.0 = Debug|Any CPU
+ {E1240B49-7B4B-4371-A00E-068778C5CF0B}.AppStore|Any CPU.ActiveCfg = Debug|Any CPU
+ {E1240B49-7B4B-4371-A00E-068778C5CF0B}.AppStore|Any CPU.Build.0 = Debug|Any CPU
+ {E1240B49-7B4B-4371-A00E-068778C5CF0B}.AppStore|iPhone.ActiveCfg = Debug|Any CPU
+ {E1240B49-7B4B-4371-A00E-068778C5CF0B}.AppStore|iPhone.Build.0 = Debug|Any CPU
+ {E1240B49-7B4B-4371-A00E-068778C5CF0B}.AppStore|iPhoneSimulator.ActiveCfg = Debug|Any CPU
+ {E1240B49-7B4B-4371-A00E-068778C5CF0B}.AppStore|iPhoneSimulator.Build.0 = Debug|Any CPU
+ {E1240B49-7B4B-4371-A00E-068778C5CF0B}.AppStore|NetCoreOnly.ActiveCfg = Debug|Any CPU
+ {E1240B49-7B4B-4371-A00E-068778C5CF0B}.AppStore|NetCoreOnly.Build.0 = Debug|Any CPU
+ {E1240B49-7B4B-4371-A00E-068778C5CF0B}.AppStore|x86.ActiveCfg = Debug|Any CPU
+ {E1240B49-7B4B-4371-A00E-068778C5CF0B}.AppStore|x86.Build.0 = Debug|Any CPU
+ {E1240B49-7B4B-4371-A00E-068778C5CF0B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {E1240B49-7B4B-4371-A00E-068778C5CF0B}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {E1240B49-7B4B-4371-A00E-068778C5CF0B}.Debug|iPhone.ActiveCfg = Debug|Any CPU
+ {E1240B49-7B4B-4371-A00E-068778C5CF0B}.Debug|iPhone.Build.0 = Debug|Any CPU
+ {E1240B49-7B4B-4371-A00E-068778C5CF0B}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
+ {E1240B49-7B4B-4371-A00E-068778C5CF0B}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
+ {E1240B49-7B4B-4371-A00E-068778C5CF0B}.Debug|NetCoreOnly.ActiveCfg = Debug|Any CPU
+ {E1240B49-7B4B-4371-A00E-068778C5CF0B}.Debug|NetCoreOnly.Build.0 = Debug|Any CPU
+ {E1240B49-7B4B-4371-A00E-068778C5CF0B}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {E1240B49-7B4B-4371-A00E-068778C5CF0B}.Debug|x86.Build.0 = Debug|Any CPU
+ {E1240B49-7B4B-4371-A00E-068778C5CF0B}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {E1240B49-7B4B-4371-A00E-068778C5CF0B}.Release|Any CPU.Build.0 = Release|Any CPU
+ {E1240B49-7B4B-4371-A00E-068778C5CF0B}.Release|iPhone.ActiveCfg = Release|Any CPU
+ {E1240B49-7B4B-4371-A00E-068778C5CF0B}.Release|iPhone.Build.0 = Release|Any CPU
+ {E1240B49-7B4B-4371-A00E-068778C5CF0B}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
+ {E1240B49-7B4B-4371-A00E-068778C5CF0B}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
+ {E1240B49-7B4B-4371-A00E-068778C5CF0B}.Release|NetCoreOnly.ActiveCfg = Release|Any CPU
+ {E1240B49-7B4B-4371-A00E-068778C5CF0B}.Release|NetCoreOnly.Build.0 = Release|Any CPU
+ {E1240B49-7B4B-4371-A00E-068778C5CF0B}.Release|x86.ActiveCfg = Release|Any CPU
+ {E1240B49-7B4B-4371-A00E-068778C5CF0B}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -2521,6 +2566,7 @@ Global
{F40FC0A2-1BC3-401C-BFC1-928EC4D4A9CE} = {9B9E3891-2366-4253-A952-D08BCEB71098}
{CBFD5788-567D-401B-9DFA-74E4224025A0} = {A59C4C0A-64DF-4621-B450-2BA00D6F61E2}
{4ADA61C8-D191-428D-9066-EF4F0D86520F} = {4ED8B739-6F4E-4CD4-B993-545E6B5CE637}
+ {E1240B49-7B4B-4371-A00E-068778C5CF0B} = {C5A00AC3-B34C-4564-9BDD-2DA473EF4D8B}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {87366D66-1391-4D90-8999-95A620AD786A}
diff --git a/build.cake b/build.cake
index 1c796e8594..78c166a3bc 100644
--- a/build.cake
+++ b/build.cake
@@ -6,11 +6,13 @@
#addin "nuget:?package=NuGet.Core&version=2.14.0"
#tool "nuget:?package=NuGet.CommandLine&version=4.3.0"
#tool "nuget:?package=JetBrains.ReSharper.CommandLineTools&version=2017.1.20170613.162720"
+
///////////////////////////////////////////////////////////////////////////////
// TOOLS
///////////////////////////////////////////////////////////////////////////////
-#tool "nuget:?package=xunit.runner.console&version=2.3.0-beta5-build3769"
+#tool "nuget:?package=xunit.runner.console&version=2.3.1"
+#tool "nuget:?package=JetBrains.dotMemoryUnit&version=3.0.20171219.105559"
///////////////////////////////////////////////////////////////////////////////
// USINGS
@@ -34,20 +36,31 @@ using NuGet;
// PARAMETERS
//////////////////////////////////////////////////////////////////////
-Parameters parameters = new Parameters(Context);
-Packages packages = new Packages(Context, parameters);
+class AvaloniaBuildData
+{
+ public AvaloniaBuildData(Parameters parameters, Packages packages)
+ {
+ Parameters = parameters;
+ Packages = packages;
+ }
+
+ public Parameters Parameters { get; }
+ public Packages Packages { get; }
+}
///////////////////////////////////////////////////////////////////////////////
// SETUP
///////////////////////////////////////////////////////////////////////////////
-Setup(context =>
+Setup(context =>
{
- Information("Building version {0} of Avalonia ({1}, {2}, {3}) using version {4} of Cake.",
+ var parameters = new Parameters(context);
+ var buildContext = new AvaloniaBuildData(parameters, new Packages(context, parameters));
+
+ Information("Building version {0} of Avalonia ({1}, {2}) using version {3} of Cake.",
parameters.Version,
parameters.Platform,
parameters.Configuration,
- parameters.Target,
typeof(ICakeContext).Assembly.GetName().Version.ToString());
if (parameters.IsRunningOnAppVeyor)
@@ -55,8 +68,7 @@ Setup(context =>
Information("Repository Name: " + BuildSystem.AppVeyor.Environment.Repository.Name);
Information("Repository Branch: " + BuildSystem.AppVeyor.Environment.Repository.Branch);
}
-
- Information("Target: " + parameters.Target);
+ Information("Target:" + context.TargetTask.Name);
Information("Platform: " + parameters.Platform);
Information("Configuration: " + parameters.Configuration);
Information("IsLocalBuild: " + parameters.IsLocalBuild);
@@ -70,13 +82,15 @@ Setup(context =>
Information("IsReleasable: " + parameters.IsReleasable);
Information("IsMyGetRelease: " + parameters.IsMyGetRelease);
Information("IsNuGetRelease: " + parameters.IsNuGetRelease);
+
+ return buildContext;
});
///////////////////////////////////////////////////////////////////////////////
// TEARDOWN
///////////////////////////////////////////////////////////////////////////////
-Teardown(context =>
+Teardown((context, buildContext) =>
{
Information("Finished running tasks.");
});
@@ -85,20 +99,20 @@ Teardown(context =>
// TASKS
///////////////////////////////////////////////////////////////////////////////
-Task("Clean")
- .Does(() =>
+Task("Clean-Impl")
+ .Does(data =>
{
- CleanDirectories(parameters.BuildDirs);
- CleanDirectory(parameters.ArtifactsDir);
- CleanDirectory(parameters.NugetRoot);
- CleanDirectory(parameters.ZipRoot);
- CleanDirectory(parameters.BinRoot);
+ CleanDirectories(data.Parameters.BuildDirs);
+ CleanDirectory(data.Parameters.ArtifactsDir);
+ CleanDirectory(data.Parameters.NugetRoot);
+ CleanDirectory(data.Parameters.ZipRoot);
+ CleanDirectory(data.Parameters.BinRoot);
});
-Task("Restore-NuGet-Packages")
- .IsDependentOn("Clean")
- .WithCriteria(parameters.IsRunningOnWindows)
- .Does(() =>
+Task("Restore-NuGet-Packages-Impl")
+ .WithCriteria((context, data) => data.Parameters.IsRunningOnWindows)
+ .WithCriteria((context, data) => !data.Parameters.IsPlatformNetCoreOnly)
+ .Does(data =>
{
var maxRetryCount = 5;
var toolTimeout = 2d;
@@ -115,13 +129,13 @@ Task("Restore-NuGet-Packages")
toolTimeout+=0.5;
}})
.Execute(()=> {
- NuGetRestore(parameters.MSBuildSolution, new NuGetRestoreSettings {
+ NuGetRestore(data.Parameters.MSBuildSolution, new NuGetRestoreSettings {
ToolTimeout = TimeSpan.FromMinutes(toolTimeout)
});
});
});
-void DotNetCoreBuild()
+void DotNetCoreBuild(Parameters parameters)
{
var settings = new DotNetCoreBuildSettings
{
@@ -135,29 +149,28 @@ void DotNetCoreBuild()
DotNetCoreBuild(parameters.MSBuildSolution, settings);
}
-Task("Build")
- .IsDependentOn("Restore-NuGet-Packages")
- .Does(() =>
+Task("Build-Impl")
+ .Does(data =>
{
- if(parameters.IsRunningOnWindows)
+ if(data.Parameters.IsRunningOnWindows && !data.Parameters.IsPlatformNetCoreOnly)
{
- MSBuild(parameters.MSBuildSolution, settings => {
- settings.SetConfiguration(parameters.Configuration);
+ MSBuild(data.Parameters.MSBuildSolution, settings => {
+ settings.SetConfiguration(data.Parameters.Configuration);
settings.SetVerbosity(Verbosity.Minimal);
- settings.WithProperty("Platform", "\"" + parameters.Platform + "\"");
+ settings.WithProperty("Platform", "\"" + data.Parameters.Platform + "\"");
settings.WithProperty("UseRoslynPathHack", "true");
settings.UseToolVersion(MSBuildToolVersion.VS2017);
settings.WithProperty("Windows", "True");
settings.SetNodeReuse(false);
+ settings.SetMaxCpuCount(0);
});
}
else
{
- DotNetCoreBuild();
+ DotNetCoreBuild(data.Parameters);
}
});
-
void RunCoreTest(string project, Parameters parameters, bool coreOnly = false)
{
if(!project.EndsWith(".csproj"))
@@ -180,83 +193,106 @@ void RunCoreTest(string project, Parameters parameters, bool coreOnly = false)
}
}
-Task("Run-Unit-Tests")
- .IsDependentOn("Build")
- .IsDependentOn("Run-Designer-Tests")
- .IsDependentOn("Run-Render-Tests")
- .WithCriteria(() => !parameters.SkipTests)
- .Does(() => {
- RunCoreTest("./tests/Avalonia.Base.UnitTests", parameters, false);
- RunCoreTest("./tests/Avalonia.Controls.UnitTests", parameters, false);
- RunCoreTest("./tests/Avalonia.Input.UnitTests", parameters, false);
- RunCoreTest("./tests/Avalonia.Interactivity.UnitTests", parameters, false);
- RunCoreTest("./tests/Avalonia.Layout.UnitTests", parameters, false);
- RunCoreTest("./tests/Avalonia.Markup.UnitTests", parameters, false);
- RunCoreTest("./tests/Avalonia.Markup.Xaml.UnitTests", parameters, false);
- RunCoreTest("./tests/Avalonia.Styling.UnitTests", parameters, false);
- RunCoreTest("./tests/Avalonia.Visuals.UnitTests", parameters, false);
- if (parameters.IsRunningOnWindows)
- {
- RunCoreTest("./tests/Avalonia.Direct2D1.UnitTests", parameters, true);
- }
- });
+Task("Run-Unit-Tests-Impl")
+ .WithCriteria((context, data) => !data.Parameters.SkipTests)
+ .Does(data =>
+{
+ RunCoreTest("./tests/Avalonia.Base.UnitTests", data.Parameters, false);
+ RunCoreTest("./tests/Avalonia.Controls.UnitTests", data.Parameters, false);
+ RunCoreTest("./tests/Avalonia.Input.UnitTests", data.Parameters, false);
+ RunCoreTest("./tests/Avalonia.Interactivity.UnitTests", data.Parameters, false);
+ RunCoreTest("./tests/Avalonia.Layout.UnitTests", data.Parameters, false);
+ RunCoreTest("./tests/Avalonia.Markup.UnitTests", data.Parameters, false);
+ RunCoreTest("./tests/Avalonia.Markup.Xaml.UnitTests", data.Parameters, false);
+ RunCoreTest("./tests/Avalonia.Styling.UnitTests", data.Parameters, false);
+ RunCoreTest("./tests/Avalonia.Visuals.UnitTests", data.Parameters, false);
+ RunCoreTest("./tests/Avalonia.Skia.UnitTests", data.Parameters, false);
+ if (data.Parameters.IsRunningOnWindows && !data.Parameters.IsPlatformNetCoreOnly)
+ {
+ RunCoreTest("./tests/Avalonia.Direct2D1.UnitTests", data.Parameters, true);
+ }
+});
-Task("Run-Designer-Tests")
- .IsDependentOn("Build")
- .WithCriteria(() => !parameters.SkipTests)
- .Does(() => {
- RunCoreTest("./tests/Avalonia.DesignerSupport.Tests", parameters, false);
- });
+Task("Run-Designer-Tests-Impl")
+ .WithCriteria((context, data) => !data.Parameters.SkipTests)
+ .Does(data =>
+{
+ RunCoreTest("./tests/Avalonia.DesignerSupport.Tests", data.Parameters, false);
+});
-Task("Run-Render-Tests")
- .IsDependentOn("Build")
- .WithCriteria(() => !parameters.SkipTests && parameters.IsRunningOnWindows)
- .Does(() => {
- RunCoreTest("./tests/Avalonia.Skia.RenderTests/Avalonia.Skia.RenderTests.csproj", parameters, true);
- RunCoreTest("./tests/Avalonia.Direct2D1.RenderTests/Avalonia.Direct2D1.RenderTests.csproj", parameters, true);
- });
+Task("Run-Render-Tests-Impl")
+ .WithCriteria((context, data) => !data.Parameters.SkipTests)
+ .WithCriteria((context, data) => data.Parameters.IsRunningOnWindows)
+ .WithCriteria((context, data) => !data.Parameters.IsPlatformNetCoreOnly)
+ .Does(data =>
+{
+ RunCoreTest("./tests/Avalonia.Skia.RenderTests/Avalonia.Skia.RenderTests.csproj", data.Parameters, true);
+ RunCoreTest("./tests/Avalonia.Direct2D1.RenderTests/Avalonia.Direct2D1.RenderTests.csproj", data.Parameters, true);
+});
-Task("Copy-Files")
- .IsDependentOn("Run-Unit-Tests")
+Task("Run-Leak-Tests-Impl")
+ .WithCriteria((context, data) => !data.Parameters.SkipTests)
+ .WithCriteria((context, data) => data.Parameters.IsRunningOnWindows)
+ .WithCriteria((context, data) => !data.Parameters.IsPlatformNetCoreOnly)
.Does(() =>
{
- CopyFiles(packages.BinFiles, parameters.BinRoot);
+ var dotMemoryUnit = Context.Tools.Resolve("dotMemoryUnit.exe");
+ var leakTestsExitCode = StartProcess(dotMemoryUnit, new ProcessSettings
+ {
+ Arguments = new ProcessArgumentBuilder()
+ .Append(Context.Tools.Resolve("xunit.console.x86.exe").FullPath)
+ .Append("--propagate-exit-code")
+ .Append("--")
+ .Append("tests\\Avalonia.LeakTests\\bin\\Release\\net461\\Avalonia.LeakTests.dll"),
+ Timeout = 120000
+ });
+
+ if (leakTestsExitCode != 0)
+ {
+ throw new Exception("Leak Tests failed");
+ }
});
-Task("Zip-Files")
- .IsDependentOn("Copy-Files")
- .Does(() =>
+Task("Copy-Files-Impl")
+ .Does(data =>
{
- Zip(parameters.BinRoot, parameters.ZipCoreArtifacts);
-
- Zip(parameters.ZipSourceControlCatalogDesktopDirs,
- parameters.ZipTargetControlCatalogDesktopDirs,
- GetFiles(parameters.ZipSourceControlCatalogDesktopDirs.FullPath + "/*.dll") +
- GetFiles(parameters.ZipSourceControlCatalogDesktopDirs.FullPath + "/*.config") +
- GetFiles(parameters.ZipSourceControlCatalogDesktopDirs.FullPath + "/*.so") +
- GetFiles(parameters.ZipSourceControlCatalogDesktopDirs.FullPath + "/*.dylib") +
- GetFiles(parameters.ZipSourceControlCatalogDesktopDirs.FullPath + "/*.exe"));
+ CopyFiles(data.Packages.BinFiles, data.Parameters.BinRoot);
});
-Task("Create-NuGet-Packages")
- .IsDependentOn("Run-Unit-Tests")
- .IsDependentOn("Inspect")
- .Does(() =>
+Task("Zip-Files-Impl")
+ .Does(data =>
+{
+ Zip(data.Parameters.BinRoot, data.Parameters.ZipCoreArtifacts);
+
+ Zip(data.Parameters.NugetRoot, data.Parameters.ZipNuGetArtifacts);
+
+ if (!data.Parameters.IsPlatformNetCoreOnly) {
+ Zip(data.Parameters.ZipSourceControlCatalogDesktopDirs,
+ data.Parameters.ZipTargetControlCatalogDesktopDirs,
+ GetFiles(data.Parameters.ZipSourceControlCatalogDesktopDirs.FullPath + "/*.dll") +
+ GetFiles(data.Parameters.ZipSourceControlCatalogDesktopDirs.FullPath + "/*.config") +
+ GetFiles(data.Parameters.ZipSourceControlCatalogDesktopDirs.FullPath + "/*.so") +
+ GetFiles(data.Parameters.ZipSourceControlCatalogDesktopDirs.FullPath + "/*.dylib") +
+ GetFiles(data.Parameters.ZipSourceControlCatalogDesktopDirs.FullPath + "/*.exe"));
+ }
+});
+
+Task("Create-NuGet-Packages-Impl")
+ .Does(data =>
{
- foreach(var nuspec in packages.NuspecNuGetSettings)
+ foreach(var nuspec in data.Packages.NuspecNuGetSettings)
{
NuGetPack(nuspec);
}
});
-Task("Publish-MyGet")
- .IsDependentOn("Create-NuGet-Packages")
- .WithCriteria(() => !parameters.IsLocalBuild)
- .WithCriteria(() => !parameters.IsPullRequest)
- .WithCriteria(() => parameters.IsMainRepo)
- .WithCriteria(() => parameters.IsMasterBranch)
- .WithCriteria(() => parameters.IsMyGetRelease)
- .Does(() =>
+Task("Publish-MyGet-Impl")
+ .WithCriteria((context, data) => !data.Parameters.IsLocalBuild)
+ .WithCriteria((context, data) => !data.Parameters.IsPullRequest)
+ .WithCriteria((context, data) => data.Parameters.IsMainRepo)
+ .WithCriteria((context, data) => data.Parameters.IsMasterBranch)
+ .WithCriteria((context, data) => data.Parameters.IsMyGetRelease)
+ .Does(data =>
{
var apiKey = EnvironmentVariable("MYGET_API_KEY");
if(string.IsNullOrEmpty(apiKey))
@@ -270,7 +306,7 @@ Task("Publish-MyGet")
throw new InvalidOperationException("Could not resolve MyGet API url.");
}
- foreach(var nupkg in packages.NugetPackages)
+ foreach(var nupkg in data.Packages.NugetPackages)
{
NuGetPush(nupkg, new NuGetPushSettings {
Source = apiUrl,
@@ -283,13 +319,12 @@ Task("Publish-MyGet")
Information("Publish-MyGet Task failed, but continuing with next Task...");
});
-Task("Publish-NuGet")
- .IsDependentOn("Create-NuGet-Packages")
- .WithCriteria(() => !parameters.IsLocalBuild)
- .WithCriteria(() => !parameters.IsPullRequest)
- .WithCriteria(() => parameters.IsMainRepo)
- .WithCriteria(() => parameters.IsNuGetRelease)
- .Does(() =>
+Task("Publish-NuGet-Impl")
+ .WithCriteria((context, data) => !data.Parameters.IsLocalBuild)
+ .WithCriteria((context, data) => !data.Parameters.IsPullRequest)
+ .WithCriteria((context, data) => data.Parameters.IsMainRepo)
+ .WithCriteria((context, data) => data.Parameters.IsNuGetRelease)
+ .Does(data =>
{
var apiKey = EnvironmentVariable("NUGET_API_KEY");
if(string.IsNullOrEmpty(apiKey))
@@ -303,7 +338,7 @@ Task("Publish-NuGet")
throw new InvalidOperationException("Could not resolve NuGet API url.");
}
- foreach(var nupkg in packages.NugetPackages)
+ foreach(var nupkg in data.Packages.NugetPackages)
{
NuGetPush(nupkg, new NuGetPushSettings {
ApiKey = apiKey,
@@ -316,102 +351,80 @@ Task("Publish-NuGet")
Information("Publish-NuGet Task failed, but continuing with next Task...");
});
-Task("Run-Leak-Tests")
- .WithCriteria(parameters.IsRunningOnWindows)
- .IsDependentOn("Build")
+Task("Inspect-Impl")
+ .WithCriteria((context, data) => data.Parameters.IsRunningOnWindows)
+ .WithCriteria((context, data) => !data.Parameters.IsPlatformNetCoreOnly)
.Does(() =>
- {
- DotNetCoreRestore("tests\\Avalonia.LeakTests\\toolproject\\tool.csproj");
- DotNetBuild("tests\\Avalonia.LeakTests\\toolproject\\tool.csproj", settings => settings.SetConfiguration("Release"));
- var report = "tests\\Avalonia.LeakTests\\bin\\Release\\report.xml";
- if(System.IO.File.Exists(report))
- System.IO.File.Delete(report);
-
- var toolXunitConsoleX86 = Context.Tools.Resolve("xunit.console.x86.exe").FullPath;
- var proc = System.Diagnostics.Process.Start(new System.Diagnostics.ProcessStartInfo
+{
+ var badIssues = new []{"PossibleNullReferenceException"};
+ var whitelist = new []{"tests", "src\\android", "src\\ios",
+ "src\\markup\\avalonia.markup.xaml\\portablexaml\\portable.xaml.github"};
+ Information("Running code inspections");
+
+ var exitCode = StartProcess(Context.Tools.Resolve("inspectcode.exe"),
+ new ProcessSettings
{
- FileName="tests\\Avalonia.LeakTests\\toolproject\\bin\\dotMemoryUnit.exe",
- Arguments="-targetExecutable=\"" + toolXunitConsoleX86 + "\" -returnTargetExitCode -- tests\\Avalonia.LeakTests\\bin\\Release\\Avalonia.LeakTests.dll -xml tests\\Avalonia.LeakTests\\bin\\Release\\report.xml ",
- UseShellExecute = false,
+ Arguments = "--output=artifacts\\inspectcode.xml --profile=Avalonia.sln.DotSettings Avalonia.sln",
+ RedirectStandardOutput = true
});
- var st = System.Diagnostics.Stopwatch.StartNew();
- while(!proc.HasExited && !System.IO.File.Exists(report))
- {
- if(st.Elapsed.TotalSeconds>60)
- {
- Error("Timed out, probably a bug in dotMemoryUnit");
- proc.Kill();
- throw new Exception("dotMemory issue");
- }
- proc.WaitForExit(100);
- }
- try{
- proc.Kill();
- }catch{}
- var doc = System.Xml.Linq.XDocument.Load(report);
- if(doc.Root.Descendants("assembly").Any(x=>x.Attribute("failed").Value.ToString() != "0"))
- {
- throw new Exception("Tests failed");
- }
-
- });
-Task("Inspect")
- .WithCriteria(parameters.IsRunningOnWindows)
- .IsDependentOn("Restore-NuGet-Packages")
- .Does(() =>
+ Information("Analyzing report");
+ var doc = XDocument.Parse(System.IO.File.ReadAllText("artifacts\\inspectcode.xml"));
+ var failBuild = false;
+ foreach(var xml in doc.Descendants("Issue"))
{
- var badIssues = new []{"PossibleNullReferenceException"};
- var whitelist = new []{"tests", "src\\android", "src\\ios",
- "src\\markup\\avalonia.markup.xaml\\portablexaml\\portable.xaml.github"};
- Information("Running code inspections");
-
- StartProcess(Context.Tools.Resolve("inspectcode.exe"),
- new ProcessSettings{ Arguments = "--output=artifacts\\inspectcode.xml --profile=Avalonia.sln.DotSettings Avalonia.sln" });
- Information("Analyzing report");
- var doc = XDocument.Parse(System.IO.File.ReadAllText("artifacts\\inspectcode.xml"));
- var failBuild = false;
- foreach(var xml in doc.Descendants("Issue"))
+ var typeId = xml.Attribute("TypeId").Value.ToString();
+ if(badIssues.Contains(typeId))
{
- var typeId = xml.Attribute("TypeId").Value.ToString();
- if(badIssues.Contains(typeId))
- {
- var file = xml.Attribute("File").Value.ToString().ToLower();
- if(whitelist.Any(wh => file.StartsWith(wh)))
- continue;
- var line = xml.Attribute("Line").Value.ToString();
- Error(typeId + " - " + file + " on line " + line);
- failBuild = true;
- }
+ var file = xml.Attribute("File").Value.ToString().ToLower();
+ if(whitelist.Any(wh => file.StartsWith(wh)))
+ continue;
+ var line = xml.Attribute("Line").Value.ToString();
+ Error(typeId + " - " + file + " on line " + line);
+ failBuild = true;
}
- if(failBuild)
- throw new Exception("Issues found");
- });
+ }
+ if(failBuild)
+ throw new Exception("Issues found");
+});
///////////////////////////////////////////////////////////////////////////////
// TARGETS
///////////////////////////////////////////////////////////////////////////////
+Task("Run-Tests")
+ .IsDependentOn("Clean-Impl")
+ .IsDependentOn("Restore-NuGet-Packages-Impl")
+ .IsDependentOn("Build-Impl")
+ .IsDependentOn("Run-Unit-Tests-Impl")
+ .IsDependentOn("Run-Render-Tests-Impl")
+ .IsDependentOn("Run-Designer-Tests-Impl")
+ .IsDependentOn("Run-Leak-Tests-Impl");
+
Task("Package")
- .IsDependentOn("Create-NuGet-Packages");
+ .IsDependentOn("Run-Tests")
+ .IsDependentOn("Inspect-Impl")
+ .IsDependentOn("Create-NuGet-Packages-Impl");
-Task("Default").Does(() =>
-{
- if(parameters.IsRunningOnWindows)
- RunTarget("Package");
- else
- RunTarget("Run-Unit-Tests");
-});
Task("AppVeyor")
- .IsDependentOn("Zip-Files")
- .IsDependentOn("Publish-MyGet")
- .IsDependentOn("Publish-NuGet");
+ .IsDependentOn("Package")
+ .IsDependentOn("Copy-Files-Impl")
+ .IsDependentOn("Zip-Files-Impl")
+ .IsDependentOn("Publish-MyGet-Impl")
+ .IsDependentOn("Publish-NuGet-Impl");
Task("Travis")
- .IsDependentOn("Run-Unit-Tests");
+ .IsDependentOn("Run-Tests");
///////////////////////////////////////////////////////////////////////////////
// EXECUTE
///////////////////////////////////////////////////////////////////////////////
-RunTarget(parameters.Target);
+var target = Context.Argument("target", "Default");
+
+if (target == "Default")
+{
+ target = Context.IsRunningOnWindows() ? "Package" : "Run-Tests";
+}
+
+RunTarget(target);
diff --git a/build/SkiaSharp.props b/build/SkiaSharp.props
index 04e8a3ad4f..35c979a95e 100644
--- a/build/SkiaSharp.props
+++ b/build/SkiaSharp.props
@@ -1,6 +1,6 @@
-
-
+
+
diff --git a/build/XUnit.props b/build/XUnit.props
index 15412d19e7..079565d184 100644
--- a/build/XUnit.props
+++ b/build/XUnit.props
@@ -9,21 +9,6 @@
+
-
-
-
-
- true
-
-
-
-
- true
-
-
-
diff --git a/cake.config b/cake.config
new file mode 100644
index 0000000000..8089cd4084
--- /dev/null
+++ b/cake.config
@@ -0,0 +1,15 @@
+; This is the default configuration file for Cake.
+; This file was downloaded from https://github.com/cake-build/resources
+
+[Nuget]
+Source=https://api.nuget.org/v3/index.json
+UseInProcessClient=true
+LoadDependencies=false
+
+[Paths]
+Tools=./tools
+Addins=./tools/Addins
+Modules=./tools/Modules
+
+[Settings]
+SkipVerification=false
diff --git a/packages.cake b/packages.cake
index 7ffc805ec8..7ebe8d4694 100644
--- a/packages.cake
+++ b/packages.cake
@@ -1,3 +1,6 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
using System.Xml.Linq;
public class Packages
@@ -9,12 +12,11 @@ public class Packages
public string SkiaSharpVersion {get; private set; }
public string SkiaSharpLinuxVersion {get; private set; }
public Dictionary>> PackageVersions{get; private set;}
-
-
-
+
class DependencyBuilder : List
{
Packages _parent;
+
public DependencyBuilder(Packages parent)
{
_parent = parent;
@@ -24,8 +26,7 @@ public class Packages
{
return _parent.PackageVersions[name].First().Item1;
}
-
-
+
public DependencyBuilder Dep(string name, params string[] fws)
{
if(fws.Length == 0)
@@ -212,17 +213,33 @@ public class Packages
};
});
- var toolsContent = new[] {
- new NuSpecContent{
- Source = ((FilePath)context.File("./src/tools/Avalonia.Designer.HostApp/bin/" + parameters.DirSuffix + "/netcoreapp2.0/Avalonia.Designer.HostApp.dll")).FullPath,
- Target = "tools/netcoreapp2.0/previewer"
- },
- new NuSpecContent{
- Source = ((FilePath)context.File("./src/tools/Avalonia.Designer.HostApp.NetFx/bin/" + parameters.DirSuffix + "/Avalonia.Designer.HostApp.exe")).FullPath,
- Target = "tools/net461/previewer"
- }
+ var toolHostApp = new NuSpecContent{
+ Source = ((FilePath)context.File("./src/tools/Avalonia.Designer.HostApp/bin/" + parameters.DirSuffix + "/netcoreapp2.0/Avalonia.Designer.HostApp.dll")).FullPath,
+ Target = "tools/netcoreapp2.0/previewer"
+ };
+
+ var toolHostAppNetFx = new NuSpecContent{
+ Source = ((FilePath)context.File("./src/tools/Avalonia.Designer.HostApp.NetFx/bin/" + parameters.DirSuffix + "/Avalonia.Designer.HostApp.exe")).FullPath,
+ Target = "tools/net461/previewer"
};
+ IList coreFiles;
+
+ if (!parameters.IsPlatformNetCoreOnly) {
+ var toolsContent = new[] { toolHostApp, toolHostAppNetFx };
+ coreFiles = coreLibrariesNuSpecContent
+ .Concat(win32CoreLibrariesNuSpecContent).Concat(net45RuntimePlatform)
+ .Concat(netcoreappCoreLibrariesNuSpecContent).Concat(netCoreRuntimePlatform)
+ .Concat(toolsContent)
+ .ToList();
+ } else {
+ var toolsContent = new[] { toolHostApp };
+ coreFiles = coreLibrariesNuSpecContent
+ .Concat(netcoreappCoreLibrariesNuSpecContent).Concat(netCoreRuntimePlatform)
+ .Concat(toolsContent)
+ .ToList();
+ }
+
var nuspecNuGetSettingsCore = new []
{
///////////////////////////////////////////////////////////////////////////////
@@ -253,13 +270,9 @@ public class Packages
}
.Deps(new string[]{null, "netcoreapp2.0"},
"System.ValueTuple", "System.ComponentModel.TypeConverter", "System.ComponentModel.Primitives",
- "System.Runtime.Serialization.Primitives", "System.Xml.XmlDocument", "System.Xml.ReaderWriter")
+ "System.Runtime.Serialization.Primitives", "System.Xml.XmlDocument", "System.Xml.ReaderWriter", "System.Memory")
.ToArray(),
- Files = coreLibrariesNuSpecContent
- .Concat(win32CoreLibrariesNuSpecContent).Concat(net45RuntimePlatform)
- .Concat(netcoreappCoreLibrariesNuSpecContent).Concat(netCoreRuntimePlatform)
- .Concat(toolsContent)
- .ToList(),
+ Files = coreFiles,
BasePath = context.Directory("./"),
OutputDirectory = parameters.NugetRoot
},
@@ -451,22 +464,6 @@ public class Packages
BasePath = context.Directory("./"),
OutputDirectory = parameters.NugetRoot
},
- new NuGetPackSettings()
- {
- Id = "Avalonia.Win32.Interoperability",
- Dependencies = new []
- {
- new NuSpecDependency() { Id = "Avalonia.Win32", Version = parameters.Version },
- new NuSpecDependency() { Id = "Avalonia.Direct2D1", Version = parameters.Version },
- new NuSpecDependency() { Id = "SharpDX.Direct3D9", Version = SharpDXDirect3D9Version },
- },
- Files = new []
- {
- new NuSpecContent { Source = "Avalonia.Win32.Interop/bin/" + parameters.DirSuffix + "/Avalonia.Win32.Interop.dll", Target = "lib/net45" }
- },
- BasePath = context.Directory("./src/Windows"),
- OutputDirectory = parameters.NugetRoot
- },
///////////////////////////////////////////////////////////////////////////////
// Avalonia.LinuxFramebuffer
///////////////////////////////////////////////////////////////////////////////
@@ -487,11 +484,32 @@ public class Packages
}
};
+ var nuspecNuGetSettingInterop = new NuGetPackSettings()
+ {
+ Id = "Avalonia.Win32.Interoperability",
+ Dependencies = new []
+ {
+ new NuSpecDependency() { Id = "Avalonia.Win32", Version = parameters.Version },
+ new NuSpecDependency() { Id = "Avalonia.Direct2D1", Version = parameters.Version },
+ new NuSpecDependency() { Id = "SharpDX.Direct3D9", Version = SharpDXDirect3D9Version },
+ },
+ Files = new []
+ {
+ new NuSpecContent { Source = "Avalonia.Win32.Interop/bin/" + parameters.DirSuffix + "/Avalonia.Win32.Interop.dll", Target = "lib/net45" }
+ },
+ BasePath = context.Directory("./src/Windows"),
+ OutputDirectory = parameters.NugetRoot
+ };
+
NuspecNuGetSettings = new List();
NuspecNuGetSettings.AddRange(nuspecNuGetSettingsCore);
NuspecNuGetSettings.AddRange(nuspecNuGetSettingsDesktop);
- NuspecNuGetSettings.AddRange(nuspecNuGetSettingsMobile);
+
+ if (!parameters.IsPlatformNetCoreOnly) {
+ NuspecNuGetSettings.Add(nuspecNuGetSettingInterop);
+ NuspecNuGetSettings.AddRange(nuspecNuGetSettingsMobile);
+ }
NuspecNuGetSettings.ForEach((nuspec) => SetNuGetNuspecCommonProperties(nuspec));
diff --git a/parameters.cake b/parameters.cake
index 759846c658..e595b8159f 100644
--- a/parameters.cake
+++ b/parameters.cake
@@ -1,6 +1,5 @@
public class Parameters
{
- public string Target { get; private set; }
public string Platform { get; private set; }
public string Configuration { get; private set; }
public bool SkipTests { get; private set; }
@@ -9,11 +8,11 @@ public class Parameters
public string AssemblyInfoPath { get; private set; }
public string ReleasePlatform { get; private set; }
public string ReleaseConfiguration { get; private set; }
- public string MSBuildSolution { get; private set; }
- public string XBuildSolution { get; private set; }
+ public string MSBuildSolution { get; private set; }
public bool IsPlatformAnyCPU { get; private set; }
public bool IsPlatformX86 { get; private set; }
public bool IsPlatformX64 { get; private set; }
+ public bool IsPlatformNetCoreOnly { get; private set; }
public bool IsLocalBuild { get; private set; }
public bool IsRunningOnUnix { get; private set; }
public bool IsRunningOnWindows { get; private set; }
@@ -35,6 +34,7 @@ public class Parameters
public DirectoryPathCollection BuildDirs { get; private set; }
public string FileZipSuffix { get; private set; }
public FilePath ZipCoreArtifacts { get; private set; }
+ public FilePath ZipNuGetArtifacts { get; private set; }
public DirectoryPath ZipSourceControlCatalogDesktopDirs { get; private set; }
public FilePath ZipTargetControlCatalogDesktopDirs { get; private set; }
@@ -43,7 +43,6 @@ public class Parameters
var buildSystem = context.BuildSystem();
// ARGUMENTS
- Target = context.Argument("target", "Default");
Platform = context.Argument("platform", "Any CPU");
Configuration = context.Argument("configuration", "Release");
SkipTests = context.HasArgument("skip-tests");
@@ -55,12 +54,12 @@ public class Parameters
ReleasePlatform = "Any CPU";
ReleaseConfiguration = "Release";
MSBuildSolution = "./Avalonia.sln";
- XBuildSolution = "./Avalonia.XBuild.sln";
// PARAMETERS
IsPlatformAnyCPU = StringComparer.OrdinalIgnoreCase.Equals(Platform, "Any CPU");
IsPlatformX86 = StringComparer.OrdinalIgnoreCase.Equals(Platform, "x86");
IsPlatformX64 = StringComparer.OrdinalIgnoreCase.Equals(Platform, "x64");
+ IsPlatformNetCoreOnly = StringComparer.OrdinalIgnoreCase.Equals(Platform, "NetCoreOnly");
IsLocalBuild = buildSystem.IsLocalBuild;
IsRunningOnUnix = context.IsRunningOnUnix();
IsRunningOnWindows = context.IsRunningOnWindows();
@@ -73,7 +72,6 @@ public class Parameters
IsReleasable = StringComparer.OrdinalIgnoreCase.Equals(ReleasePlatform, Platform)
&& StringComparer.OrdinalIgnoreCase.Equals(ReleaseConfiguration, Configuration);
IsMyGetRelease = !IsTagged && IsReleasable;
-
// VERSION
Version = context.Argument("force-nuget-version", context.ParseAssemblyInfo(AssemblyInfoPath).AssemblyVersion);
@@ -105,14 +103,12 @@ public class Parameters
NugetRoot = ArtifactsDir.Combine("nuget");
ZipRoot = ArtifactsDir.Combine("zip");
BinRoot = ArtifactsDir.Combine("bin");
-
BuildDirs = context.GetDirectories("**/bin") + context.GetDirectories("**/obj");
-
DirSuffix = Configuration;
DirSuffixIOS = "iPhone" + "/" + Configuration;
-
FileZipSuffix = Version + ".zip";
ZipCoreArtifacts = ZipRoot.CombineWithFilePath("Avalonia-" + FileZipSuffix);
+ ZipNuGetArtifacts = ZipRoot.CombineWithFilePath("Avalonia-NuGet-" + FileZipSuffix);
ZipSourceControlCatalogDesktopDirs = (DirectoryPath)context.Directory("./samples/ControlCatalog.Desktop/bin/" + DirSuffix + "/net461");
ZipTargetControlCatalogDesktopDirs = ZipRoot.CombineWithFilePath("ControlCatalog.Desktop-" + FileZipSuffix);
}
diff --git a/samples/BindingTest/App.config b/samples/BindingDemo/App.config
similarity index 100%
rename from samples/BindingTest/App.config
rename to samples/BindingDemo/App.config
diff --git a/samples/BindingTest/App.xaml b/samples/BindingDemo/App.xaml
similarity index 100%
rename from samples/BindingTest/App.xaml
rename to samples/BindingDemo/App.xaml
diff --git a/samples/BindingTest/App.xaml.cs b/samples/BindingDemo/App.xaml.cs
similarity index 95%
rename from samples/BindingTest/App.xaml.cs
rename to samples/BindingDemo/App.xaml.cs
index ccad1d0ba9..01c52a2a49 100644
--- a/samples/BindingTest/App.xaml.cs
+++ b/samples/BindingDemo/App.xaml.cs
@@ -5,7 +5,7 @@ using Avalonia.Logging.Serilog;
using Avalonia.Markup.Xaml;
using Serilog;
-namespace BindingTest
+namespace BindingDemo
{
public class App : Application
{
diff --git a/samples/BindingTest/BindingTest.csproj b/samples/BindingDemo/BindingDemo.csproj
similarity index 100%
rename from samples/BindingTest/BindingTest.csproj
rename to samples/BindingDemo/BindingDemo.csproj
diff --git a/samples/BindingTest/MainWindow.xaml b/samples/BindingDemo/MainWindow.xaml
similarity index 98%
rename from samples/BindingTest/MainWindow.xaml
rename to samples/BindingDemo/MainWindow.xaml
index 6b80225686..a69fb75742 100644
--- a/samples/BindingTest/MainWindow.xaml
+++ b/samples/BindingDemo/MainWindow.xaml
@@ -1,7 +1,7 @@
diff --git a/samples/BindingTest/MainWindow.xaml.cs b/samples/BindingDemo/MainWindow.xaml.cs
similarity index 88%
rename from samples/BindingTest/MainWindow.xaml.cs
rename to samples/BindingDemo/MainWindow.xaml.cs
index c1c3c09406..eaa57e1f5f 100644
--- a/samples/BindingTest/MainWindow.xaml.cs
+++ b/samples/BindingDemo/MainWindow.xaml.cs
@@ -1,9 +1,9 @@
-using BindingTest.ViewModels;
+using BindingDemo.ViewModels;
using Avalonia;
using Avalonia.Controls;
using Avalonia.Markup.Xaml;
-namespace BindingTest
+namespace BindingDemo
{
public class MainWindow : Window
{
diff --git a/samples/BindingTest/TestItemView.xaml b/samples/BindingDemo/TestItemView.xaml
similarity index 100%
rename from samples/BindingTest/TestItemView.xaml
rename to samples/BindingDemo/TestItemView.xaml
diff --git a/samples/BindingTest/TestItemView.xaml.cs b/samples/BindingDemo/TestItemView.xaml.cs
similarity index 93%
rename from samples/BindingTest/TestItemView.xaml.cs
rename to samples/BindingDemo/TestItemView.xaml.cs
index 32f367ef68..8c0b592f00 100644
--- a/samples/BindingTest/TestItemView.xaml.cs
+++ b/samples/BindingDemo/TestItemView.xaml.cs
@@ -1,7 +1,7 @@
using Avalonia.Controls;
using Avalonia.Markup.Xaml;
-namespace BindingTest
+namespace BindingDemo
{
public class TestItemView : UserControl
{
diff --git a/samples/BindingTest/ViewModels/DataAnnotationsErrorViewModel.cs b/samples/BindingDemo/ViewModels/DataAnnotationsErrorViewModel.cs
similarity index 92%
rename from samples/BindingTest/ViewModels/DataAnnotationsErrorViewModel.cs
rename to samples/BindingDemo/ViewModels/DataAnnotationsErrorViewModel.cs
index 634498c165..e274f9180e 100644
--- a/samples/BindingTest/ViewModels/DataAnnotationsErrorViewModel.cs
+++ b/samples/BindingDemo/ViewModels/DataAnnotationsErrorViewModel.cs
@@ -3,7 +3,7 @@
using System.ComponentModel.DataAnnotations;
-namespace BindingTest.ViewModels
+namespace BindingDemo.ViewModels
{
public class DataAnnotationsErrorViewModel
{
diff --git a/samples/BindingTest/ViewModels/ExceptionErrorViewModel.cs b/samples/BindingDemo/ViewModels/ExceptionErrorViewModel.cs
similarity index 95%
rename from samples/BindingTest/ViewModels/ExceptionErrorViewModel.cs
rename to samples/BindingDemo/ViewModels/ExceptionErrorViewModel.cs
index e6071e0678..2ab6c26e68 100644
--- a/samples/BindingTest/ViewModels/ExceptionErrorViewModel.cs
+++ b/samples/BindingDemo/ViewModels/ExceptionErrorViewModel.cs
@@ -4,7 +4,7 @@
using ReactiveUI;
using System;
-namespace BindingTest.ViewModels
+namespace BindingDemo.ViewModels
{
public class ExceptionErrorViewModel : ReactiveObject
{
diff --git a/samples/BindingTest/ViewModels/IndeiErrorViewModel.cs b/samples/BindingDemo/ViewModels/IndeiErrorViewModel.cs
similarity index 98%
rename from samples/BindingTest/ViewModels/IndeiErrorViewModel.cs
rename to samples/BindingDemo/ViewModels/IndeiErrorViewModel.cs
index b4bb528abb..bb3b4d64e9 100644
--- a/samples/BindingTest/ViewModels/IndeiErrorViewModel.cs
+++ b/samples/BindingDemo/ViewModels/IndeiErrorViewModel.cs
@@ -6,7 +6,7 @@ using System;
using System.ComponentModel;
using System.Collections;
-namespace BindingTest.ViewModels
+namespace BindingDemo.ViewModels
{
public class IndeiErrorViewModel : ReactiveObject, INotifyDataErrorInfo
{
diff --git a/samples/BindingTest/ViewModels/MainWindowViewModel.cs b/samples/BindingDemo/ViewModels/MainWindowViewModel.cs
similarity index 99%
rename from samples/BindingTest/ViewModels/MainWindowViewModel.cs
rename to samples/BindingDemo/ViewModels/MainWindowViewModel.cs
index 1116810ccb..858fb5159a 100644
--- a/samples/BindingTest/ViewModels/MainWindowViewModel.cs
+++ b/samples/BindingDemo/ViewModels/MainWindowViewModel.cs
@@ -6,7 +6,7 @@ using System.Reactive.Linq;
using System.Threading.Tasks;
using System.Threading;
-namespace BindingTest.ViewModels
+namespace BindingDemo.ViewModels
{
public class MainWindowViewModel : ReactiveObject
{
diff --git a/samples/BindingTest/ViewModels/NestedCommandViewModel.cs b/samples/BindingDemo/ViewModels/NestedCommandViewModel.cs
similarity index 92%
rename from samples/BindingTest/ViewModels/NestedCommandViewModel.cs
rename to samples/BindingDemo/ViewModels/NestedCommandViewModel.cs
index 886ecbed8e..0e9139ab98 100644
--- a/samples/BindingTest/ViewModels/NestedCommandViewModel.cs
+++ b/samples/BindingDemo/ViewModels/NestedCommandViewModel.cs
@@ -6,7 +6,7 @@ using System.Text;
using System.Threading.Tasks;
using System.Windows.Input;
-namespace BindingTest.ViewModels
+namespace BindingDemo.ViewModels
{
public class NestedCommandViewModel : ReactiveObject
{
diff --git a/samples/BindingTest/ViewModels/TestItem.cs b/samples/BindingDemo/ViewModels/TestItem.cs
similarity index 93%
rename from samples/BindingTest/ViewModels/TestItem.cs
rename to samples/BindingDemo/ViewModels/TestItem.cs
index 2326a92b7d..5a9f192f58 100644
--- a/samples/BindingTest/ViewModels/TestItem.cs
+++ b/samples/BindingDemo/ViewModels/TestItem.cs
@@ -1,6 +1,6 @@
using ReactiveUI;
-namespace BindingTest.ViewModels
+namespace BindingDemo.ViewModels
{
public class TestItem : ReactiveObject
{
diff --git a/samples/ControlCatalog.Android/Resources/Resource.Designer.cs b/samples/ControlCatalog.Android/Resources/Resource.Designer.cs
index cee3331ba8..96f0e76fd8 100644
--- a/samples/ControlCatalog.Android/Resources/Resource.Designer.cs
+++ b/samples/ControlCatalog.Android/Resources/Resource.Designer.cs
@@ -28,8 +28,6 @@ namespace ControlCatalog.Android
{
global::Avalonia.Android.Resource.String.ApplicationName = global::ControlCatalog.Android.Resource.String.ApplicationName;
global::Avalonia.Android.Resource.String.Hello = global::ControlCatalog.Android.Resource.String.Hello;
- global::Avalonia.Android.Resource.String.library_name = global::ControlCatalog.Android.Resource.String.library_name;
- global::Splat.Resource.String.library_name = global::ControlCatalog.Android.Resource.String.library_name;
}
public partial class Attribute
@@ -96,14 +94,11 @@ namespace ControlCatalog.Android
public partial class String
{
- // aapt resource value: 0x7f040002
- public const int ApplicationName = 2130968578;
-
// aapt resource value: 0x7f040001
- public const int Hello = 2130968577;
+ public const int ApplicationName = 2130968577;
// aapt resource value: 0x7f040000
- public const int library_name = 2130968576;
+ public const int Hello = 2130968576;
static String()
{
diff --git a/samples/ControlCatalog.NetCore/Program.cs b/samples/ControlCatalog.NetCore/Program.cs
index b45a93455e..1f53dedc14 100644
--- a/samples/ControlCatalog.NetCore/Program.cs
+++ b/samples/ControlCatalog.NetCore/Program.cs
@@ -1,9 +1,9 @@
using System;
using System.Diagnostics;
using System.Linq;
-using System.Runtime.InteropServices;
using System.Threading;
using Avalonia;
+using Avalonia.Skia;
namespace ControlCatalog.NetCore
{
@@ -37,7 +37,7 @@ namespace ControlCatalog.NetCore
/// This method is needed for IDE previewer infrastructure
///
public static AppBuilder BuildAvaloniaApp()
- => AppBuilder.Configure().UsePlatformDetect().UseReactiveUI();
+ => AppBuilder.Configure().UsePlatformDetect().UseSkia().UseReactiveUI();
static void ConsoleSilencer()
{
diff --git a/samples/ControlCatalog/SideBar.xaml b/samples/ControlCatalog/SideBar.xaml
index e5baf9e942..7d72d1821b 100644
--- a/samples/ControlCatalog/SideBar.xaml
+++ b/samples/ControlCatalog/SideBar.xaml
@@ -8,7 +8,7 @@
+ SelectedIndex="{TemplateBinding SelectedIndex, Mode=TwoWay}">
@@ -20,7 +20,7 @@
Margin="8 0 0 0"
MemberSelector="{x:Static TabControl.ContentSelector}"
Items="{TemplateBinding Items}"
- SelectedIndex="{TemplateBinding Path=SelectedIndex}"
+ SelectedIndex="{TemplateBinding SelectedIndex}"
PageTransition="{TemplateBinding PageTransition}"
Grid.Row="1"/>
diff --git a/samples/RemoteTest/Program.cs b/samples/RemoteDemo/Program.cs
similarity index 98%
rename from samples/RemoteTest/Program.cs
rename to samples/RemoteDemo/Program.cs
index f518e77143..0565b676fb 100644
--- a/samples/RemoteTest/Program.cs
+++ b/samples/RemoteDemo/Program.cs
@@ -9,7 +9,7 @@ using Avalonia.Remote.Protocol;
using Avalonia.Threading;
using ControlCatalog;
-namespace RemoteTest
+namespace RemoteDemo
{
class Program
{
diff --git a/samples/RemoteTest/RemoteTest.csproj b/samples/RemoteDemo/RemoteDemo.csproj
similarity index 100%
rename from samples/RemoteTest/RemoteTest.csproj
rename to samples/RemoteDemo/RemoteDemo.csproj
diff --git a/samples/RenderTest/App.config b/samples/RenderDemo/App.config
similarity index 100%
rename from samples/RenderTest/App.config
rename to samples/RenderDemo/App.config
diff --git a/samples/RenderTest/App.xaml b/samples/RenderDemo/App.xaml
similarity index 81%
rename from samples/RenderTest/App.xaml
rename to samples/RenderDemo/App.xaml
index c119f54915..aee75cb139 100644
--- a/samples/RenderTest/App.xaml
+++ b/samples/RenderDemo/App.xaml
@@ -2,6 +2,6 @@
-
+
\ No newline at end of file
diff --git a/samples/RenderTest/App.xaml.cs b/samples/RenderDemo/App.xaml.cs
similarity index 97%
rename from samples/RenderTest/App.xaml.cs
rename to samples/RenderDemo/App.xaml.cs
index fd2b940f6a..0f627961e6 100644
--- a/samples/RenderTest/App.xaml.cs
+++ b/samples/RenderDemo/App.xaml.cs
@@ -5,7 +5,7 @@ using Avalonia;
using Avalonia.Logging.Serilog;
using Avalonia.Markup.Xaml;
-namespace RenderTest
+namespace RenderDemo
{
public class App : Application
{
diff --git a/samples/RenderTest/MainWindow.xaml b/samples/RenderDemo/MainWindow.xaml
similarity index 95%
rename from samples/RenderTest/MainWindow.xaml
rename to samples/RenderDemo/MainWindow.xaml
index da49054b77..df2b221423 100644
--- a/samples/RenderTest/MainWindow.xaml
+++ b/samples/RenderDemo/MainWindow.xaml
@@ -1,6 +1,6 @@
diff --git a/samples/RenderTest/MainWindow.xaml.cs b/samples/RenderDemo/MainWindow.xaml.cs
similarity index 94%
rename from samples/RenderTest/MainWindow.xaml.cs
rename to samples/RenderDemo/MainWindow.xaml.cs
index 76a8e81aca..f1f974f7a1 100644
--- a/samples/RenderTest/MainWindow.xaml.cs
+++ b/samples/RenderDemo/MainWindow.xaml.cs
@@ -5,10 +5,10 @@ using System;
using Avalonia;
using Avalonia.Controls;
using Avalonia.Markup.Xaml;
-using RenderTest.ViewModels;
+using RenderDemo.ViewModels;
using ReactiveUI;
-namespace RenderTest
+namespace RenderDemo
{
public class MainWindow : Window
{
diff --git a/samples/RenderTest/Pages/AnimationsPage.xaml b/samples/RenderDemo/Pages/AnimationsPage.xaml
similarity index 100%
rename from samples/RenderTest/Pages/AnimationsPage.xaml
rename to samples/RenderDemo/Pages/AnimationsPage.xaml
diff --git a/samples/RenderTest/Pages/AnimationsPage.xaml.cs b/samples/RenderDemo/Pages/AnimationsPage.xaml.cs
similarity index 90%
rename from samples/RenderTest/Pages/AnimationsPage.xaml.cs
rename to samples/RenderDemo/Pages/AnimationsPage.xaml.cs
index 2623721393..5b02fd9297 100644
--- a/samples/RenderTest/Pages/AnimationsPage.xaml.cs
+++ b/samples/RenderDemo/Pages/AnimationsPage.xaml.cs
@@ -7,9 +7,9 @@ using Avalonia.Data;
using Avalonia.Input;
using Avalonia.Markup.Xaml;
using Avalonia.Media;
-using RenderTest.ViewModels;
+using RenderDemo.ViewModels;
-namespace RenderTest.Pages
+namespace RenderDemo.Pages
{
public class AnimationsPage : UserControl
{
diff --git a/samples/RenderTest/Pages/ClippingPage.xaml b/samples/RenderDemo/Pages/ClippingPage.xaml
similarity index 100%
rename from samples/RenderTest/Pages/ClippingPage.xaml
rename to samples/RenderDemo/Pages/ClippingPage.xaml
diff --git a/samples/RenderTest/Pages/ClippingPage.xaml.cs b/samples/RenderDemo/Pages/ClippingPage.xaml.cs
similarity index 96%
rename from samples/RenderTest/Pages/ClippingPage.xaml.cs
rename to samples/RenderDemo/Pages/ClippingPage.xaml.cs
index 2a79076d4c..5357181838 100644
--- a/samples/RenderTest/Pages/ClippingPage.xaml.cs
+++ b/samples/RenderDemo/Pages/ClippingPage.xaml.cs
@@ -7,7 +7,7 @@ using Avalonia.Data;
using Avalonia.Markup.Xaml;
using Avalonia.Media;
-namespace RenderTest.Pages
+namespace RenderDemo.Pages
{
public class ClippingPage : UserControl
{
diff --git a/samples/RenderTest/Pages/DrawingPage.xaml b/samples/RenderDemo/Pages/DrawingPage.xaml
similarity index 100%
rename from samples/RenderTest/Pages/DrawingPage.xaml
rename to samples/RenderDemo/Pages/DrawingPage.xaml
diff --git a/samples/RenderTest/Pages/DrawingPage.xaml.cs b/samples/RenderDemo/Pages/DrawingPage.xaml.cs
similarity index 91%
rename from samples/RenderTest/Pages/DrawingPage.xaml.cs
rename to samples/RenderDemo/Pages/DrawingPage.xaml.cs
index 3bf9bd545d..3475e1aa07 100644
--- a/samples/RenderTest/Pages/DrawingPage.xaml.cs
+++ b/samples/RenderDemo/Pages/DrawingPage.xaml.cs
@@ -1,7 +1,7 @@
using Avalonia.Controls;
using Avalonia.Markup.Xaml;
-namespace RenderTest.Pages
+namespace RenderDemo.Pages
{
public class DrawingPage : UserControl
{
diff --git a/samples/RenderTest/RenderTest.csproj b/samples/RenderDemo/RenderDemo.csproj
similarity index 100%
rename from samples/RenderTest/RenderTest.csproj
rename to samples/RenderDemo/RenderDemo.csproj
diff --git a/samples/RenderTest/SideBar.xaml b/samples/RenderDemo/SideBar.xaml
similarity index 92%
rename from samples/RenderTest/SideBar.xaml
rename to samples/RenderDemo/SideBar.xaml
index 29e5d854f9..b5f8ccaf01 100644
--- a/samples/RenderTest/SideBar.xaml
+++ b/samples/RenderDemo/SideBar.xaml
@@ -9,7 +9,7 @@
+ SelectedIndex="{TemplateBinding SelectedIndex, Mode=TwoWay}">
@@ -21,7 +21,7 @@
Margin="8 0 0 0"
MemberSelector="{x:Static TabControl.ContentSelector}"
Items="{TemplateBinding Items}"
- SelectedIndex="{TemplateBinding Path=SelectedIndex}"
+ SelectedIndex="{TemplateBinding SelectedIndex}"
PageTransition="{TemplateBinding PageTransition}"
Grid.Row="1"/>
diff --git a/samples/RenderTest/ViewModels/AnimationsPageViewModel.cs b/samples/RenderDemo/ViewModels/AnimationsPageViewModel.cs
similarity index 97%
rename from samples/RenderTest/ViewModels/AnimationsPageViewModel.cs
rename to samples/RenderDemo/ViewModels/AnimationsPageViewModel.cs
index 17eee547a1..626a3e7c77 100644
--- a/samples/RenderTest/ViewModels/AnimationsPageViewModel.cs
+++ b/samples/RenderDemo/ViewModels/AnimationsPageViewModel.cs
@@ -2,7 +2,7 @@
using ReactiveUI;
using Avalonia.Animation;
-namespace RenderTest.ViewModels
+namespace RenderDemo.ViewModels
{
public class AnimationsPageViewModel : ReactiveObject
{
diff --git a/samples/RenderTest/ViewModels/MainWindowViewModel.cs b/samples/RenderDemo/ViewModels/MainWindowViewModel.cs
similarity index 96%
rename from samples/RenderTest/ViewModels/MainWindowViewModel.cs
rename to samples/RenderDemo/ViewModels/MainWindowViewModel.cs
index 02a2abeb89..0cb5e1b87b 100644
--- a/samples/RenderTest/ViewModels/MainWindowViewModel.cs
+++ b/samples/RenderDemo/ViewModels/MainWindowViewModel.cs
@@ -1,7 +1,7 @@
using System;
using ReactiveUI;
-namespace RenderTest.ViewModels
+namespace RenderDemo.ViewModels
{
public class MainWindowViewModel : ReactiveObject
{
diff --git a/samples/VirtualizationTest/App.config b/samples/VirtualizationDemo/App.config
similarity index 100%
rename from samples/VirtualizationTest/App.config
rename to samples/VirtualizationDemo/App.config
diff --git a/samples/VirtualizationTest/App.xaml b/samples/VirtualizationDemo/App.xaml
similarity index 100%
rename from samples/VirtualizationTest/App.xaml
rename to samples/VirtualizationDemo/App.xaml
diff --git a/samples/VirtualizationTest/App.xaml.cs b/samples/VirtualizationDemo/App.xaml.cs
similarity index 92%
rename from samples/VirtualizationTest/App.xaml.cs
rename to samples/VirtualizationDemo/App.xaml.cs
index 14ab5b3f84..b220807443 100644
--- a/samples/VirtualizationTest/App.xaml.cs
+++ b/samples/VirtualizationDemo/App.xaml.cs
@@ -4,7 +4,7 @@
using Avalonia;
using Avalonia.Markup.Xaml;
-namespace VirtualizationTest
+namespace VirtualizationDemo
{
public class App : Application
{
diff --git a/samples/VirtualizationTest/MainWindow.xaml b/samples/VirtualizationDemo/MainWindow.xaml
similarity index 100%
rename from samples/VirtualizationTest/MainWindow.xaml
rename to samples/VirtualizationDemo/MainWindow.xaml
diff --git a/samples/VirtualizationTest/MainWindow.xaml.cs b/samples/VirtualizationDemo/MainWindow.xaml.cs
similarity index 89%
rename from samples/VirtualizationTest/MainWindow.xaml.cs
rename to samples/VirtualizationDemo/MainWindow.xaml.cs
index 952383dffb..271519b10b 100644
--- a/samples/VirtualizationTest/MainWindow.xaml.cs
+++ b/samples/VirtualizationDemo/MainWindow.xaml.cs
@@ -4,9 +4,9 @@
using Avalonia;
using Avalonia.Controls;
using Avalonia.Markup.Xaml;
-using VirtualizationTest.ViewModels;
+using VirtualizationDemo.ViewModels;
-namespace VirtualizationTest
+namespace VirtualizationDemo
{
public class MainWindow : Window
{
diff --git a/samples/VirtualizationTest/Program.cs b/samples/VirtualizationDemo/Program.cs
similarity index 94%
rename from samples/VirtualizationTest/Program.cs
rename to samples/VirtualizationDemo/Program.cs
index 097f0cfdc7..98f1f08d6c 100644
--- a/samples/VirtualizationTest/Program.cs
+++ b/samples/VirtualizationDemo/Program.cs
@@ -7,7 +7,7 @@ using Avalonia.Controls;
using Avalonia.Logging.Serilog;
using Serilog;
-namespace VirtualizationTest
+namespace VirtualizationDemo
{
class Program
{
diff --git a/samples/VirtualizationTest/ViewModels/ItemViewModel.cs b/samples/VirtualizationDemo/ViewModels/ItemViewModel.cs
similarity index 92%
rename from samples/VirtualizationTest/ViewModels/ItemViewModel.cs
rename to samples/VirtualizationDemo/ViewModels/ItemViewModel.cs
index 75777012c1..e883cdfeb9 100644
--- a/samples/VirtualizationTest/ViewModels/ItemViewModel.cs
+++ b/samples/VirtualizationDemo/ViewModels/ItemViewModel.cs
@@ -4,7 +4,7 @@
using System;
using ReactiveUI;
-namespace VirtualizationTest.ViewModels
+namespace VirtualizationDemo.ViewModels
{
internal class ItemViewModel : ReactiveObject
{
diff --git a/samples/VirtualizationTest/ViewModels/MainWindowViewModel.cs b/samples/VirtualizationDemo/ViewModels/MainWindowViewModel.cs
similarity index 99%
rename from samples/VirtualizationTest/ViewModels/MainWindowViewModel.cs
rename to samples/VirtualizationDemo/ViewModels/MainWindowViewModel.cs
index 8eab91e06d..eb08ef9656 100644
--- a/samples/VirtualizationTest/ViewModels/MainWindowViewModel.cs
+++ b/samples/VirtualizationDemo/ViewModels/MainWindowViewModel.cs
@@ -9,7 +9,7 @@ using Avalonia.Controls;
using Avalonia.Controls.Primitives;
using ReactiveUI;
-namespace VirtualizationTest.ViewModels
+namespace VirtualizationDemo.ViewModels
{
internal class MainWindowViewModel : ReactiveObject
{
diff --git a/samples/VirtualizationTest/VirtualizationTest.csproj b/samples/VirtualizationDemo/VirtualizationDemo.csproj
similarity index 100%
rename from samples/VirtualizationTest/VirtualizationTest.csproj
rename to samples/VirtualizationDemo/VirtualizationDemo.csproj
diff --git a/samples/interop/Direct3DInteropSample/MainWindow.cs b/samples/interop/Direct3DInteropSample/MainWindow.cs
index ffa0de0a36..19c31a3af1 100644
--- a/samples/interop/Direct3DInteropSample/MainWindow.cs
+++ b/samples/interop/Direct3DInteropSample/MainWindow.cs
@@ -88,7 +88,6 @@ namespace Direct3DInteropSample
context.ClearDepthStencilView(depthView, DepthStencilClearFlags.Depth, 1.0f, 0);
context.ClearRenderTargetView(renderView, Color.White);
- var time = 50;
// Update WorldViewProj Matrix
var worldViewProj = Matrix.RotationX((float) _model.RotationX) * Matrix.RotationY((float) _model.RotationY) *
Matrix.RotationZ((float) _model.RotationZ)
diff --git a/src/Android/Avalonia.Android/Platform/SkiaPlatform/PopupImpl.cs b/src/Android/Avalonia.Android/Platform/SkiaPlatform/PopupImpl.cs
index 78f744cea0..041d91043a 100644
--- a/src/Android/Avalonia.Android/Platform/SkiaPlatform/PopupImpl.cs
+++ b/src/Android/Avalonia.Android/Platform/SkiaPlatform/PopupImpl.cs
@@ -110,7 +110,10 @@ namespace Avalonia.Android.Platform.SkiaPlatform
{
//Not supported
}
-
+ public void SetTopmost(bool value)
+ {
+ //Not supported
+ }
}
}
\ No newline at end of file
diff --git a/src/Android/Avalonia.Android/Platform/Specific/Helpers/AndroidTouchEventsHelper.cs b/src/Android/Avalonia.Android/Platform/Specific/Helpers/AndroidTouchEventsHelper.cs
index 0f90472bd0..71822a6f47 100644
--- a/src/Android/Avalonia.Android/Platform/Specific/Helpers/AndroidTouchEventsHelper.cs
+++ b/src/Android/Avalonia.Android/Platform/Specific/Helpers/AndroidTouchEventsHelper.cs
@@ -126,8 +126,6 @@ namespace Avalonia.Android.Platform.Specific.Helpers
return e.Action != MotionEventActions.Up;
}
- private Paint _paint;
-
public void Dispose()
{
HandleEvents = false;
diff --git a/src/Android/Avalonia.Android/Resources/Resource.Designer.cs b/src/Android/Avalonia.Android/Resources/Resource.Designer.cs
index e66c2800d3..80cbbc51ec 100644
--- a/src/Android/Avalonia.Android/Resources/Resource.Designer.cs
+++ b/src/Android/Avalonia.Android/Resources/Resource.Designer.cs
@@ -40,14 +40,11 @@ namespace Avalonia.Android
public partial class String
{
- // aapt resource value: 0x7f020002
- public static int ApplicationName = 2130837506;
-
// aapt resource value: 0x7f020001
- public static int Hello = 2130837505;
+ public static int ApplicationName = 2130837505;
// aapt resource value: 0x7f020000
- public static int library_name = 2130837504;
+ public static int Hello = 2130837504;
static String()
{
diff --git a/src/Android/Avalonia.AndroidTestApplication/Resources/Resource.Designer.cs b/src/Android/Avalonia.AndroidTestApplication/Resources/Resource.Designer.cs
index 91327cf941..e171dd6162 100644
--- a/src/Android/Avalonia.AndroidTestApplication/Resources/Resource.Designer.cs
+++ b/src/Android/Avalonia.AndroidTestApplication/Resources/Resource.Designer.cs
@@ -28,8 +28,6 @@ namespace Avalonia.AndroidTestApplication
{
global::Avalonia.Android.Resource.String.ApplicationName = global::Avalonia.AndroidTestApplication.Resource.String.ApplicationName;
global::Avalonia.Android.Resource.String.Hello = global::Avalonia.AndroidTestApplication.Resource.String.Hello;
- global::Avalonia.Android.Resource.String.library_name = global::Avalonia.AndroidTestApplication.Resource.String.library_name;
- global::Splat.Resource.String.library_name = global::Avalonia.AndroidTestApplication.Resource.String.library_name;
}
public partial class Attribute
@@ -64,14 +62,11 @@ namespace Avalonia.AndroidTestApplication
public partial class String
{
- // aapt resource value: 0x7f030002
- public const int ApplicationName = 2130903042;
-
// aapt resource value: 0x7f030001
- public const int Hello = 2130903041;
+ public const int ApplicationName = 2130903041;
// aapt resource value: 0x7f030000
- public const int library_name = 2130903040;
+ public const int Hello = 2130903040;
static String()
{
diff --git a/src/Avalonia.Animation/AnimatorKeyFrame.cs b/src/Avalonia.Animation/AnimatorKeyFrame.cs
index 875bf761c4..02457cb9aa 100644
--- a/src/Avalonia.Animation/AnimatorKeyFrame.cs
+++ b/src/Avalonia.Animation/AnimatorKeyFrame.cs
@@ -9,7 +9,7 @@ namespace Avalonia.Animation
{
///
/// Defines a KeyFrame that is used for
- /// objects.
+ /// objects.
///
public class AnimatorKeyFrame
{
diff --git a/src/Avalonia.Base/AvaloniaObject.cs b/src/Avalonia.Base/AvaloniaObject.cs
index 48e72db126..761c0618da 100644
--- a/src/Avalonia.Base/AvaloniaObject.cs
+++ b/src/Avalonia.Base/AvaloniaObject.cs
@@ -10,6 +10,7 @@ using System.Reactive.Linq;
using Avalonia.Data;
using Avalonia.Diagnostics;
using Avalonia.Logging;
+using Avalonia.Reactive;
using Avalonia.Threading;
using Avalonia.Utilities;
@@ -28,17 +29,11 @@ namespace Avalonia
///
private IAvaloniaObject _inheritanceParent;
- ///
- /// The set values/bindings on this object.
- ///
- private readonly Dictionary _values =
- new Dictionary();
-
///
/// Maintains a list of direct property binding subscriptions so that the binding source
/// doesn't get collected.
///
- private List _directBindings;
+ private List _directBindings;
///
/// Event handler for implementation.
@@ -51,6 +46,7 @@ namespace Avalonia
private EventHandler _propertyChanged;
private DeferredSetter _directDeferredSetter;
+ private ValueStore _values;
///
/// Delayed setter helper for direct properties. Used to fix #855.
@@ -227,9 +223,20 @@ namespace Avalonia
{
return ((IDirectPropertyAccessor)GetRegistered(property)).GetValue(this);
}
+ else if (_values != null)
+ {
+ var result = _values.GetValue(property);
+
+ if (result == AvaloniaProperty.UnsetValue)
+ {
+ result = GetDefaultValue(property);
+ }
+
+ return result;
+ }
else
{
- return GetValueInternal(property);
+ return GetDefaultValue(property);
}
}
@@ -256,7 +263,7 @@ namespace Avalonia
Contract.Requires(property != null);
VerifyAccess();
- return _values.TryGetValue(property, out PriorityValue value) ? value.IsAnimating : false;
+ return _values?.IsAnimating(property) ?? false;
}
///
@@ -273,14 +280,7 @@ namespace Avalonia
Contract.Requires(property != null);
VerifyAccess();
- PriorityValue value;
-
- if (_values.TryGetValue(property, out value))
- {
- return value.Value != AvaloniaProperty.UnsetValue;
- }
-
- return false;
+ return _values?.IsSet(property) ?? false;
}
///
@@ -359,36 +359,15 @@ namespace Avalonia
property,
description);
- IDisposable subscription = null;
-
if (_directBindings == null)
{
- _directBindings = new List();
+ _directBindings = new List();
}
- subscription = source
- .Select(x => CastOrDefault(x, property.PropertyType))
- .Do(_ => { }, () => _directBindings.Remove(subscription))
- .Subscribe(x => SetDirectValue(property, x));
-
- _directBindings.Add(subscription);
-
- return Disposable.Create(() =>
- {
- subscription.Dispose();
- _directBindings.Remove(subscription);
- });
+ return new DirectBindingSubscription(this, property, source);
}
else
{
- PriorityValue v;
-
- if (!_values.TryGetValue(property, out v))
- {
- v = CreatePriorityValue(property);
- _values.Add(property, v);
- }
-
Logger.Verbose(
LogArea.Property,
this,
@@ -397,7 +376,12 @@ namespace Avalonia
description,
priority);
- return v.Add(source, (int)priority);
+ if (_values == null)
+ {
+ _values = new ValueStore(this);
+ }
+
+ return _values.AddBinding(property, source, priority);
}
}
@@ -428,20 +412,12 @@ namespace Avalonia
public void Revalidate(AvaloniaProperty property)
{
VerifyAccess();
- PriorityValue value;
-
- if (_values.TryGetValue(property, out value))
- {
- value.Revalidate();
- }
+ _values?.Revalidate(property);
}
///
- void IPriorityValueOwner.Changed(PriorityValue sender, object oldValue, object newValue)
+ void IPriorityValueOwner.Changed(AvaloniaProperty property, int priority, object oldValue, object newValue)
{
- var property = sender.Property;
- var priority = (BindingPriority)sender.ValuePriority;
-
oldValue = (oldValue == AvaloniaProperty.UnsetValue) ?
GetDefaultValue(property) :
oldValue;
@@ -451,7 +427,7 @@ namespace Avalonia
if (!Equals(oldValue, newValue))
{
- RaisePropertyChanged(property, oldValue, newValue, priority);
+ RaisePropertyChanged(property, oldValue, newValue, (BindingPriority)priority);
Logger.Verbose(
LogArea.Property,
@@ -460,14 +436,14 @@ namespace Avalonia
property,
oldValue,
newValue,
- priority);
+ (BindingPriority)priority);
}
}
///
- void IPriorityValueOwner.BindingNotificationReceived(PriorityValue sender, BindingNotification notification)
+ void IPriorityValueOwner.BindingNotificationReceived(AvaloniaProperty property, BindingNotification notification)
{
- UpdateDataValidation(sender.Property, notification);
+ UpdateDataValidation(property, notification);
}
///
@@ -480,10 +456,7 @@ namespace Avalonia
/// Gets all priority values set on the object.
///
/// A collection of property/value tuples.
- internal IDictionary GetSetValues()
- {
- return _values;
- }
+ internal IDictionary GetSetValues() => _values?.GetSetValues();
///
/// Forces revalidation of properties when a property value changes.
@@ -672,68 +645,18 @@ namespace Avalonia
}
}
- ///
- /// Creates a for a .
- ///
- /// The property.
- /// The .
- private PriorityValue CreatePriorityValue(AvaloniaProperty property)
- {
- var validate = ((IStyledPropertyAccessor)property).GetValidationFunc(GetType());
- Func