100% parity: ball sprite, Tera ComboBox, PKRS, PP edit, relearn warns

Final cosmetic/visual parity fixes:
- Ball sprite (24x24) next to Ball ComboBox in Met tab
- Tera Type as ComboBox with type names (not NumericUpDown)
- HT Gender clickable button (was read-only TextBlock)
- Region fields show localized country/region names
- StatusConditionView: status text near sprite
- PP fields editable (NumericUpDown, not read-only)
- Relearn move legality warning indicators (red "!")
- OT Name warning "?" button
- Ctrl+E now exports SAV (matching WinForms semantics)
- Dump All Boxes command in Data menu
This commit is contained in:
montanon 2026-03-16 11:56:02 -03:00
parent c83949ccf9
commit 1dc713e674
4 changed files with 294 additions and 21 deletions

View File

@ -271,6 +271,67 @@ private async Task ExportPKMAsync()
}
}
[RelayCommand]
private async Task ExportSAVAsync()
{
if (SaveFile is null)
return;
var path = await _dialogService.SaveFileAsync("Export SAV", SaveFile.Metadata.FileName ?? "save");
if (path is null)
return;
try
{
ExportSAV(SaveFile, path);
StatusMessage = $"Exported SAV to {Path.GetFileName(path)}";
}
catch (Exception ex)
{
await _dialogService.ShowErrorAsync("Export Error", ex.Message);
}
}
[RelayCommand]
private async Task DumpAllBoxesAsync()
{
if (SaveFile is null)
return;
try
{
var folder = await _dialogService.OpenFolderAsync("Select output folder for all boxes");
if (string.IsNullOrEmpty(folder))
return;
int dumped = 0;
for (int box = 0; box < SaveFile.BoxCount; box++)
{
var boxDir = Path.Combine(folder, $"Box {box + 1:00}");
Directory.CreateDirectory(boxDir);
for (int slot = 0; slot < SaveFile.BoxSlotCount; slot++)
{
var pk = SaveFile.GetBoxSlotAtIndex(box, slot);
if (pk.Species == 0)
continue;
var fileName = $"{pk.Species:000}_{pk.Nickname}.{pk.Extension}";
foreach (var c in Path.GetInvalidFileNameChars())
fileName = fileName.Replace(c, '_');
await File.WriteAllBytesAsync(Path.Combine(boxDir, fileName), pk.DecryptedBoxData);
dumped++;
}
}
StatusMessage = $"Dumped {dumped} Pokemon from all boxes.";
}
catch (Exception ex)
{
StatusMessage = $"Dump All Boxes error: {ex.Message}";
}
}
public async Task LoadFileAsync(string path)
{
try

View File

@ -182,6 +182,15 @@ public partial class PKMEditorViewModel : ObservableObject
[ObservableProperty] private bool _move3Legal = true;
[ObservableProperty] private bool _move4Legal = true;
// Relearn move legality indicators
[ObservableProperty] private bool _relearn1Legal = true;
[ObservableProperty] private bool _relearn2Legal = true;
[ObservableProperty] private bool _relearn3Legal = true;
[ObservableProperty] private bool _relearn4Legal = true;
// Status Condition display
[ObservableProperty] private string _statusConditionText = string.Empty;
// Hyper Training
[ObservableProperty] private bool _htHp;
[ObservableProperty] private bool _htAtk;
@ -211,6 +220,25 @@ public partial class PKMEditorViewModel : ObservableObject
[ObservableProperty] private int _teraTypeOriginal;
[ObservableProperty] private int _teraTypeOverride;
[ObservableProperty] private bool _hasTeraType;
[ObservableProperty] private IReadOnlyList<ComboItem> _teraTypeList = Array.Empty<ComboItem>();
[ObservableProperty] private ComboItem? _selectedTeraOriginal;
[ObservableProperty] private ComboItem? _selectedTeraOverride;
partial void OnSelectedTeraOriginalChanged(ComboItem? value)
{
if (value is not null)
TeraTypeOriginal = value.Value;
if (!_isPopulating)
UpdateLegality();
}
partial void OnSelectedTeraOverrideChanged(ComboItem? value)
{
if (value is not null)
TeraTypeOverride = value.Value;
if (!_isPopulating)
UpdateLegality();
}
// EV Total display
[ObservableProperty] private int _evTotal;
@ -225,6 +253,9 @@ public partial class PKMEditorViewModel : ObservableObject
// Base Stat Total
[ObservableProperty] private int _baseST;
// Ball sprite
[ObservableProperty] private Bitmap? _ballSprite;
// Met
[ObservableProperty] private ushort _metLocation;
[ObservableProperty] private byte _metLevel;
@ -377,6 +408,14 @@ private void ToggleOtGender()
OnPropertyChanged(nameof(HtGenderSymbol));
}
[RelayCommand]
private void ToggleHtGender()
{
if (Entity is null) return;
HtGender = (byte)((HtGender + 1) % 3);
OnPropertyChanged(nameof(HtGenderSymbol));
}
[ObservableProperty] private bool _hasHandler;
// Encryption Constant
@ -452,6 +491,45 @@ private void RerollEc()
// Region Origin (Gen 6-7, 3DS)
[ObservableProperty] private int _country, _subRegion, _consoleRegion;
[ObservableProperty] private string _countryName = string.Empty;
[ObservableProperty] private string _subRegionName = string.Empty;
[ObservableProperty] private string _consoleRegionName = string.Empty;
partial void OnCountryChanged(int value)
{
if (!_isPopulating)
UpdateRegionNames();
}
partial void OnSubRegionChanged(int value)
{
if (!_isPopulating)
UpdateRegionNames();
}
partial void OnConsoleRegionChanged(int value)
{
if (!_isPopulating)
UpdateRegionNames();
}
private void UpdateRegionNames()
{
try
{
var lang = GameInfo.CurrentLanguage;
CountryName = GeoLocation.GetCountryName(lang, (byte)Country);
SubRegionName = GeoLocation.GetRegionName(lang, (byte)Country, (byte)SubRegion);
var consoleRegionNames = new[] { "Japan", "Americas", "Europe", "China", "Korea", "Taiwan" };
ConsoleRegionName = ConsoleRegion >= 0 && ConsoleRegion < consoleRegionNames.Length ? consoleRegionNames[ConsoleRegion] : $"{ConsoleRegion}";
}
catch
{
CountryName = string.Empty;
SubRegionName = string.Empty;
ConsoleRegionName = string.Empty;
}
}
[ObservableProperty] private bool _hasRegionData;
// Handler Language
@ -617,6 +695,21 @@ private void RerollEc()
{
if (value is not null)
Ball = (byte)value.Value;
if (!_isPopulating)
UpdateBallSprite();
}
private void UpdateBallSprite()
{
try
{
var skBitmap = SpriteUtil.GetBallSprite(Ball);
BallSprite = SKBitmapToAvaloniaBitmapConverter.ToAvaloniaBitmap(skBitmap);
}
catch
{
BallSprite = null;
}
}
partial void OnSelectedVersionChanged(ComboItem? value)
@ -885,12 +978,24 @@ public void PopulateFields(PKM pk)
HasTeraType = true;
TeraTypeOriginal = (int)tt.TeraTypeOriginal;
TeraTypeOverride = (int)tt.TeraTypeOverride;
// Build tera type list from type names
var teraTypes = GameInfo.Strings.Types;
var teraList = new List<ComboItem>();
for (int i = 0; i < teraTypes.Count; i++)
teraList.Add(new ComboItem(teraTypes[i], i));
TeraTypeList = teraList;
SelectedTeraOriginal = teraList.FirstOrDefault(x => x.Value == TeraTypeOriginal);
SelectedTeraOverride = teraList.FirstOrDefault(x => x.Value == TeraTypeOverride);
}
else
{
HasTeraType = false;
TeraTypeOriginal = 0;
TeraTypeOverride = 0;
TeraTypeList = Array.Empty<ComboItem>();
SelectedTeraOriginal = null;
SelectedTeraOverride = null;
}
// EV Total
@ -964,11 +1069,13 @@ public void PopulateFields(PKM pk)
Country = ro.Country;
SubRegion = ro.Region;
ConsoleRegion = ro.ConsoleRegion;
UpdateRegionNames();
}
else
{
HasRegionData = false;
Country = SubRegion = ConsoleRegion = 0;
CountryName = SubRegionName = ConsoleRegionName = string.Empty;
}
// Encryption Constant
@ -1189,6 +1296,18 @@ public void PopulateFields(PKM pk)
// Met — As Egg
MetAsEgg = pk.EggLocation > 0;
// Status Condition
var statusType = pk.GetStatusType();
StatusConditionText = statusType switch
{
StatusType.Paralysis => "Paralysis",
StatusType.Sleep => "Sleep",
StatusType.Freeze => "Frozen",
StatusType.Burn => "Burn",
StatusType.Poison => "Poison",
_ => string.Empty,
};
// Cosmetic — Shiny Leaf (Gen 4)
if (pk is G4PKM g4)
{
@ -1328,6 +1447,7 @@ public void PopulateFields(PKM pk)
SelectedAbility = AbilityList.FirstOrDefault(x => x.Value == pk.Ability);
SelectedLanguage = LanguageList.FirstOrDefault(x => x.Value == pk.Language);
SelectedBall = BallList.FirstOrDefault(x => x.Value == pk.Ball);
UpdateBallSprite();
SelectedVersion = VersionList.FirstOrDefault(x => x.Value == (int)pk.Version);
SelectedMetLocation = MetLocationList.FirstOrDefault(x => x.Value == pk.MetLocation);
SelectedEggLocation = EggLocationList.FirstOrDefault(x => x.Value == pk.EggLocation);
@ -1429,12 +1549,15 @@ public void PopulateFields(PKM pk)
Entity.Move3 = Move3;
Entity.Move4 = Move4;
// Move PP Ups
// Move PP and PP Ups
Entity.Move1_PP = Move1_PP;
Entity.Move2_PP = Move2_PP;
Entity.Move3_PP = Move3_PP;
Entity.Move4_PP = Move4_PP;
Entity.Move1_PPUps = Move1_PPUps;
Entity.Move2_PPUps = Move2_PPUps;
Entity.Move3_PPUps = Move3_PPUps;
Entity.Move4_PPUps = Move4_PPUps;
Entity.SetMaximumPPCurrent(Entity.Moves);
// Relearn Moves
if (HasRelearnMoves)
@ -1987,6 +2110,38 @@ private void ShowNicknameWarning()
}
}
// --- OT Name warning ---
[RelayCommand]
private void ShowOtNameWarning()
{
if (Entity is null) return;
var otName = Ot ?? string.Empty;
bool hasSpecialChars = false;
foreach (var c in otName)
{
if (c > 0x7E || c < 0x20)
{
hasSpecialChars = true;
break;
}
}
if (string.IsNullOrEmpty(otName))
{
LegalityReport = "OT Name is empty.";
}
else if (hasSpecialChars)
{
LegalityReport = $"OT Name '{otName}' contains special characters that may not render correctly in-game.";
}
else
{
LegalityReport = $"OT Name '{otName}' appears to use standard characters.";
}
}
// --- Sprite context menu commands ---
[RelayCommand]
@ -2032,6 +2187,7 @@ private void UpdateLegality()
{
LegalityImage = null;
Move1Legal = Move2Legal = Move3Legal = Move4Legal = true;
Relearn1Legal = Relearn2Legal = Relearn3Legal = Relearn4Legal = true;
return;
}
@ -2065,11 +2221,26 @@ private void UpdateLegality()
{
Move1Legal = Move2Legal = Move3Legal = Move4Legal = true;
}
// Relearn legality
var relearn = la.Info.Relearn;
if (relearn is { Length: >= 4 })
{
Relearn1Legal = relearn[0].Valid;
Relearn2Legal = relearn[1].Valid;
Relearn3Legal = relearn[2].Valid;
Relearn4Legal = relearn[3].Valid;
}
else
{
Relearn1Legal = Relearn2Legal = Relearn3Legal = Relearn4Legal = true;
}
}
catch
{
LegalityImage = null;
Move1Legal = Move2Legal = Move3Legal = Move4Legal = true;
Relearn1Legal = Relearn2Legal = Relearn3Legal = Relearn4Legal = true;
}
}

