refactor showing new ux
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.11</AvaloniaVersion>
+ <AvaloniaVersion>0.10.999-cibuild0018178-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.11, )",
- "resolved": "0.10.11",
- "contentHash": "PQTl4lm7IZidzltMwC7RSNaoz7TYNznU8SKa/WaAI6ycMzC0On2DsqiL1dXr6WhYzMazyMJj6kBhiQzHIc1lIQ==",
+ "requested": "[0.10.999-cibuild0018178-beta, )",
+ "resolved": "0.10.999-cibuild0018178-beta",
+ "contentHash": "vGoe3bhf1thGd28DMOqv1Yuk8Fi1ZcdXu8Pua2UqHiSPlCEuPoCAiSBPeSGTjq3pHxHN9NDB7fBvcL1G1JQ6mQ==",
"dependencies": {
- "Avalonia": "0.10.11",
- "Avalonia.Native": "0.10.11",
- "Avalonia.Skia": "0.10.11",
- "Avalonia.Win32": "0.10.11",
- "Avalonia.X11": "0.10.11"
+ "Avalonia": "0.10.999-cibuild0018178-beta",
+ "Avalonia.Native": "0.10.999-cibuild0018178-beta",
+ "Avalonia.Skia": "0.10.999-cibuild0018178-beta",
+ "Avalonia.Win32": "0.10.999-cibuild0018178-beta",
+ "Avalonia.X11": "0.10.999-cibuild0018178-beta"
}
},
"Avalonia.ReactiveUI": {
"type": "Direct",
- "requested": "[0.10.11, )",
- "resolved": "0.10.11",
- "contentHash": "I/++/4Halsx9HIp99nBwB2nIMrI9zw2M8wDcK1HaYVMKU+m3KFA9w+DfV7g/wEceWSMeX7yAvUjRnaUYtBO08Q==",
+ "requested": "[0.10.999-cibuild0018178-beta, )",
+ "resolved": "0.10.999-cibuild0018178-beta",
+ "contentHash": "JyefR5G0fOHgEvf6qjA4ggzjoV2lnv3FEY6Z6+gfA8IB4WQY0zpUhQ3osVhRhmgnGoepHhJ9Tkf6k4aJXtFivQ==",
"dependencies": {
- "Avalonia": "0.10.11",
+ "Avalonia": "0.10.999-cibuild0018178-beta",
"ReactiveUI": "13.2.10",
"System.Reactive": "5.0.0"
}
},
"Avalonia": {
"type": "Transitive",
- "resolved": "0.10.11",
- "contentHash": "2PSE+dB4vGJfG+1M+y+Hwaxiqze5mbBTTG9hjwc2Z3U/9yJE/GThBEst2WwI0yBt13hsfAfbABzt1PA3mtbFdw==",
+ "resolved": "0.10.999-cibuild0018178-beta",
+ "contentHash": "Nm9n2/eXundYeIJxHNupJ5f4Rx0+AkGKkgIsI9E+/07zjuH0G8+ZesFcPZ57MOgmHpRGu9yFuiD6SrHOHptwIQ==",
"dependencies": {
- "Avalonia.Remote.Protocol": "0.10.11",
+ "Avalonia.Remote.Protocol": "0.10.999-cibuild0018178-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.11",
- "contentHash": "zvt6QA2uwe18gJ/XdnSMTHG6L/2usvjoaAdPC+Lgg+DmUPNTjqN+Hm1l0AjUtNNId6G+4iIkysiZ2WiHPqGsEA==",
+ "resolved": "0.10.999-cibuild0018178-beta",
+ "contentHash": "zLTysoh0OgDjmQAJ7SpU4qyCN6YyJpXpWqdMlTeeuI6UGg6aV56vBs+PG25nMe6kP9fckhix2LzHPokIrefLAQ==",
"dependencies": {
- "Avalonia": "0.10.11",
- "Avalonia.Remote.Protocol": "0.10.11",
+ "Avalonia": "0.10.999-cibuild0018178-beta",
+ "Avalonia.Remote.Protocol": "0.10.999-cibuild0018178-beta",
"JetBrains.Annotations": "10.3.0",
"System.Reactive": "5.0.0"
}
},
"Avalonia.Diagnostics": {
"type": "Transitive",
- "resolved": "0.10.11",
- "contentHash": "xBvBkF2DBKjddAfQbExd660zQ5RaDEXH1JgAdMyYOdu3qFL6d+QHyZdVHVeQFilNYE03F6C8AbMWrmj6dBUNlg==",
+ "resolved": "0.10.999-cibuild0018178-beta",
+ "contentHash": "zXZf9ePStzNV8zgVekx8hpanpyI3sP5TSLw3gqeJrnN5YM2Ch5Q9XlI7liatDaCs18VavTCcpRwdmbOyBEk4Eg==",
"dependencies": {
- "Avalonia": "0.10.11",
- "Avalonia.Controls.DataGrid": "0.10.11",
+ "Avalonia": "0.10.999-cibuild0018178-beta",
+ "Avalonia.Controls.DataGrid": "0.10.999-cibuild0018178-beta",
"Microsoft.CodeAnalysis.CSharp.Scripting": "3.4.0",
"System.Reactive": "5.0.0"
}
},
"Avalonia.FreeDesktop": {
"type": "Transitive",
- "resolved": "0.10.11",
- "contentHash": "cj8T11WQ5/opR2IPttb1Bo89aHclkuvHYsCB7HzZU/F7l/cKXbKUOhyo60p44BdFzrCqjNXDnKQbxeRv+OSF7A==",
+ "resolved": "0.10.999-cibuild0018178-beta",
+ "contentHash": "Al8t5Zqzjf7ka/PDYGo3Absx9dnsWuwUBFbKCn+x1Jo48EcMOvFwJMpNnbFwbWO3G+HBAm4oZPJGOg5vfW59yA==",
"dependencies": {
- "Avalonia": "0.10.11",
+ "Avalonia": "0.10.999-cibuild0018178-beta",
"Tmds.DBus": "0.9.0"
}
},
"Avalonia.Native": {
"type": "Transitive",
- "resolved": "0.10.11",
- "contentHash": "9fBC9UArVXEmsxL2Nd0KHGoZUCqcTo06NTlOTAeM3qdEWzE8a0qRVYiR2WeYfADXpKR1D/fQz5zWUZcebFYFIA==",
+ "resolved": "0.10.999-cibuild0018178-beta",
+ "contentHash": "nst92HbI4p2MSYVxxy7eNMIYbQKBUiSdmpCWNB6K7P73z81S1q08M20xrV6sLlm4xpZP5DlhWoXKI7h09r6aDw==",
"dependencies": {
- "Avalonia": "0.10.11"
+ "Avalonia": "0.10.999-cibuild0018178-beta"
}
},
"Avalonia.Remote.Protocol": {
"type": "Transitive",
- "resolved": "0.10.11",
- "contentHash": "kID2N/cXg7KCGFYFTOWCvSLt+oMFRApLfLcbLU35keC/jwDi9tFk33CEdo81hBEg15lAtTtCfvHhNPyVyIYijQ=="
+ "resolved": "0.10.999-cibuild0018178-beta",
+ "contentHash": "k4nukCVX9wE99lXkyX17TjngHTLK4x9Zn0Sb3jgI3f+Aup/Dcauy+hoiomzfURfhE/ydi6HdjsbZ3o+GOFNfrQ=="
},
"Avalonia.Skia": {
"type": "Transitive",
- "resolved": "0.10.11",
- "contentHash": "4bP5V3BpnZ+If2/ZrZofeRsINeZ6gemLjfNyElt7vNF4HZaRfot03anO3Y+Z7mTELjuol6n/5lAL4+kQUN/O/w==",
+ "resolved": "0.10.999-cibuild0018178-beta",
+ "contentHash": "ViwXBWAw423LnAyOP7oKuQDi7pjvEVSk3RbKdbdP/2VI+Sz6BmK5FuqT5i6S647fzFzFalDfAywAAGsaquZaKg==",
"dependencies": {
- "Avalonia": "0.10.11",
+ "Avalonia": "0.10.999-cibuild0018178-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.11",
- "contentHash": "bckqh8rnQ4+l2kdU4njO3cBKaT4l1HQkxdVYJLAgl44uMtoCpaN7EidrBTnuM40DXa0cpvOh97A+G8jpZgte6Q==",
+ "resolved": "0.10.999-cibuild0018178-beta",
+ "contentHash": "IrhnIdmvCx1zp1TIg9HclWEmm44SBN8E6Jz1AMzcUai8SBZvtI7YVVvbd2CwNT0UTJYWINS+LTUKhiNpwb4T4g==",
"dependencies": {
- "Avalonia": "0.10.11",
+ "Avalonia": "0.10.999-cibuild0018178-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.11",
- "contentHash": "joPVaMmPy4bC1STSk5+fAn5zZOT3gz4m/YSv6io3p2q68kEbc+d5KaYk/KcqA/WGiBBQx4a0ViPW/IRomI94kw==",
+ "resolved": "0.10.999-cibuild0018178-beta",
+ "contentHash": "IOavdqs4FxTjACGMYXX+1vvAYAhUlewXdaVMH9rdMXKTo/FeQ2Lk/CWpgjNnWc3UgW3B1hVAx51tCf9R9cF3gg==",
"dependencies": {
- "Avalonia": "0.10.11",
- "Avalonia.FreeDesktop": "0.10.11",
- "Avalonia.Skia": "0.10.11"
+ "Avalonia": "0.10.999-cibuild0018178-beta",
+ "Avalonia.FreeDesktop": "0.10.999-cibuild0018178-beta",
+ "Avalonia.Skia": "0.10.999-cibuild0018178-beta"
}
},
"Avalonia.Xaml.Behaviors": {
"walletwasabi.fluent": {
"type": "Project",
"dependencies": {
- "Avalonia": "0.10.11",
- "Avalonia.Controls.DataGrid": "0.10.11",
- "Avalonia.Diagnostics": "0.10.11",
- "Avalonia.ReactiveUI": "0.10.11",
+ "Avalonia": "0.10.999-cibuild0018178-beta",
+ "Avalonia.Controls.DataGrid": "0.10.999-cibuild0018178-beta",
+ "Avalonia.Diagnostics": "0.10.999-cibuild0018178-beta",
+ "Avalonia.ReactiveUI": "0.10.999-cibuild0018178-beta",
"Avalonia.Xaml.Behaviors": "0.10.11.5",
"DataBox": "0.10.11.1",
"OpenCvSharp4": "4.5.2.20210404",
},
"Avalonia.Native": {
"type": "Transitive",
- "resolved": "0.10.11",
- "contentHash": "9fBC9UArVXEmsxL2Nd0KHGoZUCqcTo06NTlOTAeM3qdEWzE8a0qRVYiR2WeYfADXpKR1D/fQz5zWUZcebFYFIA==",
+ "resolved": "0.10.999-cibuild0018178-beta",
+ "contentHash": "nst92HbI4p2MSYVxxy7eNMIYbQKBUiSdmpCWNB6K7P73z81S1q08M20xrV6sLlm4xpZP5DlhWoXKI7h09r6aDw==",
"dependencies": {
- "Avalonia": "0.10.11"
+ "Avalonia": "0.10.999-cibuild0018178-beta"
}
},
"HarfBuzzSharp.NativeAssets.Linux": {
},
"Avalonia.Native": {
"type": "Transitive",
- "resolved": "0.10.11",
- "contentHash": "9fBC9UArVXEmsxL2Nd0KHGoZUCqcTo06NTlOTAeM3qdEWzE8a0qRVYiR2WeYfADXpKR1D/fQz5zWUZcebFYFIA==",
+ "resolved": "0.10.999-cibuild0018178-beta",
+ "contentHash": "nst92HbI4p2MSYVxxy7eNMIYbQKBUiSdmpCWNB6K7P73z81S1q08M20xrV6sLlm4xpZP5DlhWoXKI7h09r6aDw==",
"dependencies": {
- "Avalonia": "0.10.11"
+ "Avalonia": "0.10.999-cibuild0018178-beta"
}
},
"HarfBuzzSharp.NativeAssets.Linux": {
},
"Avalonia.Native": {
"type": "Transitive",
- "resolved": "0.10.11",
- "contentHash": "9fBC9UArVXEmsxL2Nd0KHGoZUCqcTo06NTlOTAeM3qdEWzE8a0qRVYiR2WeYfADXpKR1D/fQz5zWUZcebFYFIA==",
+ "resolved": "0.10.999-cibuild0018178-beta",
+ "contentHash": "nst92HbI4p2MSYVxxy7eNMIYbQKBUiSdmpCWNB6K7P73z81S1q08M20xrV6sLlm4xpZP5DlhWoXKI7h09r6aDw==",
"dependencies": {
- "Avalonia": "0.10.11"
+ "Avalonia": "0.10.999-cibuild0018178-beta"
}
},
"HarfBuzzSharp.NativeAssets.Linux": {

MODIFY
WalletWasabi.Fluent/Behaviors/FadePocketLabelsBehavior.cs
WalletWasabi.Fluent/Behaviors/FadePocketLabelsBehavior.cs
@@ -2,6 +2,9 @@ using System.Linq;
using System.Reactive.Disposables;
using System.Reactive.Linq;
using Avalonia;
+using Avalonia.Controls;
+using Avalonia.Data;
+using Avalonia.Input;
using Avalonia.VisualTree;
using ReactiveUI;
using WalletWasabi.Fluent.Controls;
@@ -9,6 +12,40 @@ using WalletWasabi.Fluent.Models;
namespace WalletWasabi.Fluent.Behaviors;
+public class BindPointerOverBehavior : DisposingBehavior<Control>
+{
+ public static readonly StyledProperty<bool> IsPointerOverProperty =
+ AvaloniaProperty.Register<BindPointerOverBehavior, bool>(nameof(IsPointerOver), defaultBindingMode: BindingMode.OneWayToSource);
+
+ public bool IsPointerOver
+ {
+ get => GetValue(IsPointerOverProperty);
+ set => SetValue(IsPointerOverProperty, value);
+ }
+
+ protected override void OnAttached(CompositeDisposable disposables)
+ {
+ AssociatedObject.PropertyChanged += AssociatedObjectOnPropertyChanged;
+ }
+
+ private void AssociatedObjectOnPropertyChanged(object? sender, AvaloniaPropertyChangedEventArgs e)
+ {
+ if (e.Property == InputElement.IsPointerOverProperty)
+ {
+ IsPointerOver = e.NewValue is true;
+ }
+ }
+
+ protected override void OnDetaching()
+ {
+ AssociatedObject.PropertyChanged -= AssociatedObjectOnPropertyChanged;
+
+ base.OnDetaching();
+
+ IsPointerOver = false;
+ }
+}
+
public class FadePocketLabelsBehavior : AttachedToVisualTreeBehavior<TagsBox>
{
private TagControl[] _currentTags = Array.Empty<TagControl>();

MODIFY
WalletWasabi.Fluent/Converters/FeeTargetTimeConverter.cs
WalletWasabi.Fluent/Converters/FeeTargetTimeConverter.cs
using Avalonia.Data.Converters;
using System.Globalization;
using Avalonia;
+using Avalonia.Media;
using WalletWasabi.Helpers;
namespace WalletWasabi.Fluent.Converters;
+public class BoolToBrushConverter : IValueConverter
+{
+ public static BoolToBrushConverter Instance { get; } = new();
+
+ public IBrush? TrueBrush { get; set; }
+
+ public IBrush? FalseBrush { get; set; }
+
+ public object? Convert(object? value, Type targetType, object? parameter, CultureInfo culture)
+ {
+ if (value is true)
+ {
+ return TrueBrush;
+ }
+ else
+ {
+ return FalseBrush;
+ }
+ }
+
+ public object? ConvertBack(object? value, Type targetType, object? parameter, CultureInfo culture)
+ {
+ throw new NotImplementedException();
+ }
+}
+
public class FeeTargetTimeConverter : IValueConverter
{
public static string Convert(int feeTarget, string minutesLabel, string hourLabel, string hoursLabel, string dayLabel, string daysLabel)

MODIFY
WalletWasabi.Fluent/ViewModels/Wallets/Send/PrivacyControlViewModel.cs
WalletWasabi.Fluent/ViewModels/Wallets/Send/PrivacyControlViewModel.cs
@@ -15,12 +15,67 @@ using WalletWasabi.Wallets;
namespace WalletWasabi.Fluent.ViewModels.Wallets.Send;
+public partial class LabelViewModel : ViewModelBase
+{
+ [AutoNotify] private bool _isBlackListed;
+ [AutoNotify] private bool _isPointerOver;
+ [AutoNotify] private bool _isHighlighted;
+
+ public LabelViewModel(PrivacyControlViewModel owner, string label)
+ {
+ Pockets = new List<PocketViewModel>();
+ Value = label;
+
+ this.WhenAnyValue(x => x.IsPointerOver)
+ .Subscribe(isPointerOver =>
+ {
+ foreach (var pocket in Pockets)
+ {
+ foreach (var pocketLabel in pocket.Labels)
+ {
+ pocketLabel.IsHighlighted = isPointerOver;
+ }
+ }
+ });
+
+ ClickedCommand = ReactiveCommand.Create(() =>
+ {
+ foreach (var pocket in Pockets)
+ {
+ foreach (var pocketLabel in pocket.Labels)
+ {
+ pocketLabel.IsHighlighted = false;
+ }
+ }
+
+ owner.SwapLabel(this);
+ });
+ }
+
+ public List<PocketViewModel> Pockets { get; }
+
+ public string Value { get; }
+
+ public ICommand ClickedCommand { get; }
+}
+
+public class PocketViewModel : ViewModelBase
+{
+ public PocketViewModel()
+ {
+ Labels = new List<LabelViewModel>();
+ }
+
+ public List<LabelViewModel> Labels { get; }
+}
+
[NavigationMetaData(Title = "Privacy Control")]
public partial class PrivacyControlViewModel : DialogViewModelBase<IEnumerable<SmartCoin>>
{
private readonly Wallet _wallet;
private readonly TransactionInfo _transactionInfo;
private readonly bool _isSilent;
+
private readonly Stack<Pocket[]> _removedPocketStack;
[AutoNotify] private Pocket[] _usedPockets = Array.Empty<Pocket>();
@@ -50,8 +105,56 @@ public partial class PrivacyControlViewModel : DialogViewModelBase<IEnumerable<S
.Subscribe(_ => OnLabelsChanged());
}
+ internal void SwapLabel(LabelViewModel label)
+ {
+ if (label.IsBlackListed)
+ {
+ foreach (var pocket in label.Pockets)
+ {
+ WhiteListPocketLabels(pocket);
+ }
+ }
+ else
+ {
+ foreach (var pocket in label.Pockets)
+ {
+ BlackListPocketLabels(pocket);
+ }
+ }
+ }
+
+ private void WhiteListPocketLabels(PocketViewModel pocket, bool initialising = false)
+ {
+ var labels = pocket.Labels.Where(x => x.IsBlackListed);
+
+ foreach (var label in labels)
+ {
+ LabelsBlackList.Remove(label);
+
+ label.IsBlackListed = false;
+
+ LabelsWhiteList.Add(label);
+ }
+ }
+
+ private void BlackListPocketLabels(PocketViewModel pocket)
+ {
+ foreach (var label in pocket.Labels.Where(x => !x.IsBlackListed))
+ {
+ LabelsWhiteList.Remove(label);
+
+ label.IsBlackListed = true;
+
+ LabelsBlackList.Add(label);
+ }
+ }
+
public ICommand UndoCommand { get; }
+ public ObservableCollection<LabelViewModel> LabelsWhiteList { get; } = new ObservableCollection<LabelViewModel>();
+
+ public ObservableCollection<LabelViewModel> LabelsBlackList { get; } = new ObservableCollection<LabelViewModel>();
+
public ObservableCollection<string> Labels { get; set; }
public ObservableCollection<string> MustHaveLabels { get; }
@@ -93,6 +196,37 @@ public partial class PrivacyControlViewModel : DialogViewModelBase<IEnumerable<S
{
_isUpdating = true;
+ var labelViewModels = new Dictionary<string, LabelViewModel>();
+
+ var pocketVms = new List<PocketViewModel>();
+
+ foreach (var pocket in pockets)
+ {
+ var pocketVm = new PocketViewModel();
+
+ pocketVms.Add(pocketVm);
+
+ foreach (var label in pocket.Labels)
+ {
+ if (!labelViewModels.ContainsKey(label))
+ {
+ labelViewModels[label] = new LabelViewModel(this, label) { IsBlackListed = true };
+ }
+
+ pocketVm.Labels.Add(labelViewModels[label]);
+
+ labelViewModels[label].Pockets.Add(pocketVm);
+ }
+ }
+
+ LabelsWhiteList.Clear();
+ LabelsBlackList.Clear();
+
+ foreach (var pocketVm in pocketVms)
+ {
+ WhiteListPocketLabels(pocketVm, initialising: true);
+ }
+
UsedPockets = pockets.ToArray();
MustHaveLabels.Clear();
Labels.Clear();
@@ -117,6 +251,7 @@ public partial class PrivacyControlViewModel : DialogViewModelBase<IEnumerable<S
private void InitializeLabels()
{
var pockets = _wallet.Coins.GetPockets(_wallet.ServiceConfiguration.MinAnonScoreTarget).Select(x => new Pocket(x));
+
UpdateLabels(pockets);
}

MODIFY
WalletWasabi.Fluent/Views/Wallets/Home/WalletTiles.axaml
WalletWasabi.Fluent/Views/Wallets/Home/WalletTiles.axaml
<Setter Property="Margin" Value="0 0"/>
<Setter Property="Padding" Value="0,0,10,0"/>
</Style>
- <Style Selector="ItemsControl > ContentPresenter" x:DataType="tiles:TileViewModel">
- <Setter Property="Grid.Column" Value="{Binding Column}" />
- <Setter Property="Grid.Row" Value="{Binding Row}" />
- <Setter Property="Grid.ColumnSpan" Value="{Binding ColumnSpan}" />
- <Setter Property="Grid.RowSpan" Value="{Binding RowSpan}" />
- <Setter Property="IsVisible" Value="{Binding IsVisible}" />
- </Style>
+
</ItemsControl.Styles>
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>

MODIFY
WalletWasabi.Fluent/Views/Wallets/Send/PrivacyControlView.axaml
WalletWasabi.Fluent/Views/Wallets/Send/PrivacyControlView.axaml
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:c="using:WalletWasabi.Fluent.Controls"
xmlns:vm="using:WalletWasabi.Fluent.ViewModels.Wallets.Send"
- xmlns:behaviors="clr-namespace:WalletWasabi.Fluent.Behaviors"
+ xmlns:converters="clr-namespace:WalletWasabi.Fluent.Converters"
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
x:DataType="vm:PrivacyControlViewModel"
- x:CompileBindings="True"
+ xmlns:i="using:Avalonia.Xaml.Interactivity"
+ xmlns:behaviors="clr-namespace:WalletWasabi.Fluent.Behaviors"
x:Class="WalletWasabi.Fluent.Views.Wallets.Send.PrivacyControlView">
<c:ContentArea Title="Send - Privacy Control"
Caption="Parts of your wallet are known to certain entities."
<Button Content="Undo" Command="{Binding UndoCommand}" DockPanel.Dock="Top" />
<TextBlock Text="Remove the entities you cannot tolerate leaking information about this transaction:" DockPanel.Dock="Top" />
- <c:TagsBox Items="{Binding Labels}" EnableDelete="True" HorizontalAlignment="Center">
- <c:TagsBox.Styles>
- <Style Selector="c|TagsBox AutoCompleteBox">
- <Setter Property="IsEnabled" Value="False" />
- </Style>
- <Style Selector="c|TagsBox">
- <Setter Property="Cursor" Value="Arrow" />
- <Setter Property="BorderThickness" Value="0" />
- <Setter Property="Background" Value="Transparent" />
- </Style>
- <Style Selector="c|TagsBox:pointerover /template/ Border#PART_Border">
- <Setter Property="Background" Value="Transparent" />
- </Style>
- <Style Selector="c|TagControl">
- <Setter Property="Transitions">
- <Transitions>
- <DoubleTransition Property="Opacity" Duration="0:0:0.15" Easing="{StaticResource FluentEasing}" />
- </Transitions>
- </Setter>
- </Style>
- </c:TagsBox.Styles>
- <Interaction.Behaviors>
- <behaviors:FadePocketLabelsBehavior Pockets="{Binding UsedPockets}" />
- </Interaction.Behaviors>
- </c:TagsBox>
+
+ <DockPanel>
+ <ItemsControl DockPanel.Dock="Bottom" Items="{Binding LabelsBlackList}">
+ <ItemsControl.ItemsPanel>
+ <ItemsPanelTemplate>
+ <WrapPanel Orientation="Horizontal" />
+ </ItemsPanelTemplate>
+ </ItemsControl.ItemsPanel>
+ <ItemsControl.ItemTemplate>
+ <DataTemplate x:DataType="vm:LabelViewModel">
+ <Button Classes="plain" Margin="5" Command="{Binding ClickedCommand}">
+ <i:Interaction.Behaviors>
+ <behaviors:BindPointerOverBehavior IsPointerOver="{Binding IsPointerOver, Mode=OneWayToSource}" />
+ </i:Interaction.Behaviors>
+ <c:TagControl Content="{Binding Value}" IsHitTestVisible="False">
+ <c:TagControl.Background>
+ <Binding Path="IsHighlighted">
+ <Binding.Converter>
+ <converters:BoolToBrushConverter TrueBrush="Green" />
+ </Binding.Converter>
+ </Binding>
+ </c:TagControl.Background>
+ </c:TagControl>
+ </Button>
+ </DataTemplate>
+ </ItemsControl.ItemTemplate>
+ </ItemsControl>
+
+ <Separator DockPanel.Dock="Bottom" />
+
+ <ItemsControl Items="{Binding LabelsWhiteList}">
+ <ItemsControl.ItemsPanel>
+ <ItemsPanelTemplate>
+ <WrapPanel Orientation="Horizontal" />
+ </ItemsPanelTemplate>
+ </ItemsControl.ItemsPanel>
+ <ItemsControl.ItemTemplate>
+ <DataTemplate x:DataType="vm:LabelViewModel">
+ <Button Classes="plain" Margin="5" Command="{Binding ClickedCommand}" Padding="10">
+ <i:Interaction.Behaviors>
+ <behaviors:BindPointerOverBehavior IsPointerOver="{Binding IsPointerOver, Mode=OneWayToSource}" />
+ </i:Interaction.Behaviors>
+ <c:TagControl Content="{Binding Value}" IsHitTestVisible="False">
+ <c:TagControl.Background>
+ <Binding Path="IsHighlighted">
+ <Binding.Converter>
+ <converters:BoolToBrushConverter TrueBrush="Red" />
+ </Binding.Converter>
+ </Binding>
+ </c:TagControl.Background>
+ </c:TagControl>
+ </Button>
+ </DataTemplate>
+ </ItemsControl.ItemTemplate>
+ </ItemsControl>
+
+ </DockPanel>
+
</DockPanel>
</c:ContentArea>

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.11</AvaloniaVersion>
+ <AvaloniaVersion>0.10.999-cibuild0018178-beta</AvaloniaVersion>
</PropertyGroup>
<ItemGroup>
<AvaloniaResource Include="Assets\**" />

MODIFY
WalletWasabi.Fluent/packages.lock.json
WalletWasabi.Fluent/packages.lock.json
"net6.0": {
"Avalonia": {
"type": "Direct",
- "requested": "[0.10.11, )",
- "resolved": "0.10.11",
- "contentHash": "2PSE+dB4vGJfG+1M+y+Hwaxiqze5mbBTTG9hjwc2Z3U/9yJE/GThBEst2WwI0yBt13hsfAfbABzt1PA3mtbFdw==",
+ "requested": "[0.10.999-cibuild0018178-beta, )",
+ "resolved": "0.10.999-cibuild0018178-beta",
+ "contentHash": "Nm9n2/eXundYeIJxHNupJ5f4Rx0+AkGKkgIsI9E+/07zjuH0G8+ZesFcPZ57MOgmHpRGu9yFuiD6SrHOHptwIQ==",
"dependencies": {
- "Avalonia.Remote.Protocol": "0.10.11",
+ "Avalonia.Remote.Protocol": "0.10.999-cibuild0018178-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.11, )",
- "resolved": "0.10.11",
- "contentHash": "zvt6QA2uwe18gJ/XdnSMTHG6L/2usvjoaAdPC+Lgg+DmUPNTjqN+Hm1l0AjUtNNId6G+4iIkysiZ2WiHPqGsEA==",
+ "requested": "[0.10.999-cibuild0018178-beta, )",
+ "resolved": "0.10.999-cibuild0018178-beta",
+ "contentHash": "zLTysoh0OgDjmQAJ7SpU4qyCN6YyJpXpWqdMlTeeuI6UGg6aV56vBs+PG25nMe6kP9fckhix2LzHPokIrefLAQ==",
"dependencies": {
- "Avalonia": "0.10.11",
- "Avalonia.Remote.Protocol": "0.10.11",
+ "Avalonia": "0.10.999-cibuild0018178-beta",
+ "Avalonia.Remote.Protocol": "0.10.999-cibuild0018178-beta",
"JetBrains.Annotations": "10.3.0",
"System.Reactive": "5.0.0"
}
},
"Avalonia.Diagnostics": {
"type": "Direct",
- "requested": "[0.10.11, )",
- "resolved": "0.10.11",
- "contentHash": "xBvBkF2DBKjddAfQbExd660zQ5RaDEXH1JgAdMyYOdu3qFL6d+QHyZdVHVeQFilNYE03F6C8AbMWrmj6dBUNlg==",
+ "requested": "[0.10.999-cibuild0018178-beta, )",
+ "resolved": "0.10.999-cibuild0018178-beta",
+ "contentHash": "zXZf9ePStzNV8zgVekx8hpanpyI3sP5TSLw3gqeJrnN5YM2Ch5Q9XlI7liatDaCs18VavTCcpRwdmbOyBEk4Eg==",
"dependencies": {
- "Avalonia": "0.10.11",
- "Avalonia.Controls.DataGrid": "0.10.11",
+ "Avalonia": "0.10.999-cibuild0018178-beta",
+ "Avalonia.Controls.DataGrid": "0.10.999-cibuild0018178-beta",
"Microsoft.CodeAnalysis.CSharp.Scripting": "3.4.0",
"System.Reactive": "5.0.0"
}
},
"Avalonia.ReactiveUI": {
"type": "Direct",
- "requested": "[0.10.11, )",
- "resolved": "0.10.11",
- "contentHash": "I/++/4Halsx9HIp99nBwB2nIMrI9zw2M8wDcK1HaYVMKU+m3KFA9w+DfV7g/wEceWSMeX7yAvUjRnaUYtBO08Q==",
+ "requested": "[0.10.999-cibuild0018178-beta, )",
+ "resolved": "0.10.999-cibuild0018178-beta",
+ "contentHash": "JyefR5G0fOHgEvf6qjA4ggzjoV2lnv3FEY6Z6+gfA8IB4WQY0zpUhQ3osVhRhmgnGoepHhJ9Tkf6k4aJXtFivQ==",
"dependencies": {
- "Avalonia": "0.10.11",
+ "Avalonia": "0.10.999-cibuild0018178-beta",
"ReactiveUI": "13.2.10",
"System.Reactive": "5.0.0"
}
},
"Avalonia.Remote.Protocol": {
"type": "Transitive",
- "resolved": "0.10.11",
- "contentHash": "kID2N/cXg7KCGFYFTOWCvSLt+oMFRApLfLcbLU35keC/jwDi9tFk33CEdo81hBEg15lAtTtCfvHhNPyVyIYijQ=="
+ "resolved": "0.10.999-cibuild0018178-beta",
+ "contentHash": "k4nukCVX9wE99lXkyX17TjngHTLK4x9Zn0Sb3jgI3f+Aup/Dcauy+hoiomzfURfhE/ydi6HdjsbZ3o+GOFNfrQ=="
},
"Avalonia.Xaml.Interactions": {
"type": "Transitive",

refactor showing new ux