Коммит
ea8b0b5af1
|
@ -28,17 +28,17 @@ jobs:
|
||||||
distribution: 'zulu' # See 'Supported distributions' for available options
|
distribution: 'zulu' # See 'Supported distributions' for available options
|
||||||
java-version: '11'
|
java-version: '11'
|
||||||
|
|
||||||
# - name: install .NET
|
- name: install .NET
|
||||||
# shell: pwsh
|
|
||||||
# run: |
|
|
||||||
# $ProgressPreference = 'SilentlyContinue'
|
|
||||||
# Invoke-WebRequest -Uri "https://dot.net/v1/dotnet-install.ps1" -OutFile dotnet-install.ps1
|
|
||||||
# & .\dotnet-install.ps1 -Quality daily -Channel 6.0.3xx -InstallDir "$env:ProgramFiles\dotnet\" -Verbose
|
|
||||||
# & dotnet --list-sdks
|
|
||||||
|
|
||||||
- name: Install Visual Studio Preview
|
|
||||||
shell: pwsh
|
shell: pwsh
|
||||||
run: powershell .\build\install-vs.ps1
|
run: |
|
||||||
|
$ProgressPreference = 'SilentlyContinue'
|
||||||
|
Invoke-WebRequest -Uri "https://dot.net/v1/dotnet-install.ps1" -OutFile dotnet-install.ps1
|
||||||
|
& .\dotnet-install.ps1 -Quality daily -Channel 6.0.3xx -InstallDir "$env:ProgramFiles\dotnet\" -Verbose
|
||||||
|
& dotnet --list-sdks
|
||||||
|
|
||||||
|
# - name: Install Visual Studio Preview
|
||||||
|
# shell: pwsh
|
||||||
|
# run: powershell .\build\install-vs.ps1
|
||||||
|
|
||||||
- name: Add msbuild to PATH
|
- name: Add msbuild to PATH
|
||||||
uses: microsoft/setup-msbuild@v1.1
|
uses: microsoft/setup-msbuild@v1.1
|
||||||
|
@ -50,11 +50,8 @@ jobs:
|
||||||
run: |
|
run: |
|
||||||
& dotnet workload install maui `
|
& dotnet workload install maui `
|
||||||
--skip-sign-check `
|
--skip-sign-check `
|
||||||
--from-rollback-file https://aka.ms/dotnet/maui/6.0.300/rc.2.json `
|
--from-rollback-file https://aka.ms/dotnet/maui/6.0.300/rc.3.json `
|
||||||
--source https://pkgs.dev.azure.com/dnceng/public/_packaging/darc-pub-dotnet-runtime-323bf2dd/nuget/v3/index.json `
|
--source https://aka.ms/dotnet6/nuget/index.json `
|
||||||
--source https://pkgs.dev.azure.com/dnceng/public/_packaging/darc-pub-dotnet-emsdk-572aeedc/nuget/v3/index.json `
|
|
||||||
--source https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet6/nuget/v3/index.json `
|
|
||||||
--source https://pkgs.dev.azure.com/dnceng/public/_packaging/darc-pub-dotnet-runtime-a21b9a2d/nuget/v3/index.json `
|
|
||||||
--source https://api.nuget.org/v3/index.json
|
--source https://api.nuget.org/v3/index.json
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -36,27 +36,26 @@ jobs:
|
||||||
& .\dotnet-install.ps1 -Quality daily -Channel 6.0.3xx -InstallDir "$env:ProgramFiles\dotnet\" -Verbose
|
& .\dotnet-install.ps1 -Quality daily -Channel 6.0.3xx -InstallDir "$env:ProgramFiles\dotnet\" -Verbose
|
||||||
& dotnet --list-sdks
|
& dotnet --list-sdks
|
||||||
|
|
||||||
- name: Install Visual Studio Preview
|
# - name: Install Visual Studio Preview
|
||||||
shell: pwsh
|
# shell: pwsh
|
||||||
run: powershell .\build\install-vs.ps1
|
# run: powershell .\build\install-vs.ps1
|
||||||
|
|
||||||
- name: Add msbuild to PATH
|
- name: Add msbuild to PATH
|
||||||
uses: microsoft/setup-msbuild@v1.1
|
uses: microsoft/setup-msbuild@v1.1
|
||||||
with:
|
with:
|
||||||
vs-prerelease: true
|
vs-prerelease: true
|
||||||
|
|
||||||
|
|
||||||
- name: Install Maui Workload
|
- name: Install Maui Workload
|
||||||
shell: pwsh
|
shell: pwsh
|
||||||
run: |
|
run: |
|
||||||
& dotnet workload install maui `
|
& dotnet workload install maui `
|
||||||
--skip-sign-check `
|
--skip-sign-check `
|
||||||
--from-rollback-file https://aka.ms/dotnet/maui/6.0.300/rc.2.json `
|
--from-rollback-file https://aka.ms/dotnet/maui/6.0.300/rc.3.json `
|
||||||
--source https://pkgs.dev.azure.com/dnceng/public/_packaging/darc-pub-dotnet-runtime-323bf2dd/nuget/v3/index.json `
|
--source https://aka.ms/dotnet6/nuget/index.json `
|
||||||
--source https://pkgs.dev.azure.com/dnceng/public/_packaging/darc-pub-dotnet-emsdk-572aeedc/nuget/v3/index.json `
|
|
||||||
--source https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet6/nuget/v3/index.json `
|
|
||||||
--source https://pkgs.dev.azure.com/dnceng/public/_packaging/darc-pub-dotnet-runtime-a21b9a2d/nuget/v3/index.json `
|
|
||||||
--source https://api.nuget.org/v3/index.json
|
--source https://api.nuget.org/v3/index.json
|
||||||
|
|
||||||
|
|
||||||
- name: Set Maui Version
|
- name: Set Maui Version
|
||||||
run: dotnet run --project build/MauiVersionUpdater/MauiVersionUpdater.csproj -- https://aka.ms/dotnet/maui/6.0.300/rc.2.json
|
run: dotnet run --project build/MauiVersionUpdater/MauiVersionUpdater.csproj -- https://aka.ms/dotnet/maui/6.0.300/rc.2.json
|
||||||
|
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
Subproject commit acf9a61ae05fa0ca0d1f6554507e5957006a1af2
|
Subproject commit bb116a4a908174c33a1d62de3dee833c8a125372
|
|
@ -38,10 +38,5 @@
|
||||||
<ProjectReference Include="..\..\external\Maui\src\Core\src\Core.csproj" />
|
<ProjectReference Include="..\..\external\Maui\src\Core\src\Core.csproj" />
|
||||||
<ProjectReference Include="..\..\external\Maui\src\Essentials\src\Essentials.csproj" />
|
<ProjectReference Include="..\..\external\Maui\src\Essentials\src\Essentials.csproj" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<PropertyGroup Condition="$(TargetFramework.Contains('-windows'))">
|
|
||||||
<OutputType>WinExe</OutputType>
|
|
||||||
<RuntimeIdentifier>win-x64</RuntimeIdentifier>
|
|
||||||
<WindowsPackageType>MSIX</WindowsPackageType>
|
|
||||||
</PropertyGroup>
|
|
||||||
<ProjectExtensions><VisualStudio><UserProperties XamarinHotReloadDebuggerTimeoutExceptionCometSingleProjectSampleHideInfoBar="True" /></VisualStudio></ProjectExtensions>
|
<ProjectExtensions><VisualStudio><UserProperties XamarinHotReloadDebuggerTimeoutExceptionCometSingleProjectSampleHideInfoBar="True" /></VisualStudio></ProjectExtensions>
|
||||||
</Project>
|
</Project>
|
|
@ -5,6 +5,4 @@
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<Import Project="../../External/Maui/Directory.Build.props" />
|
<Import Project="../../External/Maui/Directory.Build.props" />
|
||||||
|
|
||||||
<Import Project="../../External/Maui/src/Maui.InTree.props"/>
|
|
||||||
|
|
||||||
</Project>
|
</Project>
|
|
@ -1,4 +1,5 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<Project>
|
<Project>
|
||||||
<Import Project="../../External/Maui/src/Maui.InTree.targets"/>
|
<Import Project="../../External/Maui/src/Maui.InTree.targets"/>
|
||||||
|
<Import Project="../../External/Maui/Directory.Build.targets" />
|
||||||
</Project>
|
</Project>
|
|
@ -1,7 +1,6 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<Project>
|
<Project>
|
||||||
<Import Project="..\External\Maui\eng\AndroidX.targets" />
|
<Import Project="..\External\Maui\eng\AndroidX.targets" />
|
||||||
<Import Project="..\External\Maui\eng\Versions.props" />
|
|
||||||
<Import Project="..\External\Maui\eng\Microsoft.Extensions.targets" />
|
<Import Project="..\External\Maui\eng\Microsoft.Extensions.targets" />
|
||||||
<Import Project="..\Directory.Build.targets" />
|
<Import Project="..\Directory.Build.targets" />
|
||||||
</Project>
|
</Project>
|
|
@ -7,7 +7,11 @@ namespace Comet
|
||||||
{
|
{
|
||||||
public static class AnimationExtensions
|
public static class AnimationExtensions
|
||||||
{
|
{
|
||||||
|
public static FrameConstraints Lerp(this FrameConstraints start, FrameConstraints end, double progress)
|
||||||
|
=> new FrameConstraints(
|
||||||
|
start.Width.Lerp(end.Width, progress),
|
||||||
|
start.Height.Lerp(end.Height, progress)
|
||||||
|
);
|
||||||
public static T Animate<T>(this T view, Action<T> action, Action completed = null, double duration = .2, double delay = 0, bool repeats = false, bool autoReverses = false, string id = null, Lerp lerp = null)
|
public static T Animate<T>(this T view, Action<T> action, Action completed = null, double duration = .2, double delay = 0, bool repeats = false, bool autoReverses = false, string id = null, Lerp lerp = null)
|
||||||
where T : View => view.Animate(Easing.Default, action, completed, duration, delay, repeats, autoReverses, id, lerp);
|
where T : View => view.Animate(Easing.Default, action, completed, duration, delay, repeats, autoReverses, id, lerp);
|
||||||
|
|
||||||
|
|
|
@ -4,6 +4,7 @@ using Comet.Handlers;
|
||||||
using Microsoft.Extensions.DependencyInjection;
|
using Microsoft.Extensions.DependencyInjection;
|
||||||
using Microsoft.Extensions.DependencyInjection.Extensions;
|
using Microsoft.Extensions.DependencyInjection.Extensions;
|
||||||
using Microsoft.Maui;
|
using Microsoft.Maui;
|
||||||
|
using Microsoft.Maui.Animations;
|
||||||
using Microsoft.Maui.ApplicationModel;
|
using Microsoft.Maui.ApplicationModel;
|
||||||
using Microsoft.Maui.Devices;
|
using Microsoft.Maui.Devices;
|
||||||
using Microsoft.Maui.Handlers;
|
using Microsoft.Maui.Handlers;
|
||||||
|
@ -37,6 +38,14 @@ namespace Comet
|
||||||
ViewHandler.ViewMapper.AppendToMapping(nameof(IGestureView.Gestures), CometViewHandler.AddGestures);
|
ViewHandler.ViewMapper.AppendToMapping(nameof(IGestureView.Gestures), CometViewHandler.AddGestures);
|
||||||
ViewHandler.ViewCommandMapper.AppendToMapping(Gesture.AddGestureProperty, CometViewHandler.AddGesture);
|
ViewHandler.ViewCommandMapper.AppendToMapping(Gesture.AddGestureProperty, CometViewHandler.AddGesture);
|
||||||
ViewHandler.ViewCommandMapper.AppendToMapping(Gesture.AddGestureProperty, CometViewHandler.RemoveGesture);
|
ViewHandler.ViewCommandMapper.AppendToMapping(Gesture.AddGestureProperty, CometViewHandler.RemoveGesture);
|
||||||
|
Lerp.Lerps[typeof(FrameConstraints)] = new Lerp
|
||||||
|
{
|
||||||
|
Calculate = (s, e, progress) => {
|
||||||
|
var start = (FrameConstraints)s;
|
||||||
|
var end = (FrameConstraints)(e);
|
||||||
|
return start.Lerp(end, progress);
|
||||||
|
}
|
||||||
|
};
|
||||||
builder.ConfigureMauiHandlers((handlersCollection) => handlersCollection.AddHandlers(new Dictionary<Type, Type>
|
builder.ConfigureMauiHandlers((handlersCollection) => handlersCollection.AddHandlers(new Dictionary<Type, Type>
|
||||||
{
|
{
|
||||||
{ typeof(AbstractLayout), typeof(LayoutHandler) },
|
{ typeof(AbstractLayout), typeof(LayoutHandler) },
|
||||||
|
|
|
@ -47,7 +47,7 @@ namespace Comet
|
||||||
Size lastMeasureSize;
|
Size lastMeasureSize;
|
||||||
public override Size GetDesiredSize(Size availableSize)
|
public override Size GetDesiredSize(Size availableSize)
|
||||||
{
|
{
|
||||||
if (this.IsMeasureValid && availableSize == lastMeasureSize)
|
if (MeasurementValid && availableSize == lastMeasureSize)
|
||||||
return MeasuredSize;
|
return MeasuredSize;
|
||||||
lastMeasureSize = availableSize;
|
lastMeasureSize = availableSize;
|
||||||
var frameConstraints = this.GetFrameConstraints();
|
var frameConstraints = this.GetFrameConstraints();
|
||||||
|
|
|
@ -21,7 +21,7 @@ using Microsoft.Maui.Primitives;
|
||||||
namespace Comet
|
namespace Comet
|
||||||
{
|
{
|
||||||
|
|
||||||
public class View : ContextualObject, IDisposable, IView, IHotReloadableView,ISafeAreaView, IContentTypeHash, IAnimator, ITitledElement, IGestureView, IBorder, IVisualTreeElement
|
public class View : ContextualObject, IDisposable, IView, IHotReloadableView, ISafeAreaView, IContentTypeHash, IAnimator, ITitledElement, IGestureView, IBorder, IVisualTreeElement
|
||||||
{
|
{
|
||||||
static internal readonly WeakList<IView> ActiveViews = new WeakList<IView>();
|
static internal readonly WeakList<IView> ActiveViews = new WeakList<IView>();
|
||||||
HashSet<(string Field, string Key)> usedEnvironmentData = new HashSet<(string Field, string Key)>();
|
HashSet<(string Field, string Key)> usedEnvironmentData = new HashSet<(string Field, string Key)>();
|
||||||
|
@ -34,6 +34,17 @@ namespace Comet
|
||||||
[EnvironmentKeys.Fonts.Weight] = nameof(IText.Font),
|
[EnvironmentKeys.Fonts.Weight] = nameof(IText.Font),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
protected static HashSet<string> PropertiesThatTriggerLayout = new()
|
||||||
|
{
|
||||||
|
nameof(IText.Font),
|
||||||
|
nameof(IText.Text),
|
||||||
|
nameof(IView.MinimumHeight),
|
||||||
|
nameof(IView.MaximumHeight),
|
||||||
|
nameof(IView.MinimumWidth),
|
||||||
|
nameof(IView.MaximumWidth),
|
||||||
|
nameof(IImageSourcePart.Source),
|
||||||
|
};
|
||||||
|
|
||||||
IReloadHandler reloadHandler;
|
IReloadHandler reloadHandler;
|
||||||
public IReloadHandler ReloadHandler
|
public IReloadHandler ReloadHandler
|
||||||
{
|
{
|
||||||
|
@ -313,7 +324,7 @@ namespace Comet
|
||||||
else
|
else
|
||||||
ViewPropertyChanged(prop, value);
|
ViewPropertyChanged(prop, value);
|
||||||
}
|
}
|
||||||
catch(Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
Logger.Error(ex);
|
Logger.Error(ex);
|
||||||
}
|
}
|
||||||
|
@ -339,11 +350,18 @@ namespace Comet
|
||||||
var newPropName = GetHandlerPropertyName(property);
|
var newPropName = GetHandlerPropertyName(property);
|
||||||
ViewHandler?.UpdateValue(newPropName);
|
ViewHandler?.UpdateValue(newPropName);
|
||||||
builtView?.ViewPropertyChanged(property, value);
|
builtView?.ViewPropertyChanged(property, value);
|
||||||
|
if (measurementValid && PropertyChangeShouldTriggerLayout(newPropName))
|
||||||
|
{
|
||||||
|
this.InvalidateMeasurement();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected virtual string GetHandlerPropertyName(string property) =>
|
protected virtual string GetHandlerPropertyName(string property) =>
|
||||||
HandlerPropertyMapper.TryGetValue(property, out var value) ? value : property;
|
HandlerPropertyMapper.TryGetValue(property, out var value) ? value : property;
|
||||||
|
|
||||||
|
protected virtual bool PropertyChangeShouldTriggerLayout(string property) =>
|
||||||
|
PropertiesThatTriggerLayout.Contains(property);
|
||||||
|
|
||||||
|
|
||||||
internal override void ContextPropertyChanged(string property, object value, bool cascades)
|
internal override void ContextPropertyChanged(string property, object value, bool cascades)
|
||||||
{
|
{
|
||||||
|
@ -530,6 +548,7 @@ namespace Comet
|
||||||
|
|
||||||
public void InvalidateMeasurement()
|
public void InvalidateMeasurement()
|
||||||
{
|
{
|
||||||
|
lastAvailableSize = Size.Zero;
|
||||||
MeasurementValid = false;
|
MeasurementValid = false;
|
||||||
(Parent as IView)?.InvalidateMeasure();
|
(Parent as IView)?.InvalidateMeasure();
|
||||||
}
|
}
|
||||||
|
@ -549,7 +568,7 @@ namespace Comet
|
||||||
{
|
{
|
||||||
if (BuiltView != null)
|
if (BuiltView != null)
|
||||||
return BuiltView.GetDesiredSize(availableSize);
|
return BuiltView.GetDesiredSize(availableSize);
|
||||||
if (!IsMeasureValid || lastAvailableSize != availableSize)
|
if (!MeasurementValid || lastAvailableSize != availableSize)
|
||||||
{
|
{
|
||||||
var frameConstraints = this.GetFrameConstraints();
|
var frameConstraints = this.GetFrameConstraints();
|
||||||
var margins = this.GetMargin();
|
var margins = this.GetMargin();
|
||||||
|
@ -557,7 +576,7 @@ namespace Comet
|
||||||
if (frameConstraints?.Height > 0 && frameConstraints?.Width > 0)
|
if (frameConstraints?.Height > 0 && frameConstraints?.Width > 0)
|
||||||
return new Size(frameConstraints.Width.Value, frameConstraints.Height.Value);
|
return new Size(frameConstraints.Width.Value, frameConstraints.Height.Value);
|
||||||
var ms = this.ComputeDesiredSize(availableSize.Width, availableSize.Height);
|
var ms = this.ComputeDesiredSize(availableSize.Width, availableSize.Height);
|
||||||
if(frameConstraints?.Width > 0)
|
if (frameConstraints?.Width > 0)
|
||||||
ms.Width = frameConstraints.Width.Value;
|
ms.Width = frameConstraints.Width.Value;
|
||||||
if (frameConstraints?.Height > 0)
|
if (frameConstraints?.Height > 0)
|
||||||
ms.Height = frameConstraints.Height.Value;
|
ms.Height = frameConstraints.Height.Value;
|
||||||
|
@ -566,7 +585,7 @@ namespace Comet
|
||||||
ms.Height += margins.HorizontalThickness;
|
ms.Height += margins.HorizontalThickness;
|
||||||
MeasuredSize = ms;
|
MeasuredSize = ms;
|
||||||
}
|
}
|
||||||
IsMeasureValid = this.ViewHandler != null;
|
MeasurementValid = this.ViewHandler != null;
|
||||||
return MeasuredSize;
|
return MeasuredSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -579,7 +598,7 @@ namespace Comet
|
||||||
return MeasuredSize = BuiltView.Measure(widthConstraint, heightConstraint);
|
return MeasuredSize = BuiltView.Measure(widthConstraint, heightConstraint);
|
||||||
|
|
||||||
var availableSize = new Size(widthConstraint, heightConstraint);
|
var availableSize = new Size(widthConstraint, heightConstraint);
|
||||||
if (!IsMeasureValid || availableSize != lastAvailableSize)
|
if (!MeasurementValid || availableSize != lastAvailableSize)
|
||||||
{
|
{
|
||||||
MeasuredSize = GetDesiredSize(new Size(widthConstraint, heightConstraint));
|
MeasuredSize = GetDesiredSize(new Size(widthConstraint, heightConstraint));
|
||||||
if (ViewHandler != null)
|
if (ViewHandler != null)
|
||||||
|
@ -590,7 +609,7 @@ namespace Comet
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
IsMeasureValid = ViewHandler != null;
|
MeasurementValid = ViewHandler != null;
|
||||||
return MeasuredSize;
|
return MeasuredSize;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -698,11 +717,6 @@ namespace Comet
|
||||||
|
|
||||||
Size IView.DesiredSize => MeasuredSize;
|
Size IView.DesiredSize => MeasuredSize;
|
||||||
|
|
||||||
protected bool IsMeasureValid;
|
|
||||||
//bool IView.IsMeasureValid => IsMeasureValid;
|
|
||||||
|
|
||||||
protected bool IsArrangeValid;
|
|
||||||
//bool IView.IsArrangeValid => IsArrangeValid;
|
|
||||||
|
|
||||||
double IView.Width => this.GetFrameConstraints()?.Width ?? Dimension.Unset;
|
double IView.Width => this.GetFrameConstraints()?.Width ?? Dimension.Unset;
|
||||||
double IView.Height => this.GetFrameConstraints()?.Height ?? Dimension.Unset;
|
double IView.Height => this.GetFrameConstraints()?.Height ?? Dimension.Unset;
|
||||||
|
@ -779,7 +793,7 @@ namespace Comet
|
||||||
//Measure(new Size(widthConstraint, heightConstraint));
|
//Measure(new Size(widthConstraint, heightConstraint));
|
||||||
Measure(widthConstraint, heightConstraint);
|
Measure(widthConstraint, heightConstraint);
|
||||||
void IView.InvalidateMeasure() => InvalidateMeasurement();
|
void IView.InvalidateMeasure() => InvalidateMeasurement();
|
||||||
void IView.InvalidateArrange() => IsArrangeValid = false;
|
void IView.InvalidateArrange() {}
|
||||||
void IHotReloadableView.TransferState(IView newView) {
|
void IHotReloadableView.TransferState(IView newView) {
|
||||||
var oldState = this.GetState();
|
var oldState = this.GetState();
|
||||||
if (oldState == null)
|
if (oldState == null)
|
||||||
|
|
Загрузка…
Ссылка в новой задаче