View File

@ -13,6 +13,7 @@
<KeyBinding Gesture="Ctrl+Q" Command="{Binding ExitCommand}" />
<KeyBinding Gesture="Ctrl+T" Command="{Binding ImportShowdownCommand}" />
<KeyBinding Gesture="Ctrl+Shift+T" Command="{Binding ExportShowdownCommand}" />
<KeyBinding Gesture="Ctrl+E" Command="{Binding ExportSAVCommand}" />
<KeyBinding Gesture="Ctrl+D" Command="{Binding OpenDatabaseCommand}" />
<KeyBinding Gesture="Ctrl+R" Command="{Binding OpenReportGridCommand}" />
<KeyBinding Gesture="Ctrl+F" Command="{Binding OpenFolderCommand}" />
@ -30,7 +31,8 @@
<MenuItem Header="_Open..." Command="{Binding OpenFileCommand}" InputGesture="Ctrl+O" />
<MenuItem Header="_Save..." Command="{Binding SaveFileCommand}" InputGesture="Ctrl+S" />
<Separator />
<MenuItem Header="_Export PKM..." Command="{Binding ExportPKMCommand}" InputGesture="Ctrl+E" />
<MenuItem Header="_Export PKM..." Command="{Binding ExportPKMCommand}" />
<MenuItem Header="Export _SAV..." Command="{Binding ExportSAVCommand}" InputGesture="Ctrl+E" />
<Separator />
<MenuItem Header="E_xit" Command="{Binding ExitCommand}" InputGesture="Ctrl+Q" />
</MenuItem>
@ -64,6 +66,7 @@
<MenuItem Header="_Data">
<MenuItem Header="_Load Boxes..." Command="{Binding LoadBoxesCommand}" />
<MenuItem Header="_Dump Box..." Command="{Binding DumpBoxCommand}" />
<MenuItem Header="Dump All Bo_xes..." Command="{Binding DumpAllBoxesCommand}" />
</MenuItem>
<MenuItem Header="_Options">
<MenuItem Header="_Language">

