TRC20/WpfApp1TRC20/Views/MainWindow.xaml
2025-07-25 16:05:44 +05:30

505 lines
30 KiB
XML

<Window x:Class="WpfApp1TRC20.Views.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
xmlns:vm="clr-namespace:WpfApp1TRC20.ViewModels"
Title="TRC20 Token Manager"
Height="800"
Width="1200"
WindowStartupLocation="CenterScreen"
TextElement.Foreground="{DynamicResource MaterialDesignBody}"
TextElement.FontWeight="Regular"
TextElement.FontSize="13"
TextOptions.TextFormattingMode="Ideal"
TextOptions.TextRenderingMode="Auto"
Background="{DynamicResource MaterialDesignPaper}"
FontFamily="{DynamicResource MaterialDesignFont}">
<Window.Resources>
<BooleanToVisibilityConverter x:Key="BoolToVisibilityConverter"/>
</Window.Resources>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<!-- Header -->
<materialDesign:ColorZone Grid.Row="0"
Mode="PrimaryMid"
Padding="16">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="0"
Text="TRC20 Token Manager"
Style="{DynamicResource MaterialDesignHeadline5TextBlock}"
VerticalAlignment="Center"/>
<StackPanel Grid.Column="1"
Orientation="Horizontal">
<Button Command="{Binding RefreshDataCommand}"
Style="{DynamicResource MaterialDesignIconButton}"
ToolTip="Refresh Data">
<materialDesign:PackIcon Kind="Refresh"/>
</Button>
</StackPanel>
</Grid>
</materialDesign:ColorZone>
<!-- Main Content -->
<TabControl Grid.Row="1"
SelectedValue="{Binding SelectedTabItem}"
Style="{DynamicResource MaterialDesignTabControl}">
<!-- Dashboard Tab -->
<TabItem Header="Dashboard" Name="DashboardTab">
<Grid Margin="16">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<!-- Stats Cards -->
<UniformGrid Grid.Row="0"
Rows="1"
Columns="3"
Margin="0,0,0,16">
<materialDesign:Card Margin="8">
<StackPanel Margin="16">
<TextBlock Text="Active Tokens"
Style="{DynamicResource MaterialDesignSubtitle1TextBlock}"/>
<TextBlock Text="{Binding Tokens.Count}"
Style="{DynamicResource MaterialDesignHeadline4TextBlock}"
Foreground="{DynamicResource PrimaryHueMidBrush}"/>
</StackPanel>
</materialDesign:Card>
<materialDesign:Card Margin="8">
<StackPanel Margin="16">
<TextBlock Text="Wallets"
Style="{DynamicResource MaterialDesignSubtitle1TextBlock}"/>
<TextBlock Text="{Binding Wallets.Count}"
Style="{DynamicResource MaterialDesignHeadline4TextBlock}"
Foreground="{DynamicResource PrimaryHueMidBrush}"/>
</StackPanel>
</materialDesign:Card>
<materialDesign:Card Margin="8">
<StackPanel Margin="16">
<TextBlock Text="Transactions"
Style="{DynamicResource MaterialDesignSubtitle1TextBlock}"/>
<TextBlock Text="{Binding Transactions.Count}"
Style="{DynamicResource MaterialDesignHeadline4TextBlock}"
Foreground="{DynamicResource PrimaryHueMidBrush}"/>
</StackPanel>
</materialDesign:Card>
</UniformGrid>
<!-- Recent Activity -->
<materialDesign:Card Grid.Row="1">
<StackPanel>
<TextBlock Text="Recent Transactions"
Style="{DynamicResource MaterialDesignHeadline6TextBlock}"
Margin="16,16,16,8"/>
<DataGrid ItemsSource="{Binding Transactions}"
MaxHeight="300"
AutoGenerateColumns="False"
CanUserAddRows="False"
CanUserDeleteRows="False"
IsReadOnly="True"
Style="{DynamicResource MaterialDesignDataGrid}">
<DataGrid.Columns>
<DataGridTextColumn Header="Hash"
Binding="{Binding TransactionHash}"
Width="200"/>
<DataGridTextColumn Header="From"
Binding="{Binding FromAddress}"
Width="150"/>
<DataGridTextColumn Header="To"
Binding="{Binding ToAddress}"
Width="150"/>
<DataGridTextColumn Header="Amount"
Binding="{Binding Amount}"
Width="100"/>
<DataGridTextColumn Header="Token"
Binding="{Binding TokenSymbol}"
Width="80"/>
<DataGridTextColumn Header="Status"
Binding="{Binding Status}"
Width="100"/>
<DataGridTextColumn Header="Time"
Binding="{Binding Timestamp, StringFormat={}{0:MM/dd/yyyy HH:mm}}"
Width="120"/>
</DataGrid.Columns>
</DataGrid>
</StackPanel>
</materialDesign:Card>
</Grid>
</TabItem>
<!-- Tokens Tab -->
<TabItem Header="Tokens" Name="TokensTab">
<Grid Margin="16">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="300"/>
</Grid.ColumnDefinitions>
<!-- Token List -->
<materialDesign:Card Grid.Column="0" Margin="0,0,8,0">
<StackPanel>
<TextBlock Text="My Tokens"
Style="{DynamicResource MaterialDesignHeadline6TextBlock}"
Margin="16,16,16,8"/>
<DataGrid ItemsSource="{Binding Tokens}"
SelectedItem="{Binding SelectedToken}"
AutoGenerateColumns="False"
CanUserAddRows="False"
CanUserDeleteRows="False"
IsReadOnly="True"
Style="{DynamicResource MaterialDesignDataGrid}">
<DataGrid.Columns>
<DataGridTextColumn Header="Name"
Binding="{Binding Name}"
Width="120"/>
<DataGridTextColumn Header="Symbol"
Binding="{Binding Symbol}"
Width="80"/>
<DataGridTextColumn Header="Supply"
Binding="{Binding TotalSupply}"
Width="120"/>
<DataGridTextColumn Header="Created"
Binding="{Binding CreationDate, StringFormat={}{0:MM/dd/yyyy}}"
Width="100"/>
<DataGridTextColumn Header="Expires"
Binding="{Binding ExpiryDate, StringFormat={}{0:MM/dd/yyyy}}"
Width="100"/>
<DataGridTextColumn Header="Status"
Binding="{Binding Status}"
Width="80"/>
</DataGrid.Columns>
</DataGrid>
</StackPanel>
</materialDesign:Card>
<!-- Create Token Panel -->
<materialDesign:Card Grid.Column="1" Margin="8,0,0,0">
<StackPanel Margin="16">
<TextBlock Text="Create New Token"
Style="{DynamicResource MaterialDesignHeadline6TextBlock}"
Margin="0,0,0,16"/>
<TextBox materialDesign:HintAssist.Hint="Token Name"
Text="{Binding NewTokenName}"
Margin="0,0,0,16"
Style="{DynamicResource MaterialDesignFloatingHintTextBox}"/>
<TextBox materialDesign:HintAssist.Hint="Symbol"
Text="{Binding NewTokenSymbol}"
Margin="0,0,0,16"
Style="{DynamicResource MaterialDesignFloatingHintTextBox}"/>
<TextBox materialDesign:HintAssist.Hint="Decimals"
Text="{Binding NewTokenDecimals}"
Margin="0,0,0,16"
Style="{DynamicResource MaterialDesignFloatingHintTextBox}"/>
<TextBox materialDesign:HintAssist.Hint="Total Supply"
Text="{Binding NewTokenSupply}"
Margin="0,0,0,16"
Style="{DynamicResource MaterialDesignFloatingHintTextBox}"/>
<TextBox materialDesign:HintAssist.Hint="Expiry Days (10-90)"
Text="{Binding NewTokenExpiryDays}"
Margin="0,0,0,16"
Style="{DynamicResource MaterialDesignFloatingHintTextBox}"/>
<ComboBox materialDesign:HintAssist.Hint="Owner Wallet"
ItemsSource="{Binding Wallets}"
SelectedItem="{Binding SelectedWallet}"
DisplayMemberPath="Name"
Margin="0,0,0,16"
Style="{DynamicResource MaterialDesignFloatingHintComboBox}"/>
<Button Content="CREATE TOKEN"
Command="{Binding CreateTokenCommand}"
IsEnabled="{Binding IsLoading, Converter={StaticResource InverseBooleanConverter}}"
Style="{DynamicResource MaterialDesignRaisedButton}"
Margin="0,8,0,0"/>
</StackPanel>
</materialDesign:Card>
</Grid>
</TabItem>
<!-- Wallets Tab -->
<TabItem Header="Wallets" Name="WalletsTab">
<Grid Margin="16">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="300"/>
</Grid.ColumnDefinitions>
<!-- Wallet List -->
<materialDesign:Card Grid.Column="0" Margin="0,0,8,0">
<StackPanel>
<TextBlock Text="My Wallets"
Style="{DynamicResource MaterialDesignHeadline6TextBlock}"
Margin="16,16,16,8"/>
<DataGrid ItemsSource="{Binding Wallets}"
SelectedItem="{Binding SelectedWallet}"
AutoGenerateColumns="False"
CanUserAddRows="False"
CanUserDeleteRows="False"
IsReadOnly="True"
Style="{DynamicResource MaterialDesignDataGrid}">
<DataGrid.Columns>
<DataGridTextColumn Header="Name"
Binding="{Binding Name}"
Width="120"/>
<DataGridTextColumn Header="Address"
Binding="{Binding Address}"
Width="200"/>
<DataGridTextColumn Header="TRX Balance"
Binding="{Binding TrxBalance, StringFormat={}{0:F2}}"
Width="100"/>
<DataGridTextColumn Header="Created"
Binding="{Binding CreatedDate, StringFormat={}{0:MM/dd/yyyy}}"
Width="100"/>
<DataGridCheckBoxColumn Header="Imported"
Binding="{Binding IsImported}"
Width="80"/>
</DataGrid.Columns>
</DataGrid>
<!-- Token Balances -->
<TextBlock Text="Token Balances"
Style="{DynamicResource MaterialDesignSubtitle1TextBlock}"
Margin="16,16,16,8"/>
<DataGrid ItemsSource="{Binding TokenBalances}"
AutoGenerateColumns="False"
CanUserAddRows="False"
CanUserDeleteRows="False"
IsReadOnly="True"
MaxHeight="200"
Style="{DynamicResource MaterialDesignDataGrid}">
<DataGrid.Columns>
<DataGridTextColumn Header="Token"
Binding="{Binding TokenSymbol}"
Width="80"/>
<DataGridTextColumn Header="Balance"
Binding="{Binding Balance, StringFormat={}{0:F4}}"
Width="120"/>
<DataGridTextColumn Header="Contract"
Binding="{Binding ContractAddress}"
Width="200"/>
</DataGrid.Columns>
</DataGrid>
</StackPanel>
</materialDesign:Card>
<!-- Wallet Actions Panel -->
<materialDesign:Card Grid.Column="1" Margin="8,0,0,0">
<StackPanel Margin="16">
<TextBlock Text="Wallet Actions"
Style="{DynamicResource MaterialDesignHeadline6TextBlock}"
Margin="0,0,0,16"/>
<!-- Create Wallet -->
<GroupBox Header="Create New Wallet" Margin="0,0,0,16">
<StackPanel Margin="8">
<TextBox materialDesign:HintAssist.Hint="Wallet Name"
Text="{Binding NewWalletName}"
Margin="0,0,0,8"
Style="{DynamicResource MaterialDesignFloatingHintTextBox}"/>
<Button Content="CREATE WALLET"
Command="{Binding CreateWalletCommand}"
Style="{DynamicResource MaterialDesignOutlinedButton}"/>
</StackPanel>
</GroupBox>
<!-- Import Wallet -->
<GroupBox Header="Import Wallet">
<StackPanel Margin="8">
<TextBox materialDesign:HintAssist.Hint="Wallet Name"
Text="{Binding NewWalletName}"
Margin="0,0,0,8"
Style="{DynamicResource MaterialDesignFloatingHintTextBox}"/>
<PasswordBox materialDesign:HintAssist.Hint="Private Key"
x:Name="PrivateKeyBox"
Margin="0,0,0,8"
Style="{DynamicResource MaterialDesignFloatingHintPasswordBox}"/>
<Button Content="IMPORT WALLET"
Command="{Binding ImportWalletCommand}"
Style="{DynamicResource MaterialDesignOutlinedButton}"/>
</StackPanel>
</GroupBox>
</StackPanel>
</materialDesign:Card>
</Grid>
</TabItem>
<!-- Transfer Tab -->
<TabItem Header="Transfer" Name="TransferTab">
<Grid Margin="16">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="400"/>
</Grid.ColumnDefinitions>
<!-- Transaction History -->
<materialDesign:Card Grid.Column="0" Margin="0,0,8,0">
<StackPanel>
<TextBlock Text="Transaction History"
Style="{DynamicResource MaterialDesignHeadline6TextBlock}"
Margin="16,16,16,8"/>
<DataGrid ItemsSource="{Binding Transactions}"
AutoGenerateColumns="False"
CanUserAddRows="False"
CanUserDeleteRows="False"
IsReadOnly="True"
Style="{DynamicResource MaterialDesignDataGrid}">
<DataGrid.Columns>
<DataGridTextColumn Header="Hash"
Binding="{Binding TransactionHash}"
Width="180">
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock">
<Setter Property="TextTrimming" Value="CharacterEllipsis"/>
<Setter Property="ToolTip" Value="{Binding TransactionHash}"/>
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
<DataGridTextColumn Header="From"
Binding="{Binding FromAddress}"
Width="120">
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock">
<Setter Property="TextTrimming" Value="CharacterEllipsis"/>
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
<DataGridTextColumn Header="To"
Binding="{Binding ToAddress}"
Width="120">
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock">
<Setter Property="TextTrimming" Value="CharacterEllipsis"/>
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
<DataGridTextColumn Header="Amount"
Binding="{Binding Amount, StringFormat={}{0:F4}}"
Width="100"/>
<DataGridTextColumn Header="Token"
Binding="{Binding TokenSymbol}"
Width="80"/>
<DataGridTemplateColumn Header="Status" Width="100">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Border CornerRadius="10"
Padding="8,4">
<Border.Style>
<Style TargetType="Border">
<Style.Triggers>
<DataTrigger Binding="{Binding Status}" Value="Confirmed">
<Setter Property="Background" Value="LightGreen"/>
</DataTrigger>
<DataTrigger Binding="{Binding Status}" Value="Pending">
<Setter Property="Background" Value="LightYellow"/>
</DataTrigger>
<DataTrigger Binding="{Binding Status}" Value="Failed">
<Setter Property="Background" Value="LightCoral"/>
</DataTrigger>
</Style.Triggers>
</Style>
</Border.Style>
<TextBlock Text="{Binding Status}"
FontWeight="Bold"
HorizontalAlignment="Center"/>
</Border>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTextColumn Header="Time"
Binding="{Binding Timestamp, StringFormat={}{0:MM/dd/yyyy HH:mm}}"
Width="120"/>
</DataGrid.Columns>
</DataGrid>
</StackPanel>
</materialDesign:Card>
<!-- Transfer Panel -->
<materialDesign:Card Grid.Column="1" Margin="8,0,0,0">
<StackPanel Margin="16">
<TextBlock Text="Transfer Tokens"
Style="{DynamicResource MaterialDesignHeadline6TextBlock}"
Margin="0,0,0,16"/>
<ComboBox materialDesign:HintAssist.Hint="From Wallet"
ItemsSource="{Binding Wallets}"
SelectedItem="{Binding SelectedWallet}"
DisplayMemberPath="Name"
Margin="0,0,0,16"
Style="{DynamicResource MaterialDesignFloatingHintComboBox}"/>
<ComboBox materialDesign:HintAssist.Hint="Token"
ItemsSource="{Binding TokenBalances}"
SelectedItem="{Binding SelectedTokenBalance}"
DisplayMemberPath="TokenSymbol"
Margin="0,0,0,16"
Style="{DynamicResource MaterialDesignFloatingHintComboBox}"/>
<TextBlock Text="{Binding SelectedTokenBalance.Balance, StringFormat='Available: {0:F4}'}"
Style="{DynamicResource MaterialDesignCaptionTextBlock}"
Margin="0,0,0,8"
Foreground="{DynamicResource MaterialDesignBodyLight}"/>
<TextBox materialDesign:HintAssist.Hint="To Address"
Text="{Binding TransferToAddress}"
Margin="0,0,0,16"
Style="{DynamicResource MaterialDesignFloatingHintTextBox}"/>
<TextBox materialDesign:HintAssist.Hint="Amount"
Text="{Binding TransferAmount}"
Margin="0,0,0,16"
Style="{DynamicResource MaterialDesignFloatingHintTextBox}"/>
<Button Content="TRANSFER"
Command="{Binding TransferTokenCommand}"
IsEnabled="{Binding IsLoading, Converter={StaticResource InverseBooleanConverter}}"
Style="{DynamicResource MaterialDesignRaisedButton}"
Margin="0,8,0,0"/>
<ProgressBar IsIndeterminate="True"
Visibility="{Binding IsLoading, Converter={StaticResource BoolToVisibilityConverter}}"
Margin="0,16,0,0"/>
</StackPanel>
</materialDesign:Card>
</Grid>
</TabItem>
</TabControl>
<!-- Status Bar -->
<materialDesign:ColorZone Grid.Row="2"
Mode="PrimaryDark"
Padding="16,8">
<TextBlock Text="{Binding StatusMessage}"
Style="{DynamicResource MaterialDesignCaptionTextBlock}"/>
</materialDesign:ColorZone>
</Grid>
</Window>