GUI: Add plugin option validation + many bug fixes to dialog
This commit is contained in:
@@ -1,143 +1,52 @@
|
||||
<Window x:Class="Il2CppInspector.GUI.PluginConfigurationDialog"
|
||||
<Window x:Class="Il2CppInspectorGUI.PluginConfigurationDialog"
|
||||
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:Il2CppInspector.GUI"
|
||||
xmlns:pluginapi="clr-namespace:Il2CppInspector.PluginAPI.V100;assembly=Il2CppInspector.Common"
|
||||
xmlns:local="clr-namespace:Il2CppInspectorGUI"
|
||||
xmlns:local2="clr-namespace:Il2CppInspector.GUI"
|
||||
mc:Ignorable="d"
|
||||
Title="{Binding Path=Plugin.Name, StringFormat=Configuration for {0}}" Height="400" Width="800"
|
||||
ResizeMode="NoResize"
|
||||
WindowStartupLocation="CenterOwner"
|
||||
SizeToContent="Height" MaxHeight="800">
|
||||
SizeToContent="Height" MaxHeight="800"
|
||||
Closing="Window_Closing">
|
||||
<Window.Resources>
|
||||
<local:OptionTemplateSelector x:Key="OptionTemplateSelector"/>
|
||||
<local:HexStringValueConverter x:Key="HexStringValueConverter" />
|
||||
<local:EqualityConverter x:Key="EqualityVisibilityConverter" TrueValue="{x:Static Visibility.Visible}" FalseValue="{x:Static Visibility.Collapsed}" />
|
||||
<local2:HexStringValueConverter x:Key="HexStringValueConverter" />
|
||||
<local2:EqualityConverter x:Key="EqualityVisibilityConverter" TrueValue="{x:Static Visibility.Visible}" FalseValue="{x:Static Visibility.Collapsed}" />
|
||||
<BooleanToVisibilityConverter x:Key="VisibleIfTrueConverter" />
|
||||
|
||||
<!-- Option layouts -->
|
||||
<DataTemplate x:Key="TextTemplate">
|
||||
<DockPanel>
|
||||
<TextBlock DockPanel.Dock="Left" Width="350" VerticalAlignment="Center">
|
||||
<TextBlock Text="{Binding Path=Description}" TextWrapping="Wrap"></TextBlock>
|
||||
<TextBlock Visibility="{Binding Required, Converter={StaticResource VisibleIfTrueConverter}}" Text="*" Foreground="Red"/>
|
||||
</TextBlock>
|
||||
<TextBox DockPanel.Dock="Right" VerticalAlignment="Center" Padding="2" Margin="0,4,4,4" Text="{Binding Path=Value, UpdateSourceTrigger=PropertyChanged}"></TextBox>
|
||||
</DockPanel>
|
||||
</DataTemplate>
|
||||
<!-- Validation error style -->
|
||||
<Style x:Key="ValidationStyle" TargetType="TextBlock">
|
||||
<Setter Property="Text" Value="{Binding ElementName=valueControl, Path=(Validation.Errors)[0].ErrorContent}"/>
|
||||
<Setter Property="Foreground" Value="Red" />
|
||||
</Style>
|
||||
|
||||
<DataTemplate x:Key="FilePathTemplate">
|
||||
<DockPanel>
|
||||
<Button Name="btnFilePathSelector" DockPanel.Dock="Right" Width="70" Margin="4" Click="btnFilePathSelector_Click">Browse</Button>
|
||||
<TextBlock DockPanel.Dock="Left" Width="3500" VerticalAlignment="Center">
|
||||
<TextBlock Text="{Binding Description}" TextWrapping="Wrap"></TextBlock>
|
||||
<TextBlock Visibility="{Binding Required, Converter={StaticResource VisibleIfTrueConverter}}" Text="*" Foreground="Red"/>
|
||||
</TextBlock>
|
||||
<TextBlock Name="txtFilePathSelector" DockPanel.Dock="Right" VerticalAlignment="Center" HorizontalAlignment="Right" Margin="3" ToolTip="{Binding RelativeSource={RelativeSource Self}, Path=Text}" Text="{Binding Value}"/>
|
||||
</DockPanel>
|
||||
</DataTemplate>
|
||||
|
||||
<DataTemplate x:Key="NumberTemplate">
|
||||
<DataTemplate x:Key="ValidationErrorTemplate">
|
||||
<StackPanel>
|
||||
<!-- Decimal number -->
|
||||
<DockPanel>
|
||||
<DockPanel.Visibility>
|
||||
<MultiBinding Converter="{StaticResource EqualityVisibilityConverter}">
|
||||
<Binding Path="Style" />
|
||||
<Binding Source="{x:Static pluginapi:PluginOptionNumberStyle.Decimal}" Mode="OneWay" />
|
||||
</MultiBinding>
|
||||
</DockPanel.Visibility>
|
||||
|
||||
<TextBlock DockPanel.Dock="Left" Width="350" VerticalAlignment="Center">
|
||||
<TextBlock Text="{Binding Description}" TextWrapping="Wrap"></TextBlock>
|
||||
<TextBlock Visibility="{Binding Required, Converter={StaticResource VisibleIfTrueConverter}}" Text="*" Foreground="Red"/>
|
||||
</TextBlock>
|
||||
<TextBox Name="txtDecimalString" DockPanel.Dock="Right" VerticalAlignment="Center" Padding="2" Margin="0,4,4,4" Text="{Binding Path=Value, UpdateSourceTrigger=PropertyChanged}"></TextBox>
|
||||
</DockPanel>
|
||||
|
||||
<!-- Hex number -->
|
||||
<DockPanel>
|
||||
<DockPanel.Visibility>
|
||||
<MultiBinding Converter="{StaticResource EqualityVisibilityConverter}">
|
||||
<Binding Path="Style" />
|
||||
<Binding Source="{x:Static pluginapi:PluginOptionNumberStyle.Hex}" Mode="OneWay" />
|
||||
</MultiBinding>
|
||||
</DockPanel.Visibility>
|
||||
|
||||
<TextBlock DockPanel.Dock="Left" Width="350" VerticalAlignment="Center">
|
||||
<TextBlock Text="{Binding Description}" TextWrapping="Wrap"></TextBlock>
|
||||
<TextBlock Visibility="{Binding Required, Converter={StaticResource VisibleIfTrueConverter}}" Text="*" Foreground="Red"/>
|
||||
</TextBlock>
|
||||
<DockPanel HorizontalAlignment="Stretch">
|
||||
<Label Margin="0,3,3,5">0x</Label>
|
||||
<TextBox Name="txtHexString" Padding="2" Margin="0,6,4,6" Text="{Binding Value, Converter={StaticResource HexStringValueConverter}, UpdateSourceTrigger=PropertyChanged}" PreviewTextInput="txtHexString_PreviewTextInput"/>
|
||||
</DockPanel>
|
||||
</DockPanel>
|
||||
</StackPanel>
|
||||
</DataTemplate>
|
||||
|
||||
<DataTemplate x:Key="BooleanTemplate">
|
||||
<DockPanel Margin="350,0,0,0">
|
||||
<TextBlock DockPanel.Dock="Left" VerticalAlignment="Top" Margin="0,10,2,6"
|
||||
Visibility="{Binding Required, Converter={StaticResource VisibleIfTrueConverter}}" Text="*" Foreground="Red"/>
|
||||
<CheckBox DockPanel.Dock="Right" VerticalAlignment="Center" Margin="0,10,2,6" IsChecked="{Binding Value}">
|
||||
<TextBlock VerticalAlignment="Center" TextWrapping="Wrap" Text="{Binding Description}" />
|
||||
</CheckBox>
|
||||
</DockPanel>
|
||||
</DataTemplate>
|
||||
|
||||
<DataTemplate x:Key="ChoiceTemplate">
|
||||
<StackPanel>
|
||||
<!-- Drop-down box version -->
|
||||
<DockPanel>
|
||||
<DockPanel.Visibility>
|
||||
<MultiBinding Converter="{StaticResource EqualityVisibilityConverter}">
|
||||
<Binding Path="Style" />
|
||||
<Binding Source="{x:Static pluginapi:PluginOptionChoiceStyle.Dropdown}" Mode="OneWay" />
|
||||
</MultiBinding>
|
||||
</DockPanel.Visibility>
|
||||
<TextBlock DockPanel.Dock="Left" Width="350" VerticalAlignment="Center">
|
||||
<TextBlock Text="{Binding Description}" TextWrapping="Wrap"></TextBlock>
|
||||
<TextBlock Visibility="{Binding Required, Converter={StaticResource VisibleIfTrueConverter}}" Text="*" Foreground="Red"/>
|
||||
</TextBlock>
|
||||
<ComboBox DockPanel.Dock="Right" Margin="4,8,4,8" ItemsSource="{Binding Choices}" DisplayMemberPath="Value" SelectedValuePath="Key" SelectedValue="{Binding Value}"></ComboBox>
|
||||
</DockPanel>
|
||||
|
||||
<!-- Radio buttons version -->
|
||||
<DockPanel>
|
||||
<DockPanel.Visibility>
|
||||
<MultiBinding Converter="{StaticResource EqualityVisibilityConverter}">
|
||||
<Binding Path="Style" />
|
||||
<Binding Source="{x:Static pluginapi:PluginOptionChoiceStyle.List}" Mode="OneWay" />
|
||||
</MultiBinding>
|
||||
</DockPanel.Visibility>
|
||||
<GroupBox Header="{Binding Description}" Margin="5" Padding="5">
|
||||
<ListBox ItemsSource="{Binding Choices}" SelectedItem="{Binding Value}" BorderBrush="Transparent">
|
||||
<ListBox.ItemTemplate>
|
||||
<DataTemplate>
|
||||
<RadioButton GroupName="{Binding Header, RelativeSource={RelativeSource AncestorType=GroupBox}}"
|
||||
Content="{Binding}"
|
||||
IsChecked="{Binding IsSelected, RelativeSource={RelativeSource AncestorType=ListBoxItem}}"
|
||||
Focusable="False"
|
||||
IsHitTestVisible="False"/>
|
||||
</DataTemplate>
|
||||
</ListBox.ItemTemplate>
|
||||
</ListBox>
|
||||
</GroupBox>
|
||||
</DockPanel>
|
||||
<StackPanel.Style>
|
||||
<Style TargetType="{x:Type StackPanel}">
|
||||
<Style.Triggers>
|
||||
<DataTrigger Binding="{Binding ElementName=errorText, Path=Text}" Value="">
|
||||
<Setter Property="Visibility" Value="Collapsed"/>
|
||||
</DataTrigger>
|
||||
</Style.Triggers>
|
||||
</Style>
|
||||
</StackPanel.Style>
|
||||
<TextBlock Name="errorText" Style="{StaticResource ValidationStyle}" />
|
||||
</StackPanel>
|
||||
</DataTemplate>
|
||||
|
||||
<!-- Configure ListBox to display configuration controls nicely -->
|
||||
<Style TargetType="{x:Type ListBoxItem}">
|
||||
<Style x:Key="OptionItemStyle" TargetType="{x:Type ListBoxItem}">
|
||||
<Setter Property="Background" Value="Transparent"/>
|
||||
|
||||
|
||||
<!-- Force ListBox to width of window -->
|
||||
<Setter Property="HorizontalContentAlignment" Value="Stretch"/>
|
||||
|
||||
|
||||
<Setter Property="VerticalContentAlignment" Value="{Binding VerticalContentAlignment, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}"/>
|
||||
<Setter Property="Padding" Value="2,0,0,0"/>
|
||||
<Setter Property="Padding" Value="2,6,0,6"/>
|
||||
<Setter Property="Template">
|
||||
<Setter.Value>
|
||||
<ControlTemplate TargetType="{x:Type ListBoxItem}">
|
||||
@@ -153,8 +62,115 @@
|
||||
</Setter.Value>
|
||||
</Setter>
|
||||
</Style>
|
||||
|
||||
<!-- Option label template -->
|
||||
<DataTemplate x:Key="OptionLabelTemplate">
|
||||
<TextBlock DockPanel.Dock="Left" Width="350" VerticalAlignment="Top">
|
||||
<TextBlock Text="{Binding Path=Description}" TextWrapping="Wrap" Margin="0,4,0,0"></TextBlock>
|
||||
<TextBlock Visibility="{Binding Required, Converter={StaticResource VisibleIfTrueConverter}}" Text="*" Foreground="Red"/>
|
||||
</TextBlock>
|
||||
</DataTemplate>
|
||||
|
||||
<!-- Option layouts -->
|
||||
|
||||
<!-- Free text -->
|
||||
<DataTemplate x:Key="TextTemplate">
|
||||
<DockPanel>
|
||||
<ContentPresenter ContentTemplate="{StaticResource OptionLabelTemplate}" />
|
||||
<StackPanel DockPanel.Dock="Right" Margin="4,0,4,0">
|
||||
<TextBox Name="valueControl" VerticalAlignment="Top" Padding="2" Text="{Binding Path=Value, UpdateSourceTrigger=PropertyChanged, ValidatesOnExceptions=True}" />
|
||||
<ContentPresenter ContentTemplate="{StaticResource ValidationErrorTemplate}" />
|
||||
</StackPanel>
|
||||
</DockPanel>
|
||||
</DataTemplate>
|
||||
|
||||
<!-- File path -->
|
||||
<DataTemplate x:Key="FilePathTemplate">
|
||||
<DockPanel>
|
||||
<Button Name="btnFilePathSelector" DockPanel.Dock="Right" Width="70" Height="25" VerticalAlignment="Top" Margin="4,0,4,0" Click="btnFilePathSelector_Click">Browse</Button>
|
||||
<ContentPresenter ContentTemplate="{StaticResource OptionLabelTemplate}" />
|
||||
<StackPanel DockPanel.Dock="Right" Margin="4,0,4,0">
|
||||
<TextBox Name="valueControl" VerticalAlignment="Top" HorizontalAlignment="Stretch" TextAlignment="Right" Padding="2" Margin="0,0,4,0" IsReadOnly="True" BorderBrush="Transparent" ToolTip="{Binding RelativeSource={RelativeSource Self}, Path=Text}" Text="{Binding Value, UpdateSourceTrigger=PropertyChanged, ValidatesOnExceptions=True}" />
|
||||
<ContentPresenter ContentTemplate="{StaticResource ValidationErrorTemplate}" />
|
||||
</StackPanel>
|
||||
</DockPanel>
|
||||
</DataTemplate>
|
||||
|
||||
<!-- Decimal number -->
|
||||
<DataTemplate x:Key="NumberDecimalTemplate">
|
||||
<DockPanel>
|
||||
<ContentPresenter ContentTemplate="{StaticResource OptionLabelTemplate}" />
|
||||
<StackPanel DockPanel.Dock="Right" Margin="4,0,4,0">
|
||||
<TextBox Name="valueControl" VerticalAlignment="Center" Padding="2" Text="{Binding Value, UpdateSourceTrigger=PropertyChanged, ValidatesOnExceptions=True}"/>
|
||||
<ContentPresenter ContentTemplate="{StaticResource ValidationErrorTemplate}" />
|
||||
</StackPanel>
|
||||
</DockPanel>
|
||||
</DataTemplate>
|
||||
|
||||
<!-- Hex number -->
|
||||
<DataTemplate x:Key="NumberHexTemplate">
|
||||
<DockPanel>
|
||||
<ContentPresenter ContentTemplate="{StaticResource OptionLabelTemplate}" />
|
||||
<StackPanel DockPanel.Dock="Right" Margin="4,0,4,0">
|
||||
<DockPanel HorizontalAlignment="Stretch">
|
||||
<Label Padding="0" Margin="0,2,4,0">0x</Label>
|
||||
<TextBox Name="valueControl" DockPanel.Dock="Right" Padding="2" Text="{Binding Value, Converter={StaticResource HexStringValueConverter}, UpdateSourceTrigger=PropertyChanged}" PreviewTextInput="txtHexString_PreviewTextInput"/>
|
||||
</DockPanel>
|
||||
<ContentPresenter ContentTemplate="{StaticResource ValidationErrorTemplate}" />
|
||||
</StackPanel>
|
||||
</DockPanel>
|
||||
</DataTemplate>
|
||||
|
||||
<!-- Boolean tickbox (no validation required) -->
|
||||
<DataTemplate x:Key="BooleanTemplate">
|
||||
<DockPanel Margin="350,0,0,0">
|
||||
<TextBlock DockPanel.Dock="Left" VerticalAlignment="Top" Margin="0,4,2,4"
|
||||
Visibility="{Binding Required, Converter={StaticResource VisibleIfTrueConverter}}" Text="*" Foreground="Red"/>
|
||||
<CheckBox Name="valueControl" DockPanel.Dock="Right" VerticalAlignment="Center" Margin="0,4,2,4" IsChecked="{Binding Value}">
|
||||
<TextBlock VerticalAlignment="Center" TextWrapping="Wrap" Text="{Binding Description}" />
|
||||
</CheckBox>
|
||||
</DockPanel>
|
||||
</DataTemplate>
|
||||
|
||||
<!-- Drop-down choices -->
|
||||
<DataTemplate x:Key="ChoiceDropdownTemplate">
|
||||
<DockPanel>
|
||||
<ContentPresenter ContentTemplate="{StaticResource OptionLabelTemplate}" />
|
||||
<StackPanel DockPanel.Dock="Right" Margin="4,0,4,0">
|
||||
<ComboBox Name="valueControl" ItemsSource="{Binding Choices}" DisplayMemberPath="Value" SelectedValuePath="Key" SelectedValue="{Binding Value}"/>
|
||||
<ContentPresenter ContentTemplate="{StaticResource ValidationErrorTemplate}" />
|
||||
</StackPanel>
|
||||
</DockPanel>
|
||||
</DataTemplate>
|
||||
|
||||
<!-- Radio button choices -->
|
||||
<DataTemplate x:Key="ChoiceListTemplate">
|
||||
<StackPanel>
|
||||
<GroupBox Header="{Binding Description}" Margin="5" Padding="5">
|
||||
<ListBox Name="valueControl" ItemsSource="{Binding Choices}" SelectedValuePath="Key" SelectedValue="{Binding Value}" BorderBrush="Transparent">
|
||||
<ListBox.ItemTemplate>
|
||||
<DataTemplate>
|
||||
<RadioButton GroupName="{Binding Header, RelativeSource={RelativeSource AncestorType=GroupBox}}"
|
||||
Content="{Binding Value}"
|
||||
IsChecked="{Binding IsSelected, RelativeSource={RelativeSource AncestorType=ListBoxItem}}"
|
||||
Focusable="False"
|
||||
IsHitTestVisible="False"/>
|
||||
</DataTemplate>
|
||||
</ListBox.ItemTemplate>
|
||||
|
||||
<ListBox.ItemContainerStyle>
|
||||
<Style TargetType="{x:Type ListBoxItem}" BasedOn="{StaticResource OptionItemStyle}">
|
||||
<Setter Property="Padding" Value="0" />
|
||||
</Style>
|
||||
</ListBox.ItemContainerStyle>
|
||||
</ListBox>
|
||||
</GroupBox>
|
||||
<ContentPresenter ContentTemplate="{StaticResource ValidationErrorTemplate}" />
|
||||
</StackPanel>
|
||||
</DataTemplate>
|
||||
</Window.Resources>
|
||||
|
||||
<!-- Main dialog window -->
|
||||
<Grid Margin="10">
|
||||
<Grid.RowDefinitions>
|
||||
<RowDefinition Height="50" />
|
||||
@@ -167,13 +183,15 @@
|
||||
Content="{Binding Plugin.Name}" ContentStringFormat="Configuration for {0}" Padding="8,0,0,0"/>
|
||||
|
||||
<!-- Options editor -->
|
||||
<ListBox Grid.Row="1" Name="lstOptions" ItemsSource="{Binding Plugin.Options}" ScrollViewer.HorizontalScrollBarVisibility="Disabled" Padding="8" BorderBrush="Transparent">
|
||||
<ListBox Grid.Row="1" Name="lstOptions" ItemsSource="{Binding Plugin.Options}" ScrollViewer.HorizontalScrollBarVisibility="Disabled" Padding="8" BorderBrush="Transparent" ItemContainerStyle="{StaticResource OptionItemStyle}">
|
||||
<ListBox.ItemTemplateSelector>
|
||||
<local:OptionTemplateSelector TextTemplate="{StaticResource TextTemplate}"
|
||||
FilePathTemplate="{StaticResource FilePathTemplate}"
|
||||
NumberTemplate="{StaticResource NumberTemplate}"
|
||||
NumberDecimalTemplate="{StaticResource NumberDecimalTemplate}"
|
||||
NumberHexTemplate="{StaticResource NumberHexTemplate}"
|
||||
BooleanTemplate="{StaticResource BooleanTemplate}"
|
||||
ChoiceTemplate="{StaticResource ChoiceTemplate}">
|
||||
ChoiceDropdownTemplate="{StaticResource ChoiceDropdownTemplate}"
|
||||
ChoiceListTemplate="{StaticResource ChoiceListTemplate}">
|
||||
</local:OptionTemplateSelector>
|
||||
</ListBox.ItemTemplateSelector>
|
||||
</ListBox>
|
||||
|
||||
Reference in New Issue
Block a user