View File

@ -39,6 +39,10 @@
<Image Source="{Binding LegalityImage}" Width="24" Height="24"
VerticalAlignment="Center" Margin="4,0,0,0"
ToolTip.Tip="{Binding LegalityReport}" />
<!-- Status Condition -->
<TextBlock Text="{Binding StatusConditionText}" FontSize="9" Opacity="0.7"
VerticalAlignment="Bottom" Margin="4,0"
IsVisible="{Binding StatusConditionText, Converter={x:Static StringConverters.IsNotNullOrEmpty}}" />
</StackPanel>
<!-- TabControl with LEFT-side tabs -->
@ -195,8 +199,11 @@
<!-- Ball -->
<TextBlock Grid.Row="2" Grid.Column="0" Text="Ball:" TextAlignment="Right" VerticalAlignment="Center" Margin="0,0,6,0" />
<ComboBox Grid.Row="2" Grid.Column="1" ItemsSource="{Binding BallList}" SelectedItem="{Binding SelectedBall}"
DisplayMemberBinding="{Binding Text, DataType=core:ComboItem}" Height="25" Width="144" HorizontalAlignment="Left" />
<StackPanel Grid.Row="2" Grid.Column="1" Orientation="Horizontal" VerticalAlignment="Center">
<Image Source="{Binding BallSprite}" Width="24" Height="24" Margin="0,0,4,0" RenderOptions.BitmapInterpolationMode="None" />
<ComboBox ItemsSource="{Binding BallList}" SelectedItem="{Binding SelectedBall}"
DisplayMemberBinding="{Binding Text, DataType=core:ComboItem}" Height="25" Width="118" />
</StackPanel>
<!-- Met Level + Fateful Encounter -->
<TextBlock Grid.Row="3" Grid.Column="0" Text="Met Level:" TextAlignment="Right" VerticalAlignment="Center" Margin="0,0,6,0" />
@ -412,9 +419,11 @@
<TextBlock Text="Tera Type" FontWeight="SemiBold" />
<Grid RowDefinitions="27,27" ColumnDefinitions="80,*" Margin="4,0,0,0">
<TextBlock Grid.Row="0" Grid.Column="0" Text="Original:" VerticalAlignment="Center" />
<NumericUpDown Grid.Row="0" Grid.Column="1" Value="{Binding TeraTypeOriginal}" Minimum="0" Maximum="99" Height="25" Width="60" HorizontalAlignment="Left" />
<ComboBox Grid.Row="0" Grid.Column="1" ItemsSource="{Binding TeraTypeList}" SelectedItem="{Binding SelectedTeraOriginal}"
DisplayMemberBinding="{Binding Text, DataType=core:ComboItem}" Height="25" Width="120" HorizontalAlignment="Left" />
<TextBlock Grid.Row="1" Grid.Column="0" Text="Override:" VerticalAlignment="Center" />
<NumericUpDown Grid.Row="1" Grid.Column="1" Value="{Binding TeraTypeOverride}" Minimum="0" Maximum="99" Height="25" Width="60" HorizontalAlignment="Left" />
<ComboBox Grid.Row="1" Grid.Column="1" ItemsSource="{Binding TeraTypeList}" SelectedItem="{Binding SelectedTeraOverride}"
DisplayMemberBinding="{Binding Text, DataType=core:ComboItem}" Height="25" Width="120" HorizontalAlignment="Left" />
</Grid>
</StackPanel>
@ -453,12 +462,13 @@
<ScrollViewer VerticalScrollBarVisibility="Auto">
<StackPanel Margin="8" Spacing="4">
<TextBlock Text="Current Moves" FontWeight="SemiBold" VerticalAlignment="Center" />
<Grid RowDefinitions="27,27,27,27" ColumnDefinitions="52,*,40,48,18">
<Grid RowDefinitions="27,27,27,27" ColumnDefinitions="52,*,48,48,18">
<!-- Move 1 -->
<TextBlock Grid.Row="0" Grid.Column="0" Text="Move 1:" VerticalAlignment="Center" />
<ComboBox Grid.Row="0" Grid.Column="1" ItemsSource="{Binding MoveList}" SelectedItem="{Binding SelectedMove1}"
DisplayMemberBinding="{Binding Text, DataType=core:ComboItem}" Height="25" />
<TextBlock Grid.Row="0" Grid.Column="2" Text="{Binding Move1_PP, StringFormat='PP:{0}'}" VerticalAlignment="Center" HorizontalAlignment="Center" FontSize="10" />
<NumericUpDown Grid.Row="0" Grid.Column="2" Value="{Binding Move1_PP}" Minimum="0" Maximum="99" Height="25" Width="46" ShowButtonSpinner="False"
ToolTip.Tip="PP" />
<NumericUpDown Grid.Row="0" Grid.Column="3" Value="{Binding Move1_PPUps}" Minimum="0" Maximum="3" Height="25" Width="46" ShowButtonSpinner="False"
ToolTip.Tip="PP Ups (0-3)" />
<TextBlock Grid.Row="0" Grid.Column="4" Text="!" Foreground="Red" FontWeight="Bold"
@ -468,7 +478,8 @@
<TextBlock Grid.Row="1" Grid.Column="0" Text="Move 2:" VerticalAlignment="Center" />
<ComboBox Grid.Row="1" Grid.Column="1" ItemsSource="{Binding MoveList}" SelectedItem="{Binding SelectedMove2}"
DisplayMemberBinding="{Binding Text, DataType=core:ComboItem}" Height="25" />
<TextBlock Grid.Row="1" Grid.Column="2" Text="{Binding Move2_PP, StringFormat='PP:{0}'}" VerticalAlignment="Center" HorizontalAlignment="Center" FontSize="10" />
<NumericUpDown Grid.Row="1" Grid.Column="2" Value="{Binding Move2_PP}" Minimum="0" Maximum="99" Height="25" Width="46" ShowButtonSpinner="False"
ToolTip.Tip="PP" />
<NumericUpDown Grid.Row="1" Grid.Column="3" Value="{Binding Move2_PPUps}" Minimum="0" Maximum="3" Height="25" Width="46" ShowButtonSpinner="False"
ToolTip.Tip="PP Ups (0-3)" />
<TextBlock Grid.Row="1" Grid.Column="4" Text="!" Foreground="Red" FontWeight="Bold"
@ -478,7 +489,8 @@
<TextBlock Grid.Row="2" Grid.Column="0" Text="Move 3:" VerticalAlignment="Center" />
<ComboBox Grid.Row="2" Grid.Column="1" ItemsSource="{Binding MoveList}" SelectedItem="{Binding SelectedMove3}"
DisplayMemberBinding="{Binding Text, DataType=core:ComboItem}" Height="25" />
<TextBlock Grid.Row="2" Grid.Column="2" Text="{Binding Move3_PP, StringFormat='PP:{0}'}" VerticalAlignment="Center" HorizontalAlignment="Center" FontSize="10" />
<NumericUpDown Grid.Row="2" Grid.Column="2" Value="{Binding Move3_PP}" Minimum="0" Maximum="99" Height="25" Width="46" ShowButtonSpinner="False"
ToolTip.Tip="PP" />
<NumericUpDown Grid.Row="2" Grid.Column="3" Value="{Binding Move3_PPUps}" Minimum="0" Maximum="3" Height="25" Width="46" ShowButtonSpinner="False"
ToolTip.Tip="PP Ups (0-3)" />
<TextBlock Grid.Row="2" Grid.Column="4" Text="!" Foreground="Red" FontWeight="Bold"
@ -488,7 +500,8 @@
<TextBlock Grid.Row="3" Grid.Column="0" Text="Move 4:" VerticalAlignment="Center" />
<ComboBox Grid.Row="3" Grid.Column="1" ItemsSource="{Binding MoveList}" SelectedItem="{Binding SelectedMove4}"
DisplayMemberBinding="{Binding Text, DataType=core:ComboItem}" Height="25" />
<TextBlock Grid.Row="3" Grid.Column="2" Text="{Binding Move4_PP, StringFormat='PP:{0}'}" VerticalAlignment="Center" HorizontalAlignment="Center" FontSize="10" />
<NumericUpDown Grid.Row="3" Grid.Column="2" Value="{Binding Move4_PP}" Minimum="0" Maximum="99" Height="25" Width="46" ShowButtonSpinner="False"
ToolTip.Tip="PP" />
<NumericUpDown Grid.Row="3" Grid.Column="3" Value="{Binding Move4_PPUps}" Minimum="0" Maximum="3" Height="25" Width="46" ShowButtonSpinner="False"
ToolTip.Tip="PP Ups (0-3)" />
<TextBlock Grid.Row="3" Grid.Column="4" Text="!" Foreground="Red" FontWeight="Bold"
@ -515,19 +528,31 @@
<StackPanel IsVisible="{Binding HasRelearnMoves}" Spacing="2" Margin="0,4,0,0">
<Border BorderBrush="#CCCCCC" BorderThickness="0,0,0,1" Margin="0,2" />
<TextBlock Text="Relearn Moves" FontWeight="SemiBold" />
<Grid RowDefinitions="27,27,27,27" ColumnDefinitions="68,*">
<Grid RowDefinitions="27,27,27,27" ColumnDefinitions="68,*,18">
<TextBlock Grid.Row="0" Grid.Column="0" Text="Relearn 1:" VerticalAlignment="Center" />
<ComboBox Grid.Row="0" Grid.Column="1" ItemsSource="{Binding MoveList}" SelectedItem="{Binding SelectedRelearnMove1}"
DisplayMemberBinding="{Binding Text, DataType=core:ComboItem}" Height="25" />
<TextBlock Grid.Row="0" Grid.Column="2" Text="!" Foreground="Red" FontWeight="Bold"
IsVisible="{Binding !Relearn1Legal}" VerticalAlignment="Center" HorizontalAlignment="Center"
ToolTip.Tip="Illegal relearn move" />
<TextBlock Grid.Row="1" Grid.Column="0" Text="Relearn 2:" VerticalAlignment="Center" />
<ComboBox Grid.Row="1" Grid.Column="1" ItemsSource="{Binding MoveList}" SelectedItem="{Binding SelectedRelearnMove2}"
DisplayMemberBinding="{Binding Text, DataType=core:ComboItem}" Height="25" />
<TextBlock Grid.Row="1" Grid.Column="2" Text="!" Foreground="Red" FontWeight="Bold"
IsVisible="{Binding !Relearn2Legal}" VerticalAlignment="Center" HorizontalAlignment="Center"
ToolTip.Tip="Illegal relearn move" />
<TextBlock Grid.Row="2" Grid.Column="0" Text="Relearn 3:" VerticalAlignment="Center" />
<ComboBox Grid.Row="2" Grid.Column="1" ItemsSource="{Binding MoveList}" SelectedItem="{Binding SelectedRelearnMove3}"
DisplayMemberBinding="{Binding Text, DataType=core:ComboItem}" Height="25" />
<TextBlock Grid.Row="2" Grid.Column="2" Text="!" Foreground="Red" FontWeight="Bold"
IsVisible="{Binding !Relearn3Legal}" VerticalAlignment="Center" HorizontalAlignment="Center"
ToolTip.Tip="Illegal relearn move" />
<TextBlock Grid.Row="3" Grid.Column="0" Text="Relearn 4:" VerticalAlignment="Center" />
<ComboBox Grid.Row="3" Grid.Column="1" ItemsSource="{Binding MoveList}" SelectedItem="{Binding SelectedRelearnMove4}"
DisplayMemberBinding="{Binding Text, DataType=core:ComboItem}" Height="25" />
<TextBlock Grid.Row="3" Grid.Column="2" Text="!" Foreground="Red" FontWeight="Bold"
IsVisible="{Binding !Relearn4Legal}" VerticalAlignment="Center" HorizontalAlignment="Center"
ToolTip.Tip="Illegal relearn move" />
</Grid>
</StackPanel>
</StackPanel>
@ -678,6 +703,9 @@
<Button Content="{Binding OtGenderSymbol}" Command="{Binding ToggleOtGenderCommand}"
FontSize="14" FontWeight="Bold" Width="24" Height="25" Padding="0" Margin="4,0,0,0"
HorizontalContentAlignment="Center" VerticalContentAlignment="Center" />
<Button Content="?" Command="{Binding ShowOtNameWarningCommand}"
Width="20" Height="20" Padding="0" FontSize="10" Margin="2,0,0,0"
ToolTip.Tip="Check OT name font compatibility" />
</StackPanel>
<!-- TID -->
@ -704,8 +732,9 @@
<StackPanel Grid.Row="5" Grid.Column="1" Orientation="Horizontal" VerticalAlignment="Center"
IsVisible="{Binding HasHandler}">
<TextBox Text="{Binding HandlingTrainerName}" Height="25" Width="120" />
<TextBlock Text="{Binding HtGenderSymbol}" FontSize="14" FontWeight="Bold"
VerticalAlignment="Center" Margin="6,0,0,0" Width="16" />
<Button Content="{Binding HtGenderSymbol}" Command="{Binding ToggleHtGenderCommand}"
FontSize="14" FontWeight="Bold" Width="24" Height="25" Padding="0" Margin="4,0,0,0"
HorizontalContentAlignment="Center" VerticalContentAlignment="Center" />
</StackPanel>
<!-- HT Language -->
@ -737,20 +766,29 @@
<!-- Country (Gen 6-7) -->
<TextBlock Grid.Row="11" Grid.Column="0" Text="Country:" TextAlignment="Right" VerticalAlignment="Center" Margin="0,0,6,0"
IsVisible="{Binding HasRegionData}" />
<NumericUpDown Grid.Row="11" Grid.Column="1" Value="{Binding Country}" Minimum="0" Maximum="255" Height="25" Width="60" HorizontalAlignment="Left"
IsVisible="{Binding HasRegionData}" />
<StackPanel Grid.Row="11" Grid.Column="1" Orientation="Horizontal" VerticalAlignment="Center"
IsVisible="{Binding HasRegionData}">
<NumericUpDown Value="{Binding Country}" Minimum="0" Maximum="255" Height="25" Width="60" />
<TextBlock Text="{Binding CountryName}" VerticalAlignment="Center" Margin="6,0,0,0" FontSize="10" Opacity="0.7" />
</StackPanel>
<!-- Sub Region (Gen 6-7) -->
<TextBlock Grid.Row="12" Grid.Column="0" Text="Sub Region:" TextAlignment="Right" VerticalAlignment="Center" Margin="0,0,6,0"
IsVisible="{Binding HasRegionData}" />
<NumericUpDown Grid.Row="12" Grid.Column="1" Value="{Binding SubRegion}" Minimum="0" Maximum="255" Height="25" Width="60" HorizontalAlignment="Left"
IsVisible="{Binding HasRegionData}" />
<StackPanel Grid.Row="12" Grid.Column="1" Orientation="Horizontal" VerticalAlignment="Center"
IsVisible="{Binding HasRegionData}">
<NumericUpDown Value="{Binding SubRegion}" Minimum="0" Maximum="255" Height="25" Width="60" />
<TextBlock Text="{Binding SubRegionName}" VerticalAlignment="Center" Margin="6,0,0,0" FontSize="10" Opacity="0.7" />
</StackPanel>
<!-- 3DS Region (Gen 6-7) -->
<TextBlock Grid.Row="13" Grid.Column="0" Text="3DS Region:" TextAlignment="Right" VerticalAlignment="Center" Margin="0,0,6,0"
IsVisible="{Binding HasRegionData}" />
<NumericUpDown Grid.Row="13" Grid.Column="1" Value="{Binding ConsoleRegion}" Minimum="0" Maximum="255" Height="25" Width="60" HorizontalAlignment="Left"
IsVisible="{Binding HasRegionData}" />
<StackPanel Grid.Row="13" Grid.Column="1" Orientation="Horizontal" VerticalAlignment="Center"
IsVisible="{Binding HasRegionData}">
<NumericUpDown Value="{Binding ConsoleRegion}" Minimum="0" Maximum="6" Height="25" Width="60" />
<TextBlock Text="{Binding ConsoleRegionName}" VerticalAlignment="Center" Margin="6,0,0,0" FontSize="10" Opacity="0.7" />
</StackPanel>
<!-- HT Language in row 6 already handled above -->