implement the full statemachine for the music box.
MODIFY
WalletWasabi.Fluent.Desktop/WalletWasabi.Fluent.Desktop.csproj
WalletWasabi.Fluent.Desktop/WalletWasabi.Fluent.Desktop.csproj
<PackageIcon>Assets\WasabiLogo.ico</PackageIcon>
<Product>Wasabi Wallet Fluent</Product>
<!-- owners is not supported in MSBuild -->
- <AvaloniaVersion>0.10.999-cibuild0018748-beta</AvaloniaVersion>
+ <AvaloniaVersion>0.10.999-cibuild0018773-beta</AvaloniaVersion>
</PropertyGroup>
<ItemGroup>

MODIFY
WalletWasabi.Fluent.Desktop/packages.lock.json
WalletWasabi.Fluent.Desktop/packages.lock.json
"net6.0": {
"Avalonia.Desktop": {
"type": "Direct",
- "requested": "[0.10.999-cibuild0018748-beta, )",
- "resolved": "0.10.999-cibuild0018748-beta",
- "contentHash": "GDK/7elbfC64a9q+64pIHHqy9+lPj8uZorAeKtkTseq8p0Ov3D6ow3jf+KEGG1Oj6KkrUj8jVTgv/tgHeKWMKA==",
+ "requested": "[0.10.999-cibuild0018773-beta, )",
+ "resolved": "0.10.999-cibuild0018773-beta",
+ "contentHash": "OOlplc0ftHahrKssdQgzKrUDxTw6Utnm5kDBIgvmByv3PrsYrYJdtvtX/pvHwuCGkPr4MdxPwXiWsEP5qcQrvw==",
"dependencies": {
- "Avalonia": "0.10.999-cibuild0018748-beta",
- "Avalonia.Native": "0.10.999-cibuild0018748-beta",
- "Avalonia.Skia": "0.10.999-cibuild0018748-beta",
- "Avalonia.Win32": "0.10.999-cibuild0018748-beta",
- "Avalonia.X11": "0.10.999-cibuild0018748-beta"
+ "Avalonia": "0.10.999-cibuild0018773-beta",
+ "Avalonia.Native": "0.10.999-cibuild0018773-beta",
+ "Avalonia.Skia": "0.10.999-cibuild0018773-beta",
+ "Avalonia.Win32": "0.10.999-cibuild0018773-beta",
+ "Avalonia.X11": "0.10.999-cibuild0018773-beta"
}
},
"Avalonia.ReactiveUI": {
"type": "Direct",
- "requested": "[0.10.999-cibuild0018748-beta, )",
- "resolved": "0.10.999-cibuild0018748-beta",
- "contentHash": "AJrWGDhMA8lYWE48dRuKD7UXSUwP1R3a6ZgRJLRh7cKCj5uQy5ki11VWyvBiueIEpUt+gv/Plh3+a6g9UmoCQw==",
+ "requested": "[0.10.999-cibuild0018773-beta, )",
+ "resolved": "0.10.999-cibuild0018773-beta",
+ "contentHash": "2VyHzAc7QCLtCfGXQoHJ2eYWzCBXsJj3YRVe5xLvKuPd6ybEbfyAPaeH0PVdPb23ScvSSylxkazpXAdAOIQcvQ==",
"dependencies": {
- "Avalonia": "0.10.999-cibuild0018748-beta",
+ "Avalonia": "0.10.999-cibuild0018773-beta",
"ReactiveUI": "13.2.10",
"System.Reactive": "5.0.0"
}
},
"Avalonia": {
"type": "Transitive",
- "resolved": "0.10.999-cibuild0018748-beta",
- "contentHash": "tjK222A10u1vaTd2tQVEZDlkg7elTgCcKs7vLWfMbdNL3Dq627WLeKRIttnjCRgVWNX5CvYUwptd6YKu89v2hA==",
+ "resolved": "0.10.999-cibuild0018773-beta",
+ "contentHash": "Q8YzWarWilV7fCWFbqSuxBBGbCmyJ+foUZZgOKXno39NVP4gBMb4KF6gIdayma/kWywsAuh+cgcHQPvWLyLRHQ==",
"dependencies": {
- "Avalonia.Remote.Protocol": "0.10.999-cibuild0018748-beta",
+ "Avalonia.Remote.Protocol": "0.10.999-cibuild0018773-beta",
"JetBrains.Annotations": "10.3.0",
"System.ComponentModel.Annotations": "4.5.0",
"System.Memory": "4.5.3",
},
"Avalonia.Controls.DataGrid": {
"type": "Transitive",
- "resolved": "0.10.999-cibuild0018748-beta",
- "contentHash": "iks0QhJAzwvPcjpxwdfJw+wJzGLQzVRY+N3oXEoG1k8+qt6VtAlUnhoL1XiFvYmTwpkoLB8zpJ/exuPZXew1Bw==",
+ "resolved": "0.10.999-cibuild0018773-beta",
+ "contentHash": "KxiHVIh/vv0j+QZre3pD7I/sPUKyTbtxWS1FsplVvfk6E3HHF/8ipGanSBQKMv1mPvOABLGZb7UBZPxV9wtVlQ==",
"dependencies": {
- "Avalonia": "0.10.999-cibuild0018748-beta",
- "Avalonia.Remote.Protocol": "0.10.999-cibuild0018748-beta",
+ "Avalonia": "0.10.999-cibuild0018773-beta",
+ "Avalonia.Remote.Protocol": "0.10.999-cibuild0018773-beta",
"JetBrains.Annotations": "10.3.0",
"System.Reactive": "5.0.0"
}
},
"Avalonia.Diagnostics": {
"type": "Transitive",
- "resolved": "0.10.999-cibuild0018748-beta",
- "contentHash": "U0BSJKRL1M4sVVg2AcOLYlGhyNKu8RK7CaBteHUerF46U4XZnVnxUxGJT4kdsTBZ4yBrD1RSLBKuoKZRkogXtA==",
+ "resolved": "0.10.999-cibuild0018773-beta",
+ "contentHash": "kajoPdw16Ln/PZK3sBEdHxOfVB92KEQ26qcOX+a+DpJErRB9B4VSR0tPtFMllzNpC4SIyFmknLxqBaciToW1IA==",
"dependencies": {
- "Avalonia": "0.10.999-cibuild0018748-beta",
- "Avalonia.Controls.DataGrid": "0.10.999-cibuild0018748-beta",
+ "Avalonia": "0.10.999-cibuild0018773-beta",
+ "Avalonia.Controls.DataGrid": "0.10.999-cibuild0018773-beta",
"Microsoft.CodeAnalysis.CSharp.Scripting": "3.4.0",
"System.Reactive": "5.0.0"
}
},
"Avalonia.FreeDesktop": {
"type": "Transitive",
- "resolved": "0.10.999-cibuild0018748-beta",
- "contentHash": "eRgF1qYghig30aU9H+tSJqaGJ0FJKiBOVnFjZjiwqpi69B5MGosB6mPepyqwDubIo6EgR7N5IG5Hqg0Fk5W6PQ==",
+ "resolved": "0.10.999-cibuild0018773-beta",
+ "contentHash": "ainRzXr4Dxw7tmXnLafp7pfUDLAD0XE37mz+PzgpkFyxv8HWbew9oJyFouPPBWFDTFOn19nBJW084Kxlke3Erw==",
"dependencies": {
- "Avalonia": "0.10.999-cibuild0018748-beta",
+ "Avalonia": "0.10.999-cibuild0018773-beta",
"Tmds.DBus": "0.9.0"
}
},
"Avalonia.Native": {
"type": "Transitive",
- "resolved": "0.10.999-cibuild0018748-beta",
- "contentHash": "J3La+n3OX8j07OzDBrM6amaU93kNfusiKdv9Gdl6/2AvJV+2YU862bRqLi4HUw2b368qky6gL+TXrPTnczPy2Q==",
+ "resolved": "0.10.999-cibuild0018773-beta",
+ "contentHash": "LY2q3YCyun5ET0a9ybS5CnG8tIJqambiFtvmWChnFdMzd/YFv4E6agMmP/Wkl8ZjwUDa+OKT51msINih3/YiFw==",
"dependencies": {
- "Avalonia": "0.10.999-cibuild0018748-beta"
+ "Avalonia": "0.10.999-cibuild0018773-beta"
}
},
"Avalonia.Remote.Protocol": {
"type": "Transitive",
- "resolved": "0.10.999-cibuild0018748-beta",
- "contentHash": "BUemvNsHJ90RJjLHCXIHhjTc0bWVsgZPXmQ+lZFpyh8Gb48+Fs02511xKKmRtlWDNYS9EjWU5Em76gxoPaquQw=="
+ "resolved": "0.10.999-cibuild0018773-beta",
+ "contentHash": "dCfvCQCQ48b83qpJfnD21FhxrMM4w+U3OU3YKr5xxd+H2aw9lro88KP4Ix6CPdMlzo9eHImdzxo9Dxc68DZ6gg=="
},
"Avalonia.Skia": {
"type": "Transitive",
- "resolved": "0.10.999-cibuild0018748-beta",
- "contentHash": "WfDVEui0Zg/MvvPQph/McHmiCWwIx7tnu2CtlgBVvNd+LL82Xljt0UAAH/UjQfmL/mExhu4Quc/KKomHLqsc+A==",
+ "resolved": "0.10.999-cibuild0018773-beta",
+ "contentHash": "jf8BT9Ne4hhmw6vruabikBssC5Nl/i35gXEdsaSEg/Pu1iPzMUDgG+ZHd76UgiUk7SrYrQqFopKY9kEIiZwK/A==",
"dependencies": {
- "Avalonia": "0.10.999-cibuild0018748-beta",
+ "Avalonia": "0.10.999-cibuild0018773-beta",
"HarfBuzzSharp": "2.8.2-preview.178",
"HarfBuzzSharp.NativeAssets.Linux": "2.8.2-preview.178",
"HarfBuzzSharp.NativeAssets.WebAssembly": "2.8.2-preview.178",
},
"Avalonia.Win32": {
"type": "Transitive",
- "resolved": "0.10.999-cibuild0018748-beta",
- "contentHash": "Cuf+qcFRXpgK2xDUgh1Dqp3wF1HSjEmh++JNh9MWGGV9KXWCAG+yXiGGvDiko3YSBsujaFY1oCuth0NUjZf7sg==",
+ "resolved": "0.10.999-cibuild0018773-beta",
+ "contentHash": "jMc4X2Oi8hGcy4ijG7Tb3IRBeKzi7DDOmf+to+AhHYo8tTXuwo6izlwufolhSidM4IF/1pwNwmVz+HGpPGsD3g==",
"dependencies": {
- "Avalonia": "0.10.999-cibuild0018748-beta",
+ "Avalonia": "0.10.999-cibuild0018773-beta",
"Avalonia.Angle.Windows.Natives": "2.1.0.2020091801",
"System.Drawing.Common": "4.5.0",
"System.Numerics.Vectors": "4.5.0"
},
"Avalonia.X11": {
"type": "Transitive",
- "resolved": "0.10.999-cibuild0018748-beta",
- "contentHash": "9doMtGQqOR3BUs/jZUVU3H6RNHGDMaWJomiIcO02SNNq6WWweviL5wXCfgURvLWPApa/GMll+O12G8b954WFqw==",
+ "resolved": "0.10.999-cibuild0018773-beta",
+ "contentHash": "5AIwIZ1aOUPVP8j/gbd3petVD/P/IZ/nmTEcCFYpPTmhGNGhV6EknFcTrkXAnNdkaaUxW7j1xTmpZzqKtExbNQ==",
"dependencies": {
- "Avalonia": "0.10.999-cibuild0018748-beta",
- "Avalonia.FreeDesktop": "0.10.999-cibuild0018748-beta",
- "Avalonia.Skia": "0.10.999-cibuild0018748-beta"
+ "Avalonia": "0.10.999-cibuild0018773-beta",
+ "Avalonia.FreeDesktop": "0.10.999-cibuild0018773-beta",
+ "Avalonia.Skia": "0.10.999-cibuild0018773-beta"
}
},
"Avalonia.Xaml.Behaviors": {
"resolved": "10.0.1",
"contentHash": "N8BMGVuUBnVLAHSVbna/st8XiLd8ulF3BfkKUSGCPqYpDCis3ELvM+aFaZQLBUIBEcweCYVLq3HFEBqHkCKFyA=="
},
+ "stateless": {
+ "type": "Transitive",
+ "resolved": "5.11.0",
+ "contentHash": "5XXmdEQBOpgE90vqxfZH0ekdqfGB6xLe0Uyb7EyHr/fgv/zkZtDcru4KxRvAvWxE1u4c8MOZnOnXoRfQOfFnTg=="
+ },
"System.Collections": {
"type": "Transitive",
"resolved": "4.0.11",
"walletwasabi.fluent": {
"type": "Project",
"dependencies": {
- "Avalonia": "0.10.999-cibuild0018748-beta",
- "Avalonia.Controls.DataGrid": "0.10.999-cibuild0018748-beta",
- "Avalonia.Diagnostics": "0.10.999-cibuild0018748-beta",
- "Avalonia.ReactiveUI": "0.10.999-cibuild0018748-beta",
- "Avalonia.Skia": "0.10.999-cibuild0018748-beta",
+ "Avalonia": "0.10.999-cibuild0018773-beta",
+ "Avalonia.Controls.DataGrid": "0.10.999-cibuild0018773-beta",
+ "Avalonia.Diagnostics": "0.10.999-cibuild0018773-beta",
+ "Avalonia.ReactiveUI": "0.10.999-cibuild0018773-beta",
+ "Avalonia.Skia": "0.10.999-cibuild0018773-beta",
"Avalonia.Xaml.Behaviors": "0.10.11.5",
"DataBox": "0.10.11.1",
"System.Drawing.Common": "6.0.0",
"System.Reactive": "5.0.0",
"System.Runtime": "4.3.1",
- "WalletWasabi": "1.0.0"
+ "WalletWasabi": "1.0.0",
+ "stateless": "5.11.0"
}
}
},
},
"Avalonia.Native": {
"type": "Transitive",
- "resolved": "0.10.999-cibuild0018748-beta",
- "contentHash": "J3La+n3OX8j07OzDBrM6amaU93kNfusiKdv9Gdl6/2AvJV+2YU862bRqLi4HUw2b368qky6gL+TXrPTnczPy2Q==",
+ "resolved": "0.10.999-cibuild0018773-beta",
+ "contentHash": "LY2q3YCyun5ET0a9ybS5CnG8tIJqambiFtvmWChnFdMzd/YFv4E6agMmP/Wkl8ZjwUDa+OKT51msINih3/YiFw==",
"dependencies": {
- "Avalonia": "0.10.999-cibuild0018748-beta"
+ "Avalonia": "0.10.999-cibuild0018773-beta"
}
},
"HarfBuzzSharp.NativeAssets.Linux": {
},
"Avalonia.Native": {
"type": "Transitive",
- "resolved": "0.10.999-cibuild0018748-beta",
- "contentHash": "J3La+n3OX8j07OzDBrM6amaU93kNfusiKdv9Gdl6/2AvJV+2YU862bRqLi4HUw2b368qky6gL+TXrPTnczPy2Q==",
+ "resolved": "0.10.999-cibuild0018773-beta",
+ "contentHash": "LY2q3YCyun5ET0a9ybS5CnG8tIJqambiFtvmWChnFdMzd/YFv4E6agMmP/Wkl8ZjwUDa+OKT51msINih3/YiFw==",
"dependencies": {
- "Avalonia": "0.10.999-cibuild0018748-beta"
+ "Avalonia": "0.10.999-cibuild0018773-beta"
}
},
"HarfBuzzSharp.NativeAssets.Linux": {
},
"Avalonia.Native": {
"type": "Transitive",
- "resolved": "0.10.999-cibuild0018748-beta",
- "contentHash": "J3La+n3OX8j07OzDBrM6amaU93kNfusiKdv9Gdl6/2AvJV+2YU862bRqLi4HUw2b368qky6gL+TXrPTnczPy2Q==",
+ "resolved": "0.10.999-cibuild0018773-beta",
+ "contentHash": "LY2q3YCyun5ET0a9ybS5CnG8tIJqambiFtvmWChnFdMzd/YFv4E6agMmP/Wkl8ZjwUDa+OKT51msINih3/YiFw==",
"dependencies": {
- "Avalonia": "0.10.999-cibuild0018748-beta"
+ "Avalonia": "0.10.999-cibuild0018773-beta"
}
},
"HarfBuzzSharp.NativeAssets.Linux": {

MODIFY
WalletWasabi.Fluent/ViewModels/Wallets/MusicControlsViewModel.cs
WalletWasabi.Fluent/ViewModels/Wallets/MusicControlsViewModel.cs
@@ -5,77 +5,29 @@ using System.Windows.Input;
using ReactiveUI;
using WalletWasabi.WabiSabi.Client;
using WalletWasabi.WabiSabi.Models;
-using WalletWasabi.Wallets;
namespace WalletWasabi.Fluent.ViewModels.Wallets;
-public enum CoinJoinUIState
-{
- Stopped,
- AutoStart,
- Starting,
- Started,
- Pausing,
- Paused,
- Stopping,
-}
-
public partial class MusicControlsViewModel : ViewModelBase
{
- [AutoNotify (SetterModifier = AccessModifier.Private)] private bool _isActive;
+ [AutoNotify(SetterModifier = AccessModifier.Private)]
+ private bool _isActive;
+
[AutoNotify] private TimeSpan _autoStartCountdown;
- [AutoNotify] private string? _currentStatus;
[AutoNotify] private string? _countDown;
[AutoNotify] private bool _playVisible = true;
[AutoNotify] private bool _pauseVisible;
[AutoNotify] private bool _stopVisible;
private CoinJoinManager? _coinJoinManager;
- private Wallet? _currentWallet;
- private CoinJoinUIState _currentState;
-
- public MusicControlsViewModel()
- {
- _currentState = CoinJoinUIState.Stopped;
-
- Observable.Interval(TimeSpan.FromSeconds(1))
- .ObserveOn(RxApp.MainThreadScheduler)
- .Subscribe(x => UpdateStatus());
+ [AutoNotify] private WalletViewModel? _currentWallet;
- PlayCommand = ReactiveCommand.Create(() =>
- {
- if (_currentWallet is { })
- {
- PlayVisible = false;
- _currentWallet.AllowManualCoinJoin = true;
- _currentState = CoinJoinUIState.Starting;
-
- }
- });
-
- PauseCommand = ReactiveCommand.Create(() =>
- {
-
- });
-
- StopCommand = ReactiveCommand.Create(() =>
- {
- if (_currentWallet is { })
+ public MusicControlsViewModel()
{
- _currentWallet.AllowManualCoinJoin = false;
- _currentState = CoinJoinUIState.Stopping;
- }
- });
}
- public ICommand PlayCommand { get; }
-
- public ICommand PauseCommand { get; }
-
- public ICommand StopCommand { get; }
-
public void Initialize()
{
_coinJoinManager = Services.HostedServices.Get<CoinJoinManager>();
@@ -87,53 +39,23 @@ public partial class MusicControlsViewModel : ViewModelBase
private bool OnRoundStatusUpdated(RoundState state)
{
-
return true;
}
private void CoinJoinManagerOnWalletStatusChanged(object? sender, WalletStatusChangedEventArgs e)
{
- if (e.Wallet == _currentWallet)
+ if (e.Wallet == _currentWallet?.Wallet)
{
-
}
}
- public IDisposable SetWallet(Wallet wallet)
+ public IDisposable SetWallet(WalletViewModel wallet)
{
- _currentWallet = wallet;
-
- _currentState = CoinJoinUIState.AutoStart;
-
- UpdateStatus();
+ CurrentWallet = wallet;
IsActive = true;
- return Disposable.Create(() => IsActive = false);
- }
-
- private void UpdateStatus()
- {
- if (_currentWallet is { })
- {
- CountDown = null;
- switch (_currentState)
- {
- case CoinJoinUIState.AutoStart:
- CurrentStatus =
- $"CoinJoin will auto-start in: {(DateTime.Now - _coinJoinManager.WhenWalletCanStartAutoCoinJoin(_currentWallet)):mm\\:ss}";
-
- CountDown =
- $"{(DateTime.Now - _coinJoinManager.WhenWalletCanStartAutoCoinJoin(_currentWallet)):mm\\:ss}";
- break;
-
- case CoinJoinUIState.Starting:
- CurrentStatus =
- $"Initialising CoinJoin";
- break;
-
- }
-
- }
+ return new CompositeDisposable(
+ Disposable.Create(() => IsActive = false));
}
}
\ No newline at end of file

MODIFY
WalletWasabi.Fluent/ViewModels/Wallets/WalletViewModel.cs
WalletWasabi.Fluent/ViewModels/Wallets/WalletViewModel.cs
@@ -146,8 +146,12 @@ public partial class WalletViewModel : WalletViewModelBase
WalletSettingsCommand = ReactiveCommand.Create(() => Navigate(NavigationTarget.DialogScreen).To(Settings));
WalletCoinsCommand = ReactiveCommand.Create(() => Navigate(NavigationTarget.DialogScreen).To(new WalletCoinsViewModel(this, balanceChanged)));
+
+ CoinJoinStateViewModel = new CoinJoinStateViewModel(this);
}
+ internal CoinJoinStateViewModel CoinJoinStateViewModel { get; }
+
public WalletSettingsViewModel Settings { get; }
public ICommand SendCommand { get; }
@@ -230,7 +234,7 @@ public partial class WalletViewModel : WalletViewModelBase
{
base.OnNavigatedTo(isInHistory, disposables);
- disposables.Add(MainViewModel.Instance.MusicControls.SetWallet(Wallet));
+ disposables.Add(MainViewModel.Instance.MusicControls.SetWallet(this));
foreach (var tile in _tiles)
{

MODIFY
WalletWasabi.Fluent/Views/Wallets/MusicControlsView.axaml
WalletWasabi.Fluent/Views/Wallets/MusicControlsView.axaml
CornerRadius="4 4 0 0" BorderThickness="1 1 1 0"
Background="#19FFFFFF"
BorderBrush="#3CFFFFFF">
- <Panel >
+ <Panel DataContext="{Binding CurrentWallet.CoinJoinStateViewModel}">
<controls:BlurBehind BlurRadius="20,20"/>
<StackPanel Margin="20 10" Orientation="Horizontal" Spacing="20">
- <TransitioningContentControl Width="350" Content="{Binding CurrentStatus}" />
+ <TransitioningContentControl MinWidth="350" MaxWidth="350" Content="{Binding CurrentStatus}">
+ <TransitioningContentControl.PageTransition>
+ <CrossFade Duration="0:0:0.125" FadeInEasing="0.4,0,0.6,1" FadeOutEasing="0.4,0,0.6,1" />
+ </TransitioningContentControl.PageTransition>
+ <TransitioningContentControl.DataTemplates>
+ <DataTemplate DataType="wallets:MusicStatusMessageViewModel">
+ <TextBlock Text="{Binding Message}">
+ <TextBlock.OpacityMask>
+ <LinearGradientBrush StartPoint="100%,0%" EndPoint="80%,0%">
+ <LinearGradientBrush.GradientStops>
+ <GradientStop Color="#00FFFFFF" Offset="0.1" />
+ <GradientStop Color="#FFFFFFFF" Offset="1" />
+ </LinearGradientBrush.GradientStops>
+ </LinearGradientBrush>
+ </TextBlock.OpacityMask>
+ </TextBlock>
+ </DataTemplate>
+ </TransitioningContentControl.DataTemplates>
+ </TransitioningContentControl>
<Separator Classes="vertical" />
<Separator Classes="vertical" />
- <StackPanel VerticalAlignment="Center">
<Button Classes="plain" Command="{Binding PlayCommand}">
<PathIcon Data="{StaticResource play_regular}" />
</Button>
- <TextBlock Text="{Binding CountDown}" FontSize="8" />
- </StackPanel>
+
<Button Classes="plain" Command="{Binding PauseCommand}">
<PathIcon Data="{StaticResource pause_regular}" />
</Button>
<Button Classes="plain" Command="{Binding StopCommand}">
<PathIcon Data="{StaticResource stop_regular}" />
</Button>
+
+ <Ellipse Height="12" Width="12"
+ Classes.disabled="{Binding !IsAuto}"
+ Classes.waiting="{Binding IsAutoWaiting}">
+ <Ellipse.Styles>
+ <Style Selector="Ellipse">
+ <Setter Property="Fill" Value="{DynamicResource SystemAccentColor}" />
+ </Style>
+ <Style Selector="Ellipse.waiting">
+ <Setter Property="Fill" Value="Orange" />
+ </Style>
+ <Style Selector="Ellipse.disabled">
+ <Setter Property="Fill" Value="#7F000000" />
+ </Style>
+ </Ellipse.Styles>
+ </Ellipse>
+
</StackPanel>
</Panel>
</Border>

MODIFY
WalletWasabi.Fluent/WalletWasabi.Fluent.csproj
WalletWasabi.Fluent/WalletWasabi.Fluent.csproj
<InvariantGlobalization>true</InvariantGlobalization>
<RuntimeIdentifiers>win7-x64;linux-x64;osx-x64</RuntimeIdentifiers>
<PathMap>$(MSBuildProjectDirectory)\=WalletWasabi.Fluent</PathMap>
- <AvaloniaVersion>0.10.999-cibuild0018748-beta</AvaloniaVersion>
+ <AvaloniaVersion>0.10.999-cibuild0018773-beta</AvaloniaVersion>
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
</PropertyGroup>
<PackageReference Include="Avalonia.Diagnostics" Version="$(AvaloniaVersion)" />
<PackageReference Include="Avalonia.Xaml.Behaviors" Version="0.10.12.2" />
<PackageReference Include="Avalonia.Skia" Version="$(AvaloniaVersion)" />
+ <PackageReference Include="stateless" Version="5.11.0" />
<PackageReference Include="System.Drawing.Common" Version="6.0.0" />
<PackageReference Include="System.Reactive" Version="5.0.0" />
<PackageReference Include="System.Runtime" Version="4.3.1" />

MODIFY
WalletWasabi.Fluent/packages.lock.json
WalletWasabi.Fluent/packages.lock.json
"net6.0": {
"Avalonia": {
"type": "Direct",
- "requested": "[0.10.999-cibuild0018748-beta, )",
- "resolved": "0.10.999-cibuild0018748-beta",
- "contentHash": "tjK222A10u1vaTd2tQVEZDlkg7elTgCcKs7vLWfMbdNL3Dq627WLeKRIttnjCRgVWNX5CvYUwptd6YKu89v2hA==",
+ "requested": "[0.10.999-cibuild0018773-beta, )",
+ "resolved": "0.10.999-cibuild0018773-beta",
+ "contentHash": "Q8YzWarWilV7fCWFbqSuxBBGbCmyJ+foUZZgOKXno39NVP4gBMb4KF6gIdayma/kWywsAuh+cgcHQPvWLyLRHQ==",
"dependencies": {
- "Avalonia.Remote.Protocol": "0.10.999-cibuild0018748-beta",
+ "Avalonia.Remote.Protocol": "0.10.999-cibuild0018773-beta",
"JetBrains.Annotations": "10.3.0",
"System.ComponentModel.Annotations": "4.5.0",
"System.Memory": "4.5.3",
},
"Avalonia.Controls.DataGrid": {
"type": "Direct",
- "requested": "[0.10.999-cibuild0018748-beta, )",
- "resolved": "0.10.999-cibuild0018748-beta",
- "contentHash": "iks0QhJAzwvPcjpxwdfJw+wJzGLQzVRY+N3oXEoG1k8+qt6VtAlUnhoL1XiFvYmTwpkoLB8zpJ/exuPZXew1Bw==",
+ "requested": "[0.10.999-cibuild0018773-beta, )",
+ "resolved": "0.10.999-cibuild0018773-beta",
+ "contentHash": "KxiHVIh/vv0j+QZre3pD7I/sPUKyTbtxWS1FsplVvfk6E3HHF/8ipGanSBQKMv1mPvOABLGZb7UBZPxV9wtVlQ==",
"dependencies": {
- "Avalonia": "0.10.999-cibuild0018748-beta",
- "Avalonia.Remote.Protocol": "0.10.999-cibuild0018748-beta",
+ "Avalonia": "0.10.999-cibuild0018773-beta",
+ "Avalonia.Remote.Protocol": "0.10.999-cibuild0018773-beta",
"JetBrains.Annotations": "10.3.0",
"System.Reactive": "5.0.0"
}
},
"Avalonia.Diagnostics": {
"type": "Direct",
- "requested": "[0.10.999-cibuild0018748-beta, )",
- "resolved": "0.10.999-cibuild0018748-beta",
- "contentHash": "U0BSJKRL1M4sVVg2AcOLYlGhyNKu8RK7CaBteHUerF46U4XZnVnxUxGJT4kdsTBZ4yBrD1RSLBKuoKZRkogXtA==",
+ "requested": "[0.10.999-cibuild0018773-beta, )",
+ "resolved": "0.10.999-cibuild0018773-beta",
+ "contentHash": "kajoPdw16Ln/PZK3sBEdHxOfVB92KEQ26qcOX+a+DpJErRB9B4VSR0tPtFMllzNpC4SIyFmknLxqBaciToW1IA==",
"dependencies": {
- "Avalonia": "0.10.999-cibuild0018748-beta",
- "Avalonia.Controls.DataGrid": "0.10.999-cibuild0018748-beta",
+ "Avalonia": "0.10.999-cibuild0018773-beta",
+ "Avalonia.Controls.DataGrid": "0.10.999-cibuild0018773-beta",
"Microsoft.CodeAnalysis.CSharp.Scripting": "3.4.0",
"System.Reactive": "5.0.0"
}
},
"Avalonia.ReactiveUI": {
"type": "Direct",
- "requested": "[0.10.999-cibuild0018748-beta, )",
- "resolved": "0.10.999-cibuild0018748-beta",
- "contentHash": "AJrWGDhMA8lYWE48dRuKD7UXSUwP1R3a6ZgRJLRh7cKCj5uQy5ki11VWyvBiueIEpUt+gv/Plh3+a6g9UmoCQw==",
+ "requested": "[0.10.999-cibuild0018773-beta, )",
+ "resolved": "0.10.999-cibuild0018773-beta",
+ "contentHash": "2VyHzAc7QCLtCfGXQoHJ2eYWzCBXsJj3YRVe5xLvKuPd6ybEbfyAPaeH0PVdPb23ScvSSylxkazpXAdAOIQcvQ==",
"dependencies": {
- "Avalonia": "0.10.999-cibuild0018748-beta",
+ "Avalonia": "0.10.999-cibuild0018773-beta",
"ReactiveUI": "13.2.10",
"System.Reactive": "5.0.0"
}
},
"Avalonia.Skia": {
"type": "Direct",
- "requested": "[0.10.999-cibuild0018748-beta, )",
- "resolved": "0.10.999-cibuild0018748-beta",
- "contentHash": "WfDVEui0Zg/MvvPQph/McHmiCWwIx7tnu2CtlgBVvNd+LL82Xljt0UAAH/UjQfmL/mExhu4Quc/KKomHLqsc+A==",
+ "requested": "[0.10.999-cibuild0018773-beta, )",
+ "resolved": "0.10.999-cibuild0018773-beta",
+ "contentHash": "jf8BT9Ne4hhmw6vruabikBssC5Nl/i35gXEdsaSEg/Pu1iPzMUDgG+ZHd76UgiUk7SrYrQqFopKY9kEIiZwK/A==",
"dependencies": {
- "Avalonia": "0.10.999-cibuild0018748-beta",
+ "Avalonia": "0.10.999-cibuild0018773-beta",
"HarfBuzzSharp": "2.8.2-preview.178",
"HarfBuzzSharp.NativeAssets.Linux": "2.8.2-preview.178",
"HarfBuzzSharp.NativeAssets.WebAssembly": "2.8.2-preview.178",
"Avalonia": "0.10.11"
}
},
+ "stateless": {
+ "type": "Direct",
+ "requested": "[5.11.0, )",
+ "resolved": "5.11.0",
+ "contentHash": "5XXmdEQBOpgE90vqxfZH0ekdqfGB6xLe0Uyb7EyHr/fgv/zkZtDcru4KxRvAvWxE1u4c8MOZnOnXoRfQOfFnTg=="
+ },
"System.Drawing.Common": {
"type": "Direct",
"requested": "[6.0.0, )",
},
"Avalonia.Remote.Protocol": {
"type": "Transitive",
- "resolved": "0.10.999-cibuild0018748-beta",
- "contentHash": "BUemvNsHJ90RJjLHCXIHhjTc0bWVsgZPXmQ+lZFpyh8Gb48+Fs02511xKKmRtlWDNYS9EjWU5Em76gxoPaquQw=="
+ "resolved": "0.10.999-cibuild0018773-beta",
+ "contentHash": "dCfvCQCQ48b83qpJfnD21FhxrMM4w+U3OU3YKr5xxd+H2aw9lro88KP4Ix6CPdMlzo9eHImdzxo9Dxc68DZ6gg=="
},
"Avalonia.Xaml.Interactions": {
"type": "Transitive",

implement the full statemachine for the music box.