We want to get types into the IDA output, and to do that we need accurate types for the Il2Cpp structures. Unfortunately, some crucial types like Il2CppClass change between versions without any corresponding metadata changes, meaning that we have to manually identify the version outside of the Inspector somehow (e.g. by looking at the version number embedded in Unity asset files). This patch adds header files for *every* known Unity version from 5.3.0 to 2019.3.8, merging them into version ranges where header files don't change. It also adds front-end support for supplying the version number in both the CLI and GUI. The GUI is given the ability to guess the version number approximately to reduce the number of choices presented to the user.
432 lines
28 KiB
XML
432 lines
28 KiB
XML
<Window x:Class="Il2CppInspectorGUI.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:Il2CppInspectorGUI"
|
|
xmlns:gif="https://github.com/XamlAnimatedGif/XamlAnimatedGif"
|
|
mc:Ignorable="d"
|
|
Title="Il2CppInspector" Height="700" Width="990" Background="White"
|
|
WindowStartupLocation="CenterScreen"
|
|
ContentRendered="MainWindow_OnContentRendered">
|
|
<Window.Resources>
|
|
<!-- Our favourite colours -->
|
|
<SolidColorBrush x:Key="MicrosoftBlue" Color="#00A2ED"/>
|
|
<SolidColorBrush x:Key="MicrosoftGreen" Color="#7DB700"/>
|
|
<SolidColorBrush x:Key="WindowsBlue" Color="#357EC7"/>
|
|
|
|
<!-- Light box button -->
|
|
<Style x:Key="FocusVisual">
|
|
<Setter Property="Control.Template">
|
|
<Setter.Value>
|
|
<ControlTemplate>
|
|
<Rectangle Margin="2" StrokeDashArray="1 2" SnapsToDevicePixels="true" StrokeThickness="1" Stroke="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/>
|
|
</ControlTemplate>
|
|
</Setter.Value>
|
|
</Setter>
|
|
</Style>
|
|
<SolidColorBrush x:Key="Button.Static.Background" Color="#FFDDDDDD"/>
|
|
<SolidColorBrush x:Key="Button.Static.Border" Color="Gray"/>
|
|
<SolidColorBrush x:Key="Button.MouseOver.Background" Color="#FFBEE6FD"/>
|
|
<SolidColorBrush x:Key="Button.MouseOver.Border" Color="#FF3C7FB1"/>
|
|
<SolidColorBrush x:Key="Button.Pressed.Background" Color="#FFC4E5F6"/>
|
|
<SolidColorBrush x:Key="Button.Pressed.Border" Color="#FF2C628B"/>
|
|
<SolidColorBrush x:Key="Button.Disabled.Background" Color="#FFF4F4F4"/>
|
|
<SolidColorBrush x:Key="Button.Disabled.Border" Color="#FFADB2B5"/>
|
|
<SolidColorBrush x:Key="Button.Disabled.Foreground" Color="#FF838383"/>
|
|
<Style x:Key="LightBoxButton" TargetType="{x:Type Button}">
|
|
<Setter Property="FocusVisualStyle" Value="{StaticResource FocusVisual}"/>
|
|
<Setter Property="Background" Value="{StaticResource Button.Static.Background}"/>
|
|
<Setter Property="BorderBrush" Value="{StaticResource Button.Static.Border}"/>
|
|
<Setter Property="Foreground" Value="{StaticResource MicrosoftBlue}"/>
|
|
<Setter Property="BorderThickness" Value="1"/>
|
|
<Setter Property="HorizontalContentAlignment" Value="Center"/>
|
|
<Setter Property="VerticalContentAlignment" Value="Center"/>
|
|
<Setter Property="Padding" Value="1"/>
|
|
<Setter Property="FontSize" Value="28"/>
|
|
<Setter Property="Template">
|
|
<Setter.Value>
|
|
<ControlTemplate TargetType="{x:Type Button}">
|
|
<Border x:Name="border" Background="White" BorderThickness="2" CornerRadius="2" BorderBrush="{TemplateBinding BorderBrush}" SnapsToDevicePixels="true">
|
|
<ContentPresenter x:Name="contentPresenter" Focusable="False" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" RecognizesAccessKey="True" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" />
|
|
</Border>
|
|
<ControlTemplate.Triggers>
|
|
<Trigger Property="IsDefaulted" Value="true">
|
|
<Setter Property="BorderBrush" TargetName="border" Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}"/>
|
|
</Trigger>
|
|
<Trigger Property="IsMouseOver" Value="true">
|
|
<Setter Property="Background" TargetName="border" Value="{StaticResource Button.MouseOver.Background}"/>
|
|
<Setter Property="BorderBrush" TargetName="border" Value="{StaticResource Button.MouseOver.Border}"/>
|
|
</Trigger>
|
|
<Trigger Property="IsPressed" Value="true">
|
|
<Setter Property="Background" TargetName="border" Value="{StaticResource Button.Pressed.Background}"/>
|
|
<Setter Property="BorderBrush" TargetName="border" Value="{StaticResource Button.Pressed.Border}"/>
|
|
</Trigger>
|
|
<Trigger Property="IsEnabled" Value="false">
|
|
<Setter Property="Background" TargetName="border" Value="{StaticResource Button.Disabled.Background}"/>
|
|
<Setter Property="BorderBrush" TargetName="border" Value="{StaticResource Button.Disabled.Border}"/>
|
|
<Setter Property="TextElement.Foreground" TargetName="contentPresenter" Value="{StaticResource Button.Disabled.Foreground}"/>
|
|
</Trigger>
|
|
</ControlTemplate.Triggers>
|
|
</ControlTemplate>
|
|
</Setter.Value>
|
|
</Setter>
|
|
</Style>
|
|
|
|
<!-- Image list -->
|
|
<DataTemplate x:Key="ImageListTemplate">
|
|
<TextBlock>
|
|
<TextBlock.Text>
|
|
<MultiBinding StringFormat="{}{2}-bit {1} ({0})">
|
|
<Binding Path="Package.BinaryImage.Format"></Binding>
|
|
<Binding Path="Package.BinaryImage.Arch"></Binding>
|
|
<Binding Path="Package.BinaryImage.Bits"></Binding>
|
|
</MultiBinding>
|
|
</TextBlock.Text>
|
|
</TextBlock>
|
|
</DataTemplate>
|
|
|
|
<!-- Namespace checkbox tree items -->
|
|
<HierarchicalDataTemplate x:Key="NamespaceTreeItemTemplate" DataType="{x:Type local:CheckboxNode}" ItemsSource="{Binding Children}">
|
|
<CheckBox Focusable="False" IsChecked="{Binding IsChecked}" VerticalAlignment="Center" Content="{Binding Name}"/>
|
|
</HierarchicalDataTemplate>
|
|
</Window.Resources>
|
|
|
|
<!-- Window content -->
|
|
<Grid>
|
|
<!-- Main content -->
|
|
<Grid Margin="5">
|
|
<Grid.RowDefinitions>
|
|
<RowDefinition Height ="100*" />
|
|
<RowDefinition Height ="40" />
|
|
</Grid.RowDefinitions>
|
|
<Grid.ColumnDefinitions>
|
|
<ColumnDefinition Width="300"></ColumnDefinition>
|
|
<ColumnDefinition Width="25"></ColumnDefinition>
|
|
<ColumnDefinition Width="*"></ColumnDefinition>
|
|
</Grid.ColumnDefinitions>
|
|
<DockPanel DockPanel.Dock="Left">
|
|
<!-- List of images in the binary file -->
|
|
<Label DockPanel.Dock="Top" Foreground="{StaticResource WindowsBlue}" FontSize="18">Select image</Label>
|
|
|
|
<ListBox DockPanel.Dock="Top" Name="lstImages" ItemTemplate="{StaticResource ImageListTemplate}" Height="80" SelectionChanged="LstImages_OnSelectionChanged"/>
|
|
|
|
<!-- Footer text -->
|
|
<TextBlock DockPanel.Dock="Bottom" TextWrapping="WrapWithOverflow" Margin="5">
|
|
If you find this tool useful, please donate to help support its continued development!<LineBreak/>
|
|
Donate via <Hyperlink NavigateUri="http://paypal.me/djkaty" RequestNavigate="Hyperlink_OnRequestNavigate">PayPal</Hyperlink><LineBreak/>
|
|
Donate with bitcoin:<LineBreak/><TextBox IsReadOnly="True">3FoRUqUXgYj8NY8sMQfhX6vv9LqR3e2kzz</TextBox><LineBreak/>
|
|
<LineBreak/>
|
|
<Hyperlink NavigateUri="https://github.com/djkaty/Il2CppInspector" RequestNavigate="Hyperlink_OnRequestNavigate">Il2CppInspector on GitHub</Hyperlink><LineBreak/>
|
|
<Hyperlink NavigateUri="http://www.djkaty.com" RequestNavigate="Hyperlink_OnRequestNavigate">www.djkaty.com</Hyperlink><LineBreak/>
|
|
© Katy Coe 2017-2020
|
|
</TextBlock>
|
|
|
|
<!-- Image details view -->
|
|
<Label DockPanel.Dock="Top" Foreground="{StaticResource WindowsBlue}" FontSize="18">Image information</Label>
|
|
|
|
<Grid DockPanel.Dock="Top" Name="gridImageDetails" DataContext="{Binding ElementName=lstImages, Path=SelectedItem.Package}">
|
|
<Grid.RowDefinitions>
|
|
<RowDefinition Height="Auto"></RowDefinition>
|
|
<RowDefinition Height="Auto"></RowDefinition>
|
|
<RowDefinition Height="Auto"></RowDefinition>
|
|
<RowDefinition Height="Auto"></RowDefinition>
|
|
<RowDefinition Height="Auto"></RowDefinition>
|
|
<RowDefinition Height="Auto"></RowDefinition>
|
|
<RowDefinition Height="Auto"></RowDefinition>
|
|
<RowDefinition Height="Auto"></RowDefinition>
|
|
<RowDefinition Height="Auto"></RowDefinition>
|
|
</Grid.RowDefinitions>
|
|
<Grid.ColumnDefinitions>
|
|
<ColumnDefinition Width="70*"></ColumnDefinition>
|
|
<ColumnDefinition Width="30*"></ColumnDefinition>
|
|
</Grid.ColumnDefinitions>
|
|
<Label Grid.Row="0" Grid.Column="0" Content="IL2CPP version"></Label>
|
|
<Label Grid.Row="0" Grid.Column="1" Content="{Binding Path=Version}"></Label>
|
|
<Label Grid.Row="1" Grid.Column="0" Content="Container format"></Label>
|
|
<Label Grid.Row="1" Grid.Column="1" Content="{Binding Path=BinaryImage.Format}"></Label>
|
|
<Label Grid.Row="2" Grid.Column="0" Content="Container endianness"></Label>
|
|
<Label Grid.Row="2" Grid.Column="1" Content="{Binding Path=BinaryImage.Endianness}"></Label>
|
|
<Label Grid.Row="3" Grid.Column="0" Content="Architecture"></Label>
|
|
<Label Grid.Row="3" Grid.Column="1" Content="{Binding Path=BinaryImage.Arch}"></Label>
|
|
<Label Grid.Row="4" Grid.Column="0" Content="Architecture word size"></Label>
|
|
<Label Grid.Row="4" Grid.Column="1" Content="{Binding Path=BinaryImage.Bits}" ContentStringFormat="{}{0}-bit"></Label>
|
|
<Label Grid.Row="5" Grid.Column="0" Content="Code image-to-VA positive offset"></Label>
|
|
<Label Grid.Row="5" Grid.Column="1" Content="{Binding Path=BinaryImage.GlobalOffset}" ContentStringFormat="0x{0:x8}"></Label>
|
|
<Label Grid.Row="6" Grid.Column="0" Content="MetadataRegistration address"></Label>
|
|
<Label Grid.Row="6" Grid.Column="1" Content="{Binding Path=Binary.MetadataRegistrationPointer}" ContentStringFormat="0x{0:x8}"></Label>
|
|
<Label Grid.Row="7" Grid.Column="0" Content="CodeRegistration address"></Label>
|
|
<Label Grid.Row="7" Grid.Column="1" Content="{Binding Path=Binary.CodeRegistrationPointer}" ContentStringFormat="0x{0:x8}"></Label>
|
|
<Label Grid.Row="8" Grid.Column="0" Content="Il2CppCodeRegistration function"></Label>
|
|
<Label Grid.Row="8" Grid.Column="1" Content="{Binding Path=Binary.RegistrationFunctionPointer}" ContentStringFormat="0x{0:x8}"></Label>
|
|
</Grid>
|
|
</DockPanel>
|
|
<Separator Grid.Row="0" Grid.Column="1" Grid.RowSpan="2" Margin="5,5,10,5">
|
|
<Separator.LayoutTransform>
|
|
<RotateTransform Angle="90"></RotateTransform>
|
|
</Separator.LayoutTransform>
|
|
</Separator>
|
|
|
|
<!-- Image selection prompt that automatically disappears when an image is selected -->
|
|
<Label Name="lblChooseImagePrompt" Grid.Row="0" Grid.Column="2" Grid.RowSpan="2" Foreground="{StaticResource WindowsBlue}" FontSize="24"
|
|
HorizontalAlignment="Center" VerticalAlignment="Center">
|
|
<Label.Content>Select an image on the left</Label.Content>
|
|
<Label.Style>
|
|
<Style>
|
|
<Setter Property="Label.Visibility" Value="Hidden"/>
|
|
<Style.Triggers>
|
|
<DataTrigger Binding="{Binding ElementName=lstImages, Path=SelectedItem}" Value="{x:Null}">
|
|
<Setter Property="Label.Visibility" Value="Visible"/>
|
|
</DataTrigger>
|
|
</Style.Triggers>
|
|
</Style>
|
|
</Label.Style>
|
|
</Label>
|
|
|
|
<!-- Output configuration -->
|
|
<DockPanel Name="pnlOutputSettings" Grid.Row="0" Grid.Column="2" Grid.RowSpan="2">
|
|
|
|
<!-- Show preferences only when an image is selected -->
|
|
<DockPanel.Style>
|
|
<Style>
|
|
<Setter Property="DockPanel.Visibility" Value="Visible"/>
|
|
<Style.Triggers>
|
|
<DataTrigger Binding="{Binding ElementName=lstImages, Path=SelectedItem}" Value="{x:Null}">
|
|
<Setter Property="DockPanel.Visibility" Value="Hidden"/>
|
|
</DataTrigger>
|
|
</Style.Triggers>
|
|
</Style>
|
|
</DockPanel.Style>
|
|
|
|
<!-- Export button -->
|
|
<Button Name="btnExport" Click="BtnExport_OnClick" DockPanel.Dock="Bottom" Margin="2" HorizontalAlignment="Right" VerticalAlignment="Bottom" FontSize="18" Width="120" Content="Export">
|
|
<Button.Style>
|
|
<Style BasedOn="{StaticResource LightBoxButton}" TargetType="{x:Type Button}">
|
|
<Style.Triggers>
|
|
<DataTrigger Binding="{Binding ElementName=areaBusyIndicator, Path=Visibility}" Value="Visible">
|
|
<Setter Property="Button.IsEnabled" Value="False"/>
|
|
</DataTrigger>
|
|
</Style.Triggers>
|
|
</Style>
|
|
</Button.Style>
|
|
</Button>
|
|
|
|
<DockPanel DockPanel.Dock="Top">
|
|
<!-- List of namespaces to export -->
|
|
<DockPanel DockPanel.Dock="Right">
|
|
<Label DockPanel.Dock="Top" Foreground="{StaticResource WindowsBlue}" FontSize="18">Namespaces</Label>
|
|
<TreeView DockPanel.Dock="Bottom" Name="trvNamespaces" ItemTemplate="{StaticResource NamespaceTreeItemTemplate}" Width="220" Margin="10,5,5,5"></TreeView>
|
|
</DockPanel>
|
|
|
|
<!-- Settings -->
|
|
<StackPanel DockPanel.Dock="Left">
|
|
<Label Foreground="{StaticResource WindowsBlue}" FontSize="18">Configure output</Label>
|
|
|
|
<!-- C# code stubs output -->
|
|
<RadioButton GroupName="grpOutputType" Name="rdoOutputCSharp" IsChecked="True" VerticalContentAlignment="Center" FontSize="18" Foreground="{StaticResource MicrosoftGreen}">C# prototypes</RadioButton>
|
|
<GroupBox Header="Layout" Margin="5" Padding="5">
|
|
<StackPanel>
|
|
<StackPanel.Style>
|
|
<Style>
|
|
<Style.Triggers>
|
|
<DataTrigger Binding="{Binding ElementName=rdoOutputSolution, Path=IsChecked}" Value="True">
|
|
<Setter Property="Control.IsEnabled" Value="False"/>
|
|
</DataTrigger>
|
|
</Style.Triggers>
|
|
</Style>
|
|
</StackPanel.Style>
|
|
|
|
<RadioButton Name="rdoLayoutSingle" IsChecked="True">Single file</RadioButton>
|
|
<RadioButton Name="rdoLayoutNamespace">File per namespace</RadioButton>
|
|
<RadioButton Name="rdoLayoutAssembly">File per assembly</RadioButton>
|
|
<RadioButton Name="rdoLayoutClass">File per class</RadioButton>
|
|
<RadioButton Name="rdoLayoutTree" Content="Tree layout">
|
|
<RadioButton.Style>
|
|
<Style>
|
|
<Style.Triggers>
|
|
<DataTrigger Binding="{Binding ElementName=rdoOutputSolution, Path=IsChecked}" Value="True">
|
|
<Setter Property="RadioButton.IsChecked" Value="True"/>
|
|
</DataTrigger>
|
|
</Style.Triggers>
|
|
</Style>
|
|
</RadioButton.Style>
|
|
</RadioButton>
|
|
</StackPanel>
|
|
</GroupBox>
|
|
|
|
<CheckBox Name="cbFlattenHierarchy" Margin="2" Content="Don't nest folders (flatten hierarchy)">
|
|
<CheckBox.Style>
|
|
<Style>
|
|
<Style.Triggers>
|
|
<DataTrigger Binding="{Binding ElementName=rdoLayoutSingle, Path=IsChecked}" Value="True">
|
|
<Setter Property="Control.IsEnabled" Value="False"/>
|
|
</DataTrigger>
|
|
<DataTrigger Binding="{Binding ElementName=rdoLayoutAssembly, Path=IsChecked}" Value="True">
|
|
<Setter Property="Control.IsEnabled" Value="False"/>
|
|
</DataTrigger>
|
|
</Style.Triggers>
|
|
</Style>
|
|
</CheckBox.Style>
|
|
</CheckBox>
|
|
|
|
<!-- Sorting (only available with single file, namespace and assembly output -->
|
|
<GroupBox Margin="5" Padding="5">
|
|
<!-- Replace TextBlock with Label in header template so that it greys out when the GroupBox is disabled -->
|
|
<GroupBox.Header>
|
|
<Label Content="Type sorting" Padding="0"/>
|
|
</GroupBox.Header>
|
|
<GroupBox.Style>
|
|
<Style>
|
|
<Style.Triggers>
|
|
<DataTrigger Binding="{Binding ElementName=rdoLayoutClass, Path=IsChecked}" Value="True">
|
|
<Setter Property="Control.IsEnabled" Value="False"/>
|
|
</DataTrigger>
|
|
<DataTrigger Binding="{Binding ElementName=rdoLayoutTree, Path=IsChecked}" Value="True">
|
|
<Setter Property="Control.IsEnabled" Value="False"/>
|
|
</DataTrigger>
|
|
</Style.Triggers>
|
|
</Style>
|
|
</GroupBox.Style>
|
|
<StackPanel>
|
|
<RadioButton Name="rdoSortName" IsChecked="True">Alphabetical</RadioButton>
|
|
<RadioButton Name="rdoSortIndex">Type definition index</RadioButton>
|
|
</StackPanel>
|
|
</GroupBox>
|
|
|
|
<CheckBox Name="cbSuppressMetadata" Margin="2">Suppress pointer, offset and index metadata comments</CheckBox>
|
|
<CheckBox Name="cbMustCompile" Margin="2" Content="Attempt to generate output that compiles">
|
|
<CheckBox.Style>
|
|
<Style>
|
|
<Style.Triggers>
|
|
<DataTrigger Binding="{Binding ElementName=rdoOutputSolution, Path=IsChecked}" Value="True">
|
|
<Setter Property="CheckBox.IsChecked" Value="True"/>
|
|
<Setter Property="Control.IsEnabled" Value="False"/>
|
|
</DataTrigger>
|
|
</Style.Triggers>
|
|
</Style>
|
|
</CheckBox.Style>
|
|
</CheckBox>
|
|
|
|
<CheckBox Name="cbSeparateAttributes" Margin="2" Content="Place assembly-level attributes in separate files">
|
|
<CheckBox.Style>
|
|
<Style>
|
|
<Setter Property="CheckBox.IsChecked" Value="True"/>
|
|
<Setter Property="Control.IsEnabled" Value="False"/>
|
|
<Style.Triggers>
|
|
<DataTrigger Binding="{Binding ElementName=rdoLayoutAssembly, Path=IsChecked}" Value="True">
|
|
<Setter Property="Control.IsEnabled" Value="True"/>
|
|
</DataTrigger>
|
|
<DataTrigger Binding="{Binding ElementName=rdoLayoutTree, Path=IsChecked}" Value="True">
|
|
<Setter Property="Control.IsEnabled" Value="True"/>
|
|
</DataTrigger>
|
|
<DataTrigger Binding="{Binding ElementName=rdoOutputSolution, Path=IsChecked}" Value="True">
|
|
<Setter Property="CheckBox.IsChecked" Value="True"/>
|
|
<Setter Property="Control.IsEnabled" Value="False"/>
|
|
</DataTrigger>
|
|
</Style.Triggers>
|
|
</Style>
|
|
</CheckBox.Style>
|
|
</CheckBox>
|
|
|
|
<Separator Margin="5,15,5,15"/>
|
|
|
|
<!-- Visual Studio solution -->
|
|
<RadioButton GroupName="grpOutputType" Name="rdoOutputSolution" VerticalContentAlignment="Center" FontSize="18" Foreground="{StaticResource MicrosoftGreen}">Visual Studio solution</RadioButton>
|
|
<TextBlock TextWrapping="WrapWithOverflow">Uses the settings above but forces tree layout, compilable output and separate assembly attributes</TextBlock>
|
|
<DockPanel>
|
|
<Button Name="btnUnityPath" DockPanel.Dock="Right" Width="70" Margin="4" Click="BtnUnityPath_OnClick">Browse</Button>
|
|
<Label DockPanel.Dock="Left" Width="170" VerticalAlignment="Center">Unity editor path:</Label>
|
|
<TextBlock Name="txtUnityPath" DockPanel.Dock="Left" VerticalAlignment="Center" FlowDirection="RightToLeft" HorizontalAlignment="Right" ToolTip="{Binding RelativeSource={RelativeSource Self}, Path=Text}"/>
|
|
</DockPanel>
|
|
<DockPanel>
|
|
<Button Name="btnUnityScriptPath" DockPanel.Dock="Right" Width="70" Margin="4" Click="BtnUnityScriptPath_OnClick">Browse</Button>
|
|
<Label DockPanel.Dock="Left" Width="170" VerticalAlignment="Center">Unity script assemblies path:</Label>
|
|
<TextBlock Name="txtUnityScriptPath" DockPanel.Dock="Left" VerticalAlignment="Center" FlowDirection="RightToLeft" HorizontalAlignment="Right" ToolTip="{Binding RelativeSource={RelativeSource Self}, Path=Text}"/>
|
|
</DockPanel>
|
|
|
|
<Separator Margin="5,15,5,15"/>
|
|
|
|
<!-- IDAPython script -->
|
|
<RadioButton GroupName="grpOutputType" Name="rdoOutputIDA" VerticalContentAlignment="Center" FontSize="18" Foreground="{StaticResource MicrosoftGreen}">IDAPython script</RadioButton>
|
|
<DockPanel>
|
|
<ComboBox Name="cboUnityVersion" DockPanel.Dock="Right" Margin="4"></ComboBox>
|
|
<Label DockPanel.Dock="Left" Width="170" VerticalAlignment="Center" HorizontalAlignment="Left">Unity version (if known):</Label>
|
|
</DockPanel>
|
|
</StackPanel>
|
|
</DockPanel>
|
|
</DockPanel>
|
|
</Grid>
|
|
|
|
<!-- Background dimmer -->
|
|
<Rectangle Name="rectModalLightBoxBackground" Fill="Black" Opacity="0.4">
|
|
<Rectangle.Style>
|
|
<Style>
|
|
<Setter Property="Rectangle.Visibility" Value="Hidden"></Setter>
|
|
<Style.Triggers>
|
|
<DataTrigger Binding="{Binding ElementName=grdFirstPage, Path=Visibility}" Value="Visible">
|
|
<Setter Property="Rectangle.Visibility" Value="Visible" />
|
|
</DataTrigger>
|
|
<DataTrigger Binding="{Binding ElementName=btnSelectBinaryFile, Path=Visibility}" Value="Visible">
|
|
<Setter Property="Rectangle.Visibility" Value="Visible" />
|
|
</DataTrigger>
|
|
<DataTrigger Binding="{Binding ElementName=areaBusyIndicator, Path=Visibility}" Value="Visible">
|
|
<Setter Property="Rectangle.Visibility" Value="Visible" />
|
|
</DataTrigger>
|
|
</Style.Triggers>
|
|
</Style>
|
|
</Rectangle.Style>
|
|
</Rectangle>
|
|
|
|
<!-- Light boxes -->
|
|
<Grid Name="grdFirstPage">
|
|
<Grid.RowDefinitions>
|
|
<RowDefinition Height ="*" />
|
|
<RowDefinition Height ="*" />
|
|
</Grid.RowDefinitions>
|
|
|
|
<Button Grid.Row="0" Name="btnSelectMetadataFile" Style="{StaticResource LightBoxButton}" Margin="100,100,100,50" Click="BtnSelectMetadataFile_OnClick">
|
|
<TextBlock TextAlignment="Center">
|
|
<TextBlock FontSize="22">Option 1</TextBlock>
|
|
<LineBreak/>
|
|
<TextBlock>Select an IL2CPP metadata file</TextBlock>
|
|
</TextBlock>
|
|
</Button>
|
|
<Button Grid.Row="1" Name="btnSelectPackageFile" Style="{StaticResource LightBoxButton}" Margin="100,50,100,100" Click="BtnSelectPackageFile_OnClick">
|
|
<TextBlock TextAlignment="Center">
|
|
<TextBlock FontSize="22">Option 2</TextBlock>
|
|
<LineBreak/>
|
|
<TextBlock>Select an APK or IPA file</TextBlock>
|
|
<LineBreak/>
|
|
<TextBlock FontSize="16">Encrypted IPA files are not supported</TextBlock>
|
|
</TextBlock>
|
|
</Button>
|
|
</Grid>
|
|
<Button Name="btnSelectBinaryFile" Style="{StaticResource LightBoxButton}" Margin="100" Click="BtnSelectBinaryFile_OnClick" Visibility="Hidden">Select an IL2CPP binary file</Button>
|
|
|
|
<!-- Back button -->
|
|
<Button Name="btnBack" Margin="7" HorizontalAlignment="Left" VerticalAlignment="Bottom" FontSize="18" Width="120" Click="BtnBack_OnClick" Content="<< Back">
|
|
<Button.Style>
|
|
<Style BasedOn="{StaticResource LightBoxButton}" TargetType="{x:Type Button}">
|
|
<Setter Property="Visibility" Value="Hidden"></Setter>
|
|
<Style.Triggers>
|
|
<DataTrigger Binding="{Binding ElementName=grdFirstPage, Path=Visibility}" Value="Hidden">
|
|
<Setter Property="Button.Visibility" Value="Visible"/>
|
|
</DataTrigger>
|
|
<DataTrigger Binding="{Binding ElementName=areaBusyIndicator, Path=Visibility}" Value="Visible">
|
|
<Setter Property="Button.IsEnabled" Value="False"/>
|
|
</DataTrigger>
|
|
</Style.Triggers>
|
|
</Style>
|
|
</Button.Style>
|
|
</Button>
|
|
|
|
<!-- Busy indicator -->
|
|
<Border Name="areaBusyIndicator" Width="500" BorderThickness="1" CornerRadius="2" BorderBrush="Gray" HorizontalAlignment="Center" VerticalAlignment="Center" Background="White" SnapsToDevicePixels="True" Visibility="Hidden">
|
|
<StackPanel Margin="60,40,60,40">
|
|
<TextBlock Name="txtBusyStatus" Foreground="{StaticResource WindowsBlue}" FontSize="24" HorizontalAlignment="Center">Getting things ready...</TextBlock>
|
|
<Image gif:AnimationBehavior.SourceUri="Resources/pizza.gif" Width="100" Margin="0,20,0,0" RenderOptions.BitmapScalingMode="Fant" />
|
|
</StackPanel>
|
|
</Border>
|
|
</Grid>
|
|
</Window>
|