mirror of
https://github.com/ApfelTeeSaft/NESDecompiler.git
synced 2026-08-26 19:33:30 +00:00
358 lines
23 KiB
XML
358 lines
23 KiB
XML
<Window x:Class="NESDecompiler.GUI.MainWindow"
|
|
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
|
|
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
|
|
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
|
|
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
|
|
xmlns:local="clr-namespace:NESDecompiler.GUI"
|
|
xmlns:avalonEdit="http://icsharpcode.net/sharpdevelop/avalonedit"
|
|
mc:Ignorable="d"
|
|
Title="NES Decompiler" Height="800" Width="1200">
|
|
|
|
<Window.Resources>
|
|
<BooleanToVisibilityConverter x:Key="BoolToVis" />
|
|
</Window.Resources>
|
|
|
|
<Grid>
|
|
<Grid.RowDefinitions>
|
|
<RowDefinition Height="Auto"/>
|
|
<RowDefinition Height="*"/>
|
|
<RowDefinition Height="Auto"/>
|
|
</Grid.RowDefinitions>
|
|
|
|
<Menu Grid.Row="0">
|
|
<MenuItem Header="_File">
|
|
<MenuItem Header="_Open ROM..." Command="{Binding OpenROMCommand}"/>
|
|
<Separator/>
|
|
<MenuItem Header="_Save Disassembly..." Command="{Binding SaveDisassemblyCommand}" IsEnabled="{Binding IsROMLoaded}"/>
|
|
<MenuItem Header="Save _C Code..." Command="{Binding SaveCCodeCommand}" IsEnabled="{Binding IsROMLoaded}"/>
|
|
<MenuItem Header="Save _Header..." Command="{Binding SaveHeaderCommand}" IsEnabled="{Binding IsROMLoaded}"/>
|
|
<MenuItem Header="Save to _Workspace..." Command="{Binding SaveWorkspaceCommand}" IsEnabled="{Binding IsROMLoaded}"/>
|
|
<MenuItem Header="E_xport to VS2022..." Command="{Binding ExportToVSCommand}" IsEnabled="{Binding IsDecompiled}"/>
|
|
<Separator/>
|
|
<MenuItem Header="E_xit" Command="{Binding ExitCommand}"/>
|
|
</MenuItem>
|
|
<MenuItem Header="_Project">
|
|
<MenuItem Header="_New Project" Command="{Binding NewProjectCommand}"/>
|
|
<MenuItem Header="_Open Project..." Command="{Binding OpenProjectCommand}"/>
|
|
<MenuItem Header="_Save Project" Command="{Binding SaveProjectCommand}" IsEnabled="{Binding HasProject}"/>
|
|
<MenuItem Header="Save Project _As..." Command="{Binding SaveProjectAsCommand}" IsEnabled="{Binding HasProject}"/>
|
|
<Separator/>
|
|
<MenuItem Header="Add _ROM to Project..." Command="{Binding AddROMCommand}" IsEnabled="{Binding HasProject}"/>
|
|
<MenuItem Header="_Remove Active ROM" Command="{Binding RemoveROMCommand}" IsEnabled="{Binding IsROMLoaded}"/>
|
|
</MenuItem>
|
|
<MenuItem Header="_Actions">
|
|
<MenuItem Header="_Disassemble" Command="{Binding DisassembleCommand}" IsEnabled="{Binding IsROMLoaded}"/>
|
|
<MenuItem Header="_Decompile" Command="{Binding DecompileCommand}" IsEnabled="{Binding IsDisassembled}"/>
|
|
</MenuItem>
|
|
<MenuItem Header="_View">
|
|
<MenuItem Header="ROM _Info" Command="{Binding ViewROMInfoCommand}" IsEnabled="{Binding IsROMLoaded}"/>
|
|
<MenuItem Header="_Variables" Command="{Binding ViewVariablesCommand}" IsEnabled="{Binding IsDecompiled}"/>
|
|
<MenuItem Header="_Functions" Command="{Binding ViewFunctionsCommand}" IsEnabled="{Binding IsDecompiled}"/>
|
|
</MenuItem>
|
|
<MenuItem Header="_Help">
|
|
<MenuItem Header="_About" Command="{Binding AboutCommand}"/>
|
|
</MenuItem>
|
|
</Menu>
|
|
|
|
<Grid Grid.Row="1">
|
|
<Grid.ColumnDefinitions>
|
|
<ColumnDefinition Width="250"/>
|
|
<ColumnDefinition Width="*"/>
|
|
</Grid.ColumnDefinitions>
|
|
|
|
<Grid Grid.Column="0">
|
|
<Grid.RowDefinitions>
|
|
<RowDefinition Height="Auto"/>
|
|
<RowDefinition Height="*"/>
|
|
</Grid.RowDefinitions>
|
|
|
|
<TextBlock Grid.Row="0" Text="Project Explorer" Margin="5" FontWeight="Bold"/>
|
|
|
|
<TreeView Grid.Row="1" ItemsSource="{Binding ProjectItems}"
|
|
SelectedItemChanged="TreeView_SelectedItemChanged">
|
|
<TreeView.ItemTemplate>
|
|
<HierarchicalDataTemplate ItemsSource="{Binding Children}">
|
|
<StackPanel Orientation="Horizontal">
|
|
<Image Source="{Binding Icon}" Width="16" Height="16" Margin="0,0,5,0"/>
|
|
<TextBlock Text="{Binding Name}"/>
|
|
</StackPanel>
|
|
</HierarchicalDataTemplate>
|
|
</TreeView.ItemTemplate>
|
|
<TreeView.ItemContainerStyle>
|
|
<Style TargetType="{x:Type TreeViewItem}">
|
|
<Setter Property="IsExpanded" Value="{Binding IsExpanded, Mode=TwoWay}"/>
|
|
</Style>
|
|
</TreeView.ItemContainerStyle>
|
|
</TreeView>
|
|
</Grid>
|
|
<!--Style="{StaticResource DarkModeToggleSwitch}"-->
|
|
<Grid Grid.Column="1">
|
|
<Grid.RowDefinitions>
|
|
<RowDefinition Height="Auto"/>
|
|
<RowDefinition Height="*"/>
|
|
</Grid.RowDefinitions>
|
|
|
|
<TabControl Grid.Row="1" x:Name="mainTabControl">
|
|
<TabItem Header="Welcome" IsSelected="True" Background="{DynamicResource TertiaryBackgroundBrush}" Foreground="{DynamicResource PrimaryForegroundBrush}">
|
|
<Grid Background="{DynamicResource SecondaryBackgroundBrush}">
|
|
<Grid.RowDefinitions>
|
|
<RowDefinition Height="Auto"/>
|
|
<RowDefinition Height="Auto"/>
|
|
<RowDefinition Height="Auto"/>
|
|
<RowDefinition Height="Auto"/>
|
|
<RowDefinition Height="Auto"/>
|
|
<RowDefinition Height="*"/>
|
|
</Grid.RowDefinitions>
|
|
|
|
<TextBlock Grid.Row="0" Text="NES Decompiler" FontSize="24" FontWeight="Bold" HorizontalAlignment="Center" Foreground="{DynamicResource PrimaryForegroundBrush}"/>
|
|
<TextBlock Grid.Row="1" Text="Static Decompiler for NES/6502 ROMs" FontSize="16" Margin="0,10,0,30" HorizontalAlignment="Center" Foreground="{DynamicResource PrimaryForegroundBrush}"/>
|
|
|
|
<!-- Theme Toggle -->
|
|
<!--<StackPanel Grid.Row="2" Orientation="Horizontal" HorizontalAlignment="Center" Margin="0,0,0,20">
|
|
<TextBlock Text="Light" VerticalAlignment="Center" Margin="0,0,10,0" Foreground="{DynamicResource PrimaryForegroundBrush}"/>
|
|
<ToggleButton
|
|
IsChecked="{Binding IsDarkTheme}"
|
|
Command="{Binding ToggleThemeCommand}"
|
|
CommandParameter="{Binding IsChecked, RelativeSource={RelativeSource Self}}"
|
|
VerticalAlignment="Center"/>
|
|
<TextBlock Text="Dark" VerticalAlignment="Center" Margin="10,0,0,0" Foreground="{DynamicResource PrimaryForegroundBrush}"/>
|
|
</StackPanel>-->
|
|
|
|
<StackPanel Grid.Row="3" Orientation="Horizontal" HorizontalAlignment="Center" Margin="0,0,0,20">
|
|
<Button Content="New Project" Width="150" Height="40" Command="{Binding NewProjectCommand}" Margin="0,0,20,0" Background="{DynamicResource TertiaryBackgroundBrush}" Foreground="{DynamicResource PrimaryForegroundBrush}"/>
|
|
<Button Content="Open Project..." Width="150" Height="40" Command="{Binding OpenProjectCommand}" Margin="0,0,20,0" Background="{DynamicResource TertiaryBackgroundBrush}" Foreground="{DynamicResource PrimaryForegroundBrush}"/>
|
|
<Button Content="Open ROM..." Width="150" Height="40" Command="{Binding OpenROMCommand}" Background="{DynamicResource TertiaryBackgroundBrush}" Foreground="{DynamicResource PrimaryForegroundBrush}"/>
|
|
</StackPanel>
|
|
|
|
<Grid Grid.Row="4">
|
|
<Grid.ColumnDefinitions>
|
|
<ColumnDefinition Width="*"/>
|
|
<ColumnDefinition Width="*"/>
|
|
</Grid.ColumnDefinitions>
|
|
|
|
<StackPanel Grid.Column="0" Margin="10">
|
|
<TextBlock Text="Recent Projects:" FontWeight="Bold" Margin="0,0,0,10" Foreground="{DynamicResource PrimaryForegroundBrush}"/>
|
|
<ListView Height="200" Width="350" ItemsSource="{Binding RecentProjectsList}"
|
|
MouseDoubleClick="RecentProjects_MouseDoubleClick"
|
|
Background="{DynamicResource TertiaryBackgroundBrush}"
|
|
Foreground="{DynamicResource PrimaryForegroundBrush}"
|
|
BorderBrush="{DynamicResource BorderBrush}">
|
|
<ListView.ItemTemplate>
|
|
<DataTemplate>
|
|
<StackPanel Orientation="Vertical">
|
|
<TextBlock Text="{Binding Name}" FontWeight="Bold" Foreground="{DynamicResource PrimaryForegroundBrush}"/>
|
|
<TextBlock Text="{Binding FilePath}" FontSize="10" Foreground="{DynamicResource SecondaryForegroundBrush}"/>
|
|
<TextBlock Text="{Binding LastOpened, StringFormat='Last opened: {0}'}" FontSize="10" Foreground="{DynamicResource SecondaryForegroundBrush}"/>
|
|
</StackPanel>
|
|
</DataTemplate>
|
|
</ListView.ItemTemplate>
|
|
</ListView>
|
|
</StackPanel>
|
|
|
|
<StackPanel Grid.Column="1" Margin="10">
|
|
<TextBlock Text="Recent Workspaces:" FontWeight="Bold" Margin="0,0,0,10" Foreground="{DynamicResource PrimaryForegroundBrush}"/>
|
|
<ListView Height="200" Width="350" ItemsSource="{Binding RecentWorkspaces}"
|
|
MouseDoubleClick="RecentWorkspaces_MouseDoubleClick"
|
|
Background="{DynamicResource TertiaryBackgroundBrush}"
|
|
Foreground="{DynamicResource PrimaryForegroundBrush}"
|
|
BorderBrush="{DynamicResource BorderBrush}">
|
|
<ListView.ItemTemplate>
|
|
<DataTemplate>
|
|
<TextBlock Text="{Binding}" Foreground="{DynamicResource PrimaryForegroundBrush}"/>
|
|
</DataTemplate>
|
|
</ListView.ItemTemplate>
|
|
</ListView>
|
|
</StackPanel>
|
|
</Grid>
|
|
|
|
<TextBlock Grid.Row="5" Text="Recent Files:" FontWeight="Bold" Margin="10,20,0,10" Foreground="{DynamicResource PrimaryForegroundBrush}"/>
|
|
<ListBox Grid.Row="5" ItemsSource="{Binding RecentFiles}" Height="100" Margin="10,50,10,10"
|
|
MouseDoubleClick="RecentFiles_MouseDoubleClick"
|
|
Background="{DynamicResource TertiaryBackgroundBrush}"
|
|
Foreground="{DynamicResource PrimaryForegroundBrush}"
|
|
BorderBrush="{DynamicResource BorderBrush}"/>
|
|
</Grid>
|
|
</TabItem>
|
|
|
|
<TabItem Header="Disassembly" Visibility="{Binding IsDisassembled, Converter={StaticResource BoolToVis}}">
|
|
<Grid>
|
|
<avalonEdit:TextEditor x:Name="disassemblyEditor"
|
|
FontFamily="Consolas"
|
|
FontSize="12"
|
|
IsReadOnly="True"
|
|
ShowLineNumbers="True"
|
|
WordWrap="False">
|
|
</avalonEdit:TextEditor>
|
|
</Grid>
|
|
</TabItem>
|
|
|
|
<TabItem Header="C Code" Visibility="{Binding IsDecompiled, Converter={StaticResource BoolToVis}}">
|
|
<Grid>
|
|
<avalonEdit:TextEditor x:Name="cCodeEditor"
|
|
FontFamily="Consolas"
|
|
FontSize="12"
|
|
IsReadOnly="True"
|
|
ShowLineNumbers="True"
|
|
WordWrap="False">
|
|
</avalonEdit:TextEditor>
|
|
</Grid>
|
|
</TabItem>
|
|
|
|
<TabItem Header="Header" Visibility="{Binding IsDecompiled, Converter={StaticResource BoolToVis}}">
|
|
<Grid>
|
|
<avalonEdit:TextEditor x:Name="headerEditor"
|
|
FontFamily="Consolas"
|
|
FontSize="12"
|
|
IsReadOnly="True"
|
|
ShowLineNumbers="True"
|
|
WordWrap="False">
|
|
</avalonEdit:TextEditor>
|
|
</Grid>
|
|
</TabItem>
|
|
|
|
<TabItem Header="Variables" Name="VariablesTab" Visibility="{Binding IsDecompiled, Converter={StaticResource BoolToVis}}">
|
|
<Grid>
|
|
<Grid.RowDefinitions>
|
|
<RowDefinition Height="Auto"/>
|
|
<RowDefinition Height="*"/>
|
|
</Grid.RowDefinitions>
|
|
|
|
<ToolBar Grid.Row="0">
|
|
<Button Content="Refresh" Command="{Binding ViewVariablesCommand}"/>
|
|
<Separator/>
|
|
<Grid Width="200" Margin="5,0">
|
|
<TextBox Text="{Binding FunctionSearchText, UpdateSourceTrigger=PropertyChanged}" />
|
|
<TextBlock IsHitTestVisible="False" Text="Search functions..." Foreground="Gray" Margin="5,0,0,0"
|
|
VerticalAlignment="Center">
|
|
<TextBlock.Style>
|
|
<Style TargetType="TextBlock">
|
|
<Setter Property="Visibility" Value="Collapsed"/>
|
|
<Style.Triggers>
|
|
<DataTrigger Binding="{Binding FunctionSearchText}" Value="">
|
|
<Setter Property="Visibility" Value="Visible"/>
|
|
</DataTrigger>
|
|
</Style.Triggers>
|
|
</Style>
|
|
</TextBlock.Style>
|
|
</TextBlock>
|
|
</Grid>
|
|
<Button Content="Search" Command="{Binding SearchVariablesCommand}"/>
|
|
</ToolBar>
|
|
|
|
<DataGrid Grid.Row="1"
|
|
ItemsSource="{Binding VariableList}"
|
|
SelectedItem="{Binding SelectedVariable}"
|
|
AutoGenerateColumns="False"
|
|
CanUserAddRows="False"
|
|
CanUserSortColumns="True"
|
|
Background="{DynamicResource SecondaryBackgroundBrush}"
|
|
Foreground="{DynamicResource PrimaryForegroundBrush}"
|
|
BorderBrush="{DynamicResource BorderBrush}"
|
|
RowBackground="{DynamicResource SecondaryBackgroundBrush}"
|
|
AlternatingRowBackground="{DynamicResource TertiaryBackgroundBrush}"
|
|
HorizontalGridLinesBrush="{DynamicResource BorderBrush}"
|
|
VerticalGridLinesBrush="{DynamicResource BorderBrush}">
|
|
<DataGrid.ContextMenu>
|
|
<ContextMenu>
|
|
<MenuItem Header="Jump to Definition" Command="{Binding JumpToVariableDefinitionCommand}"/>
|
|
<MenuItem Header="Find All References" Command="{Binding FindVariableReferencesCommand}"/>
|
|
<Separator/>
|
|
<MenuItem Header="Rename Variable" Command="{Binding RenameVariableCommand}"/>
|
|
</ContextMenu>
|
|
</DataGrid.ContextMenu>
|
|
<DataGrid.Columns>
|
|
<DataGridTextColumn Header="Address" Binding="{Binding AddressHex}" IsReadOnly="True"/>
|
|
<DataGridTextColumn Header="Name" Binding="{Binding Name}" IsReadOnly="False"/>
|
|
<DataGridTextColumn Header="Type" Binding="{Binding TypeName}" IsReadOnly="False"/>
|
|
<DataGridTextColumn Header="Size" Binding="{Binding Size}" IsReadOnly="True"/>
|
|
<DataGridTextColumn Header="Access" Binding="{Binding AccessType}" IsReadOnly="True"/>
|
|
<DataGridTextColumn Header="Description" Binding="{Binding Description}" IsReadOnly="False" Width="*"/>
|
|
</DataGrid.Columns>
|
|
</DataGrid>
|
|
</Grid>
|
|
</TabItem>
|
|
|
|
<TabItem Header="Functions" Name="FunctionsTab" Visibility="{Binding IsDecompiled, Converter={StaticResource BoolToVis}}">
|
|
<Grid>
|
|
<Grid.RowDefinitions>
|
|
<RowDefinition Height="Auto"/>
|
|
<RowDefinition Height="*"/>
|
|
</Grid.RowDefinitions>
|
|
|
|
<ToolBar Grid.Row="0">
|
|
<Button Content="Refresh" Command="{Binding ViewFunctionsCommand}"/>
|
|
<Separator/>
|
|
<Grid Width="200" Margin="5,0">
|
|
<TextBox Text="{Binding VariableSearchText, UpdateSourceTrigger=PropertyChanged}" />
|
|
<TextBlock IsHitTestVisible="False" Text="Search variables..." Foreground="Gray" Margin="5,0,0,0"
|
|
VerticalAlignment="Center">
|
|
<TextBlock.Style>
|
|
<Style TargetType="TextBlock">
|
|
<Setter Property="Visibility" Value="Collapsed"/>
|
|
<Style.Triggers>
|
|
<DataTrigger Binding="{Binding VariableSearchText}" Value="">
|
|
<Setter Property="Visibility" Value="Visible"/>
|
|
</DataTrigger>
|
|
</Style.Triggers>
|
|
</Style>
|
|
</TextBlock.Style>
|
|
</TextBlock>
|
|
</Grid>
|
|
<Button Content="Search" Command="{Binding SearchFunctionsCommand}"/>
|
|
</ToolBar>
|
|
|
|
<DataGrid Grid.Row="1"
|
|
ItemsSource="{Binding FunctionList}"
|
|
SelectedItem="{Binding SelectedFunction}"
|
|
AutoGenerateColumns="False"
|
|
CanUserAddRows="False"
|
|
CanUserSortColumns="True"
|
|
Background="{DynamicResource SecondaryBackgroundBrush}"
|
|
Foreground="{DynamicResource PrimaryForegroundBrush}"
|
|
BorderBrush="{DynamicResource BorderBrush}"
|
|
RowBackground="{DynamicResource SecondaryBackgroundBrush}"
|
|
AlternatingRowBackground="{DynamicResource TertiaryBackgroundBrush}"
|
|
HorizontalGridLinesBrush="{DynamicResource BorderBrush}"
|
|
VerticalGridLinesBrush="{DynamicResource BorderBrush}">
|
|
<DataGrid.ContextMenu>
|
|
<ContextMenu>
|
|
<MenuItem Header="Jump to Definition" Command="{Binding JumpToFunctionDefinitionCommand}"/>
|
|
<MenuItem Header="Find All References" Command="{Binding FindFunctionReferencesCommand}"/>
|
|
<Separator/>
|
|
<MenuItem Header="Rename Function" Command="{Binding RenameFunctionCommand}"/>
|
|
</ContextMenu>
|
|
</DataGrid.ContextMenu>
|
|
<DataGrid.Columns>
|
|
<DataGridTextColumn Header="Address" Binding="{Binding AddressHex}" IsReadOnly="True"/>
|
|
<DataGridTextColumn Header="Name" Binding="{Binding Name}" IsReadOnly="False"/>
|
|
<DataGridTextColumn Header="Instructions" Binding="{Binding InstructionCount}" IsReadOnly="True"/>
|
|
<DataGridTextColumn Header="Variables" Binding="{Binding VariableCount}" IsReadOnly="True"/>
|
|
<DataGridTextColumn Header="Called Functions" Binding="{Binding CalledFunctionCount}" IsReadOnly="True"/>
|
|
<DataGridTextColumn Header="Description" Binding="{Binding Description}" IsReadOnly="False" Width="*"/>
|
|
</DataGrid.Columns>
|
|
</DataGrid>
|
|
</Grid>
|
|
</TabItem>
|
|
</TabControl>
|
|
</Grid>
|
|
</Grid>
|
|
|
|
<StatusBar Grid.Row="2">
|
|
<StatusBarItem>
|
|
<TextBlock Text="{Binding StatusText}"/>
|
|
</StatusBarItem>
|
|
<Separator/>
|
|
<StatusBarItem>
|
|
<ProgressBar Width="100" Height="15" IsIndeterminate="{Binding IsProcessing}"/>
|
|
</StatusBarItem>
|
|
</StatusBar>
|
|
|
|
<Grid Grid.Row="1" Background="#80000000"
|
|
Visibility="{Binding IsProcessing, Converter={StaticResource BoolToVis}}">
|
|
<StackPanel VerticalAlignment="Center" HorizontalAlignment="Center">
|
|
<TextBlock Text="{Binding ProcessingText}" Foreground="White" FontSize="16" Margin="0,0,0,10"/>
|
|
<ProgressBar Width="300" Height="20" IsIndeterminate="True"/>
|
|
</StackPanel>
|
|
</Grid>
|
|
</Grid>
|
|
</Window> |