1 Commits

Author SHA1 Message Date
davide 61b3d5e25b feat(ui): show full tx inputs/outputs in detail overlay without truncation
Input rows switch to a two-line layout (full prev-txid:index on the first
line, address + amount on the second) so nothing is cut by a fixed 160px
column. Output address column gets TextWrapping instead of TextTrimming.
Overlay grows to MaxWidth=660/MaxHeight=800 for better desktop use; the
same XAML wraps naturally on narrow mobile screens.
Removes the Shorten() helper that was masking input references.
2026-06-24 15:25:35 +02:00
2 changed files with 31 additions and 24 deletions
@@ -63,7 +63,7 @@ public sealed class TransactionDetailsViewModel
LockTimeText = d.LockTime.ToString(); LockTimeText = d.LockTime.ToString();
RbfText = loc[d.RbfSignaled ? "tx.yes" : "tx.no"]; RbfText = loc[d.RbfSignaled ? "tx.yes" : "tx.no"];
Inputs = new ObservableCollection<TxIoRow>(d.Inputs.Select((i, n) => new TxIoRow( Inputs = new ObservableCollection<TxIoRow>(d.Inputs.Select((i, n) => new TxIoRow(
i.IsCoinbase ? loc["tx.coinbase"] : $"{Shorten(i.PrevTxid)}:{i.PrevIndex}", i.IsCoinbase ? loc["tx.coinbase"] : $"{i.PrevTxid}:{i.PrevIndex}",
i.IsCoinbase ? loc["tx.coinbase.newcoins"] : i.Address ?? "—", i.IsCoinbase ? loc["tx.coinbase.newcoins"] : i.Address ?? "—",
i.AmountSats is { } a ? CoinAmount.FormatIn(a, unit) : "—", i.AmountSats is { } a ? CoinAmount.FormatIn(a, unit) : "—",
i.IsMine))); i.IsMine)));
@@ -108,7 +108,4 @@ public sealed class TransactionDetailsViewModel
} }
private string Abs(long sats) => CoinAmount.FormatIn(Math.Abs(sats), _unit); private string Abs(long sats) => CoinAmount.FormatIn(Math.Abs(sats), _unit);
private static string Shorten(string txid) =>
txid.Length > 16 ? $"{txid[..8]}…{txid[^4..]}" : txid;
} }
+30 -20
View File
@@ -1014,7 +1014,7 @@
IsVisible="{Binding IsTxDetailsOpen}"> IsVisible="{Binding IsTxDetailsOpen}">
<Border Background="{DynamicResource OverlayCardBrush}" <Border Background="{DynamicResource OverlayCardBrush}"
BorderBrush="{DynamicResource BorderSubtleBrush}" BorderThickness="1" CornerRadius="8" BorderBrush="{DynamicResource BorderSubtleBrush}" BorderThickness="1" CornerRadius="8"
MaxWidth="540" MaxHeight="600" Margin="16" Padding="0" MaxWidth="660" MaxHeight="800" Margin="16" Padding="0"
HorizontalAlignment="Center" VerticalAlignment="Center"> HorizontalAlignment="Center" VerticalAlignment="Center">
<Panel Margin="24"> <Panel Margin="24">
@@ -1135,38 +1135,48 @@
</Border> </Border>
<TextBlock Classes="section" Text="{Binding Loc[tx.inputs]}"/> <TextBlock Classes="section" Text="{Binding Loc[tx.inputs]}"/>
<Border Classes="card" Padding="14,6"> <Border Classes="card" Padding="14,4">
<ItemsControl ItemsSource="{Binding Inputs}"> <ItemsControl ItemsSource="{Binding Inputs}">
<ItemsControl.ItemTemplate> <ItemsControl.ItemTemplate>
<DataTemplate x:DataType="vm:TxIoRow"> <DataTemplate x:DataType="vm:TxIoRow">
<Grid ColumnDefinitions="160,*,Auto" Margin="0,4"> <!-- Two-line layout: txid ref on first line, address+amount on second -->
<TextBlock Grid.Column="0" Text="{Binding Position}" <StackPanel Margin="0,6,0,4">
FontFamily="monospace" FontSize="11" Foreground="{DynamicResource TextMutedBrush}" <SelectableTextBlock Text="{Binding Position}"
TextTrimming="CharacterEllipsis" Margin="0,0,8,0"/> FontFamily="monospace" FontSize="10"
<TextBlock Grid.Column="1" Text="{Binding Address}" Foreground="{DynamicResource TextMutedBrush}"
FontFamily="monospace" FontSize="11" TextTrimming="CharacterEllipsis" TextWrapping="Wrap"/>
Foreground="{Binding IsMine, Converter={x:Static vm:MineColorConverter.Instance}}"/> <Grid ColumnDefinitions="*,Auto" Margin="0,2,0,0">
<TextBlock Grid.Column="2" Text="{Binding Amount}" <SelectableTextBlock Grid.Column="0" Text="{Binding Address}"
FontFamily="monospace" FontFeatures="+tnum" FontSize="11" Margin="8,0,0,0"/> FontFamily="monospace" FontSize="11"
</Grid> TextWrapping="Wrap" VerticalAlignment="Top"
Foreground="{Binding IsMine, Converter={x:Static vm:MineColorConverter.Instance}}"/>
<SelectableTextBlock Grid.Column="1" Text="{Binding Amount}"
FontFamily="monospace" FontFeatures="+tnum" FontSize="11"
VerticalAlignment="Top" Margin="12,0,0,0"/>
</Grid>
</StackPanel>
</DataTemplate> </DataTemplate>
</ItemsControl.ItemTemplate> </ItemsControl.ItemTemplate>
</ItemsControl> </ItemsControl>
</Border> </Border>
<TextBlock Classes="section" Text="{Binding Loc[tx.outputs]}"/> <TextBlock Classes="section" Text="{Binding Loc[tx.outputs]}"/>
<Border Classes="card" Padding="14,6"> <Border Classes="card" Padding="14,4">
<ItemsControl ItemsSource="{Binding Outputs}"> <ItemsControl ItemsSource="{Binding Outputs}">
<ItemsControl.ItemTemplate> <ItemsControl.ItemTemplate>
<DataTemplate x:DataType="vm:TxIoRow"> <DataTemplate x:DataType="vm:TxIoRow">
<Grid ColumnDefinitions="44,*,Auto" Margin="0,4"> <Grid ColumnDefinitions="44,*,Auto" Margin="0,6">
<TextBlock Grid.Column="0" Text="{Binding Position}" <TextBlock Grid.Column="0" Text="{Binding Position}"
FontFamily="monospace" FontSize="11" Foreground="{DynamicResource TextMutedBrush}"/> FontFamily="monospace" FontSize="11"
<TextBlock Grid.Column="1" Text="{Binding Address}" Foreground="{DynamicResource TextMutedBrush}"
FontFamily="monospace" FontSize="11" TextTrimming="CharacterEllipsis" VerticalAlignment="Top"/>
Foreground="{Binding IsMine, Converter={x:Static vm:MineColorConverter.Instance}}"/> <SelectableTextBlock Grid.Column="1" Text="{Binding Address}"
<TextBlock Grid.Column="2" Text="{Binding Amount}" FontFamily="monospace" FontSize="11"
FontFamily="monospace" FontFeatures="+tnum" FontSize="11" Margin="8,0,0,0"/> TextWrapping="Wrap" VerticalAlignment="Top"
Foreground="{Binding IsMine, Converter={x:Static vm:MineColorConverter.Instance}}"/>
<SelectableTextBlock Grid.Column="2" Text="{Binding Amount}"
FontFamily="monospace" FontFeatures="+tnum" FontSize="11"
VerticalAlignment="Top" Margin="12,0,0,0"/>
</Grid> </Grid>
</DataTemplate> </DataTemplate>
</ItemsControl.ItemTemplate> </ItemsControl.ItemTemplate>