118 lines
3.6 KiB
C#
118 lines
3.6 KiB
C#
using System;
|
|
using System.Threading.Tasks;
|
|
using Avalonia;
|
|
using Avalonia.Animation;
|
|
using Avalonia.Animation.Easings;
|
|
using Avalonia.Controls;
|
|
using Avalonia.Media;
|
|
using Avalonia.Styling;
|
|
using Clario.Models;
|
|
|
|
namespace Clario.MobileViews;
|
|
|
|
public partial class AccountsViewMobile : UserControl
|
|
{
|
|
private bool _sheetVisible = false;
|
|
|
|
private TranslateTransform SheetTranslate =>
|
|
(TranslateTransform)BottomSheet.RenderTransform!;
|
|
|
|
public AccountsViewMobile()
|
|
{
|
|
InitializeComponent();
|
|
|
|
DimOverlay.PointerPressed += async (_, _) => await HideSheet();
|
|
CloseButton.Click += async (_, _) => await HideSheet();
|
|
|
|
AddHandler(Button.ClickEvent, async (sender, e) =>
|
|
{
|
|
if (e.Source is Button { DataContext: Account }) await ShowSheet();
|
|
}, handledEventsToo: false);
|
|
}
|
|
|
|
protected override void OnAttachedToVisualTree(VisualTreeAttachmentEventArgs e)
|
|
{
|
|
base.OnAttachedToVisualTree(e);
|
|
BottomSheet.MaxHeight = Bounds.Height * 0.82;
|
|
|
|
// update if screen size changes
|
|
PropertyChanged += (_, args) =>
|
|
{
|
|
if (args.Property == BoundsProperty)
|
|
BottomSheet.MaxHeight = Bounds.Height * 0.82;
|
|
};
|
|
}
|
|
|
|
public async Task ShowSheet()
|
|
{
|
|
if (_sheetVisible) return;
|
|
_sheetVisible = true;
|
|
|
|
OverlayGrid.IsVisible = true;
|
|
DimOverlay.Opacity = 0;
|
|
SheetTranslate.Y = 800;
|
|
|
|
var sheetAnim = new Animation
|
|
{
|
|
Duration = TimeSpan.FromMilliseconds(320),
|
|
Easing = new CubicEaseOut(),
|
|
FillMode = FillMode.Forward,
|
|
Children =
|
|
{
|
|
new KeyFrame { Cue = new Cue(0d), Setters = { new Setter(TranslateTransform.YProperty, 800d) } },
|
|
new KeyFrame { Cue = new Cue(1d), Setters = { new Setter(TranslateTransform.YProperty, 0d) } }
|
|
}
|
|
};
|
|
|
|
var dimAnim = new Animation
|
|
{
|
|
Duration = TimeSpan.FromMilliseconds(220),
|
|
FillMode = FillMode.Forward,
|
|
Children =
|
|
{
|
|
new KeyFrame { Cue = new Cue(0d), Setters = { new Setter(OpacityProperty, 0d) } },
|
|
new KeyFrame { Cue = new Cue(1d), Setters = { new Setter(OpacityProperty, 1d) } }
|
|
}
|
|
};
|
|
|
|
await Task.WhenAll(sheetAnim.RunAsync(BottomSheet), dimAnim.RunAsync(DimOverlay));
|
|
|
|
SheetTranslate.Y = 0;
|
|
DimOverlay.Opacity = 1;
|
|
}
|
|
|
|
public async Task HideSheet()
|
|
{
|
|
if (!_sheetVisible) return;
|
|
|
|
var sheetAnim = new Animation
|
|
{
|
|
Duration = TimeSpan.FromMilliseconds(260),
|
|
Easing = new CubicEaseIn(),
|
|
FillMode = FillMode.Forward,
|
|
Children =
|
|
{
|
|
new KeyFrame { Cue = new Cue(0d), Setters = { new Setter(TranslateTransform.YProperty, 0d) } },
|
|
new KeyFrame { Cue = new Cue(1d), Setters = { new Setter(TranslateTransform.YProperty, 800d) } }
|
|
}
|
|
};
|
|
|
|
var dimAnim = new Animation
|
|
{
|
|
Duration = TimeSpan.FromMilliseconds(200),
|
|
FillMode = FillMode.Forward,
|
|
Children =
|
|
{
|
|
new KeyFrame { Cue = new Cue(0d), Setters = { new Setter(OpacityProperty, 1d) } },
|
|
new KeyFrame { Cue = new Cue(1d), Setters = { new Setter(OpacityProperty, 0d) } }
|
|
}
|
|
};
|
|
|
|
await Task.WhenAll(sheetAnim.RunAsync(BottomSheet), dimAnim.RunAsync(DimOverlay));
|
|
|
|
_sheetVisible = false;
|
|
OverlayGrid.IsVisible = false;
|
|
SheetTranslate.Y = 0;
|
|
DimOverlay.Opacity = 1;
|
|
}
|
|
} |