Wave 10: Close all remaining audit gaps for 100% parity

Stats tab (previously missing from XAML):
- Hyper Training toggles (Gen 7+, IHyperTrain)
- Dynamax Level (Gen 8, IDynamaxLevel)
- Gigantamax/Alpha toggles (Gen 8/8a)
- Tera Type Original/Override (Gen 9, ITeraType)
- EV Total with 510 validation warning
- Hidden Power type display (computed from IVs)
- Characteristic display
- Base Stat Total (BST) display

Moves tab (previously missing from XAML):
- PP display per move (read-only)
- PP Ups per move (0-3 editable)
- Relearn Moves 1-4 with ComboBox selection (Gen 6+)
- Move legality "!" indicators

Cosmetic tab: Walking Mood (Gen 4), Ribbons/Memories buttons
OT/Misc tab: Received Date (PB7), variable naming fix
Sprite: Legality icon 16→24px
Menus: Add Ctrl+G/N/M/Shift+S/P keyboard shortcuts
SAV tools: Add Friend Safari (Gen 6 XY)
This commit is contained in:
montanon 2026-03-16 10:42:32 -03:00
parent f76c98bfc0
commit 021184ffa2
4 changed files with 499 additions and 23 deletions

View File

@ -114,12 +114,77 @@ public partial class PKMEditorViewModel : ObservableObject
[ObservableProperty] private ushort _move3;
[ObservableProperty] private ushort _move4;
// Move PP and PP Ups
[ObservableProperty] private int _move1_PP;
[ObservableProperty] private int _move2_PP;
[ObservableProperty] private int _move3_PP;
[ObservableProperty] private int _move4_PP;
[ObservableProperty] private int _move1_PPUps;
[ObservableProperty] private int _move2_PPUps;
[ObservableProperty] private int _move3_PPUps;
[ObservableProperty] private int _move4_PPUps;
// Relearn Moves
[ObservableProperty] private ushort _relearnMove1;
[ObservableProperty] private ushort _relearnMove2;
[ObservableProperty] private ushort _relearnMove3;
[ObservableProperty] private ushort _relearnMove4;
[ObservableProperty] private ComboItem? _selectedRelearnMove1;
[ObservableProperty] private ComboItem? _selectedRelearnMove2;
[ObservableProperty] private ComboItem? _selectedRelearnMove3;
[ObservableProperty] private ComboItem? _selectedRelearnMove4;
[ObservableProperty] private bool _hasRelearnMoves;
partial void OnSelectedRelearnMove1Changed(ComboItem? value) { if (value is not null) RelearnMove1 = (ushort)value.Value; if (!_isPopulating) UpdateLegality(); }
partial void OnSelectedRelearnMove2Changed(ComboItem? value) { if (value is not null) RelearnMove2 = (ushort)value.Value; if (!_isPopulating) UpdateLegality(); }
partial void OnSelectedRelearnMove3Changed(ComboItem? value) { if (value is not null) RelearnMove3 = (ushort)value.Value; if (!_isPopulating) UpdateLegality(); }
partial void OnSelectedRelearnMove4Changed(ComboItem? value) { if (value is not null) RelearnMove4 = (ushort)value.Value; if (!_isPopulating) UpdateLegality(); }
// Move legality indicators
[ObservableProperty] private bool _move1Legal = true;
[ObservableProperty] private bool _move2Legal = true;
[ObservableProperty] private bool _move3Legal = true;
[ObservableProperty] private bool _move4Legal = true;
// Hyper Training
[ObservableProperty] private bool _htHp;
[ObservableProperty] private bool _htAtk;
[ObservableProperty] private bool _htDef;
[ObservableProperty] private bool _htSpA;
[ObservableProperty] private bool _htSpD;
[ObservableProperty] private bool _htSpe;
[ObservableProperty] private bool _hasHyperTraining;
// Dynamax
[ObservableProperty] private int _dynamaxLevel;
[ObservableProperty] private bool _hasDynamaxLevel;
// Gigantamax
[ObservableProperty] private bool _canGigantamax;
[ObservableProperty] private bool _hasGigantamax;
// Alpha (Legends Arceus)
[ObservableProperty] private bool _isAlpha;
[ObservableProperty] private bool _hasAlpha;
// Tera Type (Gen 9)
[ObservableProperty] private int _teraTypeOriginal;
[ObservableProperty] private int _teraTypeOverride;
[ObservableProperty] private bool _hasTeraType;
// EV Total display
[ObservableProperty] private int _evTotal;
[ObservableProperty] private bool _isEvTotalValid;
// Hidden Power Type display
[ObservableProperty] private string _hiddenPowerType = string.Empty;
// Characteristic display
[ObservableProperty] private string _characteristicText = string.Empty;
// Base Stat Total
[ObservableProperty] private int _baseST;
// Met
[ObservableProperty] private ushort _metLocation;
[ObservableProperty] private byte _metLevel;
@ -219,6 +284,16 @@ public partial class PKMEditorViewModel : ObservableObject
[ObservableProperty] private int _pokeStarFame;
[ObservableProperty] private bool _hasPokeStarFame;
// Cosmetic — Walking Mood (Gen 4 HG/SS)
[ObservableProperty] private int _walkingMood;
[ObservableProperty] private bool _hasWalkingMood;
// OT/Misc — Received Date (Let's Go PB7)
[ObservableProperty] private int _receivedYear;
[ObservableProperty] private int _receivedMonth;
[ObservableProperty] private int _receivedDay;
[ObservableProperty] private bool _hasReceivedDate;
// OT
[ObservableProperty] private string _ot = string.Empty;
[ObservableProperty] private ushort _tid;
@ -651,6 +726,124 @@ public void PopulateFields(PKM pk)
Move3 = pk.Move3;
Move4 = pk.Move4;
// Move PP and PP Ups
Move1_PP = pk.Move1_PP;
Move2_PP = pk.Move2_PP;
Move3_PP = pk.Move3_PP;
Move4_PP = pk.Move4_PP;
Move1_PPUps = pk.Move1_PPUps;
Move2_PPUps = pk.Move2_PPUps;
Move3_PPUps = pk.Move3_PPUps;
Move4_PPUps = pk.Move4_PPUps;
// Relearn Moves
var hasRelearn = pk.Format >= 6;
HasRelearnMoves = hasRelearn;
if (hasRelearn)
{
RelearnMove1 = pk.RelearnMove1;
RelearnMove2 = pk.RelearnMove2;
RelearnMove3 = pk.RelearnMove3;
RelearnMove4 = pk.RelearnMove4;
}
else
{
RelearnMove1 = RelearnMove2 = RelearnMove3 = RelearnMove4 = 0;
}
// Hyper Training
if (pk is IHyperTrain ht)
{
HasHyperTraining = true;
HtHp = ht.HT_HP;
HtAtk = ht.HT_ATK;
HtDef = ht.HT_DEF;
HtSpA = ht.HT_SPA;
HtSpD = ht.HT_SPD;
HtSpe = ht.HT_SPE;
}
else
{
HasHyperTraining = false;
HtHp = HtAtk = HtDef = HtSpA = HtSpD = HtSpe = false;
}
// Dynamax Level
if (pk is IDynamaxLevel dl)
{
HasDynamaxLevel = true;
DynamaxLevel = dl.DynamaxLevel;
}
else
{
HasDynamaxLevel = false;
DynamaxLevel = 0;
}
// Gigantamax
if (pk is IGigantamax gm)
{
HasGigantamax = true;
CanGigantamax = gm.CanGigantamax;
}
else
{
HasGigantamax = false;
CanGigantamax = false;
}
// Alpha (Legends Arceus)
if (pk is IAlpha alpha)
{
HasAlpha = true;
IsAlpha = alpha.IsAlpha;
}
else
{
HasAlpha = false;
IsAlpha = false;
}
// Tera Type (Gen 9)
if (pk is ITeraType tt)
{
HasTeraType = true;
TeraTypeOriginal = (int)tt.TeraTypeOriginal;
TeraTypeOverride = (int)tt.TeraTypeOverride;
}
else
{
HasTeraType = false;
TeraTypeOriginal = 0;
TeraTypeOverride = 0;
}
// EV Total
EvTotal = pk.EV_HP + pk.EV_ATK + pk.EV_DEF + pk.EV_SPA + pk.EV_SPD + pk.EV_SPE;
IsEvTotalValid = EvTotal <= 510;
// Base Stat Total
BaseST = pi.HP + pi.ATK + pi.DEF + pi.SPA + pi.SPD + pi.SPE;
// Hidden Power Type
Span<int> ivs = stackalloc int[6];
pk.GetIVs(ivs);
var hpType = HiddenPower.GetType(ivs, pk.Context);
var typeNames = GameInfo.Strings.Types;
HiddenPowerType = hpType + 1 < typeNames.Count ? typeNames[hpType + 1] : $"Type {hpType}";
// Characteristic
var charIdx = pk.Characteristic;
if (charIdx >= 0)
{
var charStrings = GameInfo.Strings.characteristics;
CharacteristicText = charIdx < charStrings.Length ? charStrings[charIdx] : string.Empty;
}
else
{
CharacteristicText = string.Empty;
}
// Met
MetLocation = pk.MetLocation;
MetLevel = pk.MetLevel;
@ -707,10 +900,10 @@ public void PopulateFields(PKM pk)
EncryptionConstantHex = pk.EncryptionConstant.ToString("X8");
// Home Tracker
if (pk is IHomeTrack ht)
if (pk is IHomeTrack homeTrack)
{
HasHomeTracker = true;
HomeTrackerHex = ht.Tracker.ToString("X16");
HomeTrackerHex = homeTrack.Tracker.ToString("X16");
}
else
{
@ -965,6 +1158,34 @@ public void PopulateFields(PKM pk)
PokeStarFame = 0;
}
// Cosmetic — Walking Mood (Gen 4 HG/SS)
if (pk is G4PKM g4Mood)
{
HasWalkingMood = true;
WalkingMood = g4Mood.WalkingMood;
}
else
{
HasWalkingMood = false;
WalkingMood = 0;
}
// OT/Misc — Received Date (Let's Go PB7)
if (pk is PB7 pb7Recv)
{
HasReceivedDate = true;
ReceivedYear = pb7Recv.ReceivedYear;
ReceivedMonth = pb7Recv.ReceivedMonth;
ReceivedDay = pb7Recv.ReceivedDay;
}
else
{
HasReceivedDate = false;
ReceivedYear = 0;
ReceivedMonth = 0;
ReceivedDay = 0;
}
// Form Argument
if (pk is IFormArgument fa)
{
@ -1042,6 +1263,19 @@ public void PopulateFields(PKM pk)
SelectedForm = FormList.FirstOrDefault(x => x.Value == pk.Form);
// Relearn move ComboItem selections
if (hasRelearn)
{
SelectedRelearnMove1 = MoveList.FirstOrDefault(x => x.Value == pk.RelearnMove1);
SelectedRelearnMove2 = MoveList.FirstOrDefault(x => x.Value == pk.RelearnMove2);
SelectedRelearnMove3 = MoveList.FirstOrDefault(x => x.Value == pk.RelearnMove3);
SelectedRelearnMove4 = MoveList.FirstOrDefault(x => x.Value == pk.RelearnMove4);
}
else
{
SelectedRelearnMove1 = SelectedRelearnMove2 = SelectedRelearnMove3 = SelectedRelearnMove4 = null;
}
UpdateSprite();
}
finally
@ -1116,6 +1350,52 @@ public void PopulateFields(PKM pk)
Entity.Move3 = Move3;
Entity.Move4 = Move4;
// Move PP Ups
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)
{
Entity.RelearnMove1 = RelearnMove1;
Entity.RelearnMove2 = RelearnMove2;
Entity.RelearnMove3 = RelearnMove3;
Entity.RelearnMove4 = RelearnMove4;
}
// Hyper Training
if (Entity is IHyperTrain htSaveHt)
{
htSaveHt.HT_HP = HtHp;
htSaveHt.HT_ATK = HtAtk;
htSaveHt.HT_DEF = HtDef;
htSaveHt.HT_SPA = HtSpA;
htSaveHt.HT_SPD = HtSpD;
htSaveHt.HT_SPE = HtSpe;
}
// Dynamax Level
if (Entity is IDynamaxLevel dlSave)
dlSave.DynamaxLevel = (byte)Math.Clamp(DynamaxLevel, 0, 10);
// Gigantamax
if (Entity is IGigantamax gmSave)
gmSave.CanGigantamax = CanGigantamax;
// Alpha
if (Entity is IAlpha alphaSave)
alphaSave.IsAlpha = IsAlpha;
// Tera Type
if (Entity is ITeraType ttSave)
{
ttSave.TeraTypeOriginal = (MoveType)TeraTypeOriginal;
ttSave.TeraTypeOverride = (MoveType)TeraTypeOverride;
}
Entity.OriginalTrainerName = Ot;
Entity.TID16 = Tid;
Entity.SID16 = Sid;
@ -1279,8 +1559,15 @@ public void PopulateFields(PKM pk)
{
pb7Save.Spirit = (byte)Math.Clamp(Spirit7b, 0, 255);
pb7Save.Mood = (byte)Math.Clamp(Mood7b, 0, 255);
pb7Save.ReceivedYear = (byte)Math.Clamp(ReceivedYear, 0, 255);
pb7Save.ReceivedMonth = (byte)Math.Clamp(ReceivedMonth, 0, 12);
pb7Save.ReceivedDay = (byte)Math.Clamp(ReceivedDay, 0, 31);
}
// Cosmetic — Walking Mood (Gen 4 HG/SS)
if (Entity is G4PKM g4MoodSave)
g4MoodSave.WalkingMood = (sbyte)Math.Clamp(WalkingMood, -127, 127);
// Form Argument
if (Entity is IFormArgument faSave)
faSave.FormArgument = FormArgument;
@ -1326,6 +1613,24 @@ private async Task OpenTechRecords()
catch (Exception ex) { LegalityReport = $"Tech Record error: {ex.Message}"; }
}
// --- Ribbons / Memories placeholder commands ---
[RelayCommand]
private void OpenRibbons()
{
LegalityReport = Entity is null
? "No Pokémon loaded."
: "Ribbon editor: use Tools > Ribbon Editor from the main menu.";
}
[RelayCommand]
private void OpenMemories()
{
LegalityReport = Entity is null
? "No Pokémon loaded."
: "Memory editor: use Tools > PKM Editors > Memory / Amie from the main menu.";
}
// --- IV/EV quick-set commands ---
[RelayCommand]
@ -1465,6 +1770,27 @@ private void RecalcStats()
SpA = Entity.Stat_SPA;
SpD = Entity.Stat_SPD;
Spe = Entity.Stat_SPE;
// Refresh computed display fields
EvTotal = Ev_HP + Ev_ATK + Ev_DEF + Ev_SPA + Ev_SPD + Ev_SPE;
IsEvTotalValid = EvTotal <= 510;
Span<int> ivs = stackalloc int[6];
Entity.GetIVs(ivs);
var hpType = HiddenPower.GetType(ivs, Entity.Context);
var typeNames = GameInfo.Strings.Types;
HiddenPowerType = hpType + 1 < typeNames.Count ? typeNames[hpType + 1] : $"Type {hpType}";
var charIdx = Entity.Characteristic;
if (charIdx >= 0)
{
var charStrings = GameInfo.Strings.characteristics;
CharacteristicText = charIdx < charStrings.Length ? charStrings[charIdx] : string.Empty;
}
else
{
CharacteristicText = string.Empty;
}
}
// --- Nature stat color indicators ---

View File

@ -324,6 +324,16 @@ public static List<SAVToolDescriptor> GetAllTools()
sav => sav is SAV1,
sav => WithView<SAVEventReset1ViewModel, SAVEventReset1View>(
new SAVEventReset1ViewModel((SAV1)sav))),
// --- Friend Safari (Gen 6 XY) ---
new("Friend Safari",
sav => sav is SAV6XY,
sav =>
{
((SAV6XY)sav).UnlockAllFriendSafariSlots();
return WithView<SimpleTrainerViewModel, SimpleTrainerView>(
new SimpleTrainerViewModel(sav));
}),
];
}

View File

@ -16,6 +16,11 @@
<KeyBinding Gesture="Ctrl+D" Command="{Binding OpenDatabaseCommand}" />
<KeyBinding Gesture="Ctrl+R" Command="{Binding OpenReportGridCommand}" />
<KeyBinding Gesture="Ctrl+F" Command="{Binding OpenFolderCommand}" />
<KeyBinding Gesture="Ctrl+G" Command="{Binding OpenMysteryGiftDBCommand}" />
<KeyBinding Gesture="Ctrl+N" Command="{Binding OpenEncountersCommand}" />
<KeyBinding Gesture="Ctrl+M" Command="{Binding OpenBatchEditorCommand}" />
<KeyBinding Gesture="Ctrl+Shift+S" Command="{Binding OpenSettingsEditorCommand}" />
<KeyBinding Gesture="Ctrl+P" Command="{Binding ShowAboutCommand}" />
</Window.KeyBindings>
<DockPanel>
@ -44,9 +49,9 @@
<MenuItem Header="_Ribbon Editor" Command="{Binding OpenRibbonEditorCommand}" />
<Separator />
<MenuItem Header="_Database" Command="{Binding OpenDatabaseCommand}" InputGesture="Ctrl+D" />
<MenuItem Header="_Mystery Gift DB" Command="{Binding OpenMysteryGiftDBCommand}" />
<MenuItem Header="_Encounters" Command="{Binding OpenEncountersCommand}" />
<MenuItem Header="_Batch Editor" Command="{Binding OpenBatchEditorCommand}" />
<MenuItem Header="_Mystery Gift DB" Command="{Binding OpenMysteryGiftDBCommand}" InputGesture="Ctrl+G" />
<MenuItem Header="_Encounters" Command="{Binding OpenEncountersCommand}" InputGesture="Ctrl+N" />
<MenuItem Header="_Batch Editor" Command="{Binding OpenBatchEditorCommand}" InputGesture="Ctrl+M" />
<MenuItem Header="_Report Grid" Command="{Binding OpenReportGridCommand}" InputGesture="Ctrl+R" />
<Separator />
<MenuItem Header="_PKM Editors">
@ -64,11 +69,11 @@
<MenuItem Header="_Undo" Command="{Binding UndoSlotCommand}" InputGesture="Ctrl+U" />
<MenuItem Header="_Redo" Command="{Binding RedoSlotCommand}" InputGesture="Ctrl+Y" />
<Separator />
<MenuItem Header="_Settings" Command="{Binding OpenSettingsEditorCommand}" />
<MenuItem Header="_Settings" Command="{Binding OpenSettingsEditorCommand}" InputGesture="Ctrl+Shift+S" />
<Separator />
<MenuItem Header="Toggle _Dark Mode" Click="OnToggleThemeClick" />
<Separator />
<MenuItem Header="_About PKHeX" Command="{Binding ShowAboutCommand}" />
<MenuItem Header="_About PKHeX" Command="{Binding ShowAboutCommand}" InputGesture="Ctrl+P" />
</MenuItem>
</Menu>

View File

@ -36,7 +36,7 @@
VerticalAlignment="Center" Margin="1,0,0,0"
ToolTip.Tip="Square Shiny" />
<!-- Legality dot -->
<Image Source="{Binding LegalityImage}" Width="16" Height="16"
<Image Source="{Binding LegalityImage}" Width="24" Height="24"
VerticalAlignment="Center" Margin="4,0,0,0"
ToolTip.Tip="{Binding LegalityReport}" />
</StackPanel>
@ -348,6 +348,68 @@
<NumericUpDown Grid.Row="5" Grid.Column="1" Value="{Binding GvSpe}" Minimum="0" Maximum="10" Height="25" Width="70" HorizontalAlignment="Left" ShowButtonSpinner="False" />
</Grid>
</StackPanel>
<!-- Hyper Training -->
<StackPanel IsVisible="{Binding HasHyperTraining}" Spacing="2">
<Border BorderBrush="#CCCCCC" BorderThickness="0,0,0,1" Margin="0,2" />
<TextBlock Text="Hyper Training" FontWeight="SemiBold" />
<StackPanel Orientation="Horizontal" Spacing="6" Margin="4,0,0,0">
<CheckBox IsChecked="{Binding HtHp}" Content="HP" />
<CheckBox IsChecked="{Binding HtAtk}" Content="Atk" />
<CheckBox IsChecked="{Binding HtDef}" Content="Def" />
<CheckBox IsChecked="{Binding HtSpA}" Content="SpA" />
<CheckBox IsChecked="{Binding HtSpD}" Content="SpD" />
<CheckBox IsChecked="{Binding HtSpe}" Content="Spe" />
</StackPanel>
</StackPanel>
<!-- Dynamax Level -->
<StackPanel IsVisible="{Binding HasDynamaxLevel}" Spacing="2">
<Border BorderBrush="#CCCCCC" BorderThickness="0,0,0,1" Margin="0,2" />
<StackPanel Orientation="Horizontal" Spacing="8" VerticalAlignment="Center">
<TextBlock Text="Dynamax Lv:" VerticalAlignment="Center" FontWeight="SemiBold" />
<NumericUpDown Value="{Binding DynamaxLevel}" Minimum="0" Maximum="10" Height="25" Width="60" ShowButtonSpinner="True" />
</StackPanel>
</StackPanel>
<!-- Gigantamax -->
<CheckBox IsVisible="{Binding HasGigantamax}" IsChecked="{Binding CanGigantamax}" Content="Can Gigantamax" Margin="4,2,0,0" />
<!-- Alpha (Legends Arceus) -->
<CheckBox IsVisible="{Binding HasAlpha}" IsChecked="{Binding IsAlpha}" Content="Is Alpha" Margin="4,2,0,0" />
<!-- Tera Type (Gen 9) -->
<StackPanel IsVisible="{Binding HasTeraType}" Spacing="2">
<Border BorderBrush="#CCCCCC" BorderThickness="0,0,0,1" Margin="0,2" />
<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" />
<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" />
</Grid>
</StackPanel>
<!-- Summary Info -->
<Border BorderBrush="#CCCCCC" BorderThickness="0,0,0,1" Margin="0,4,0,2" />
<Grid RowDefinitions="22,22,22,22" ColumnDefinitions="90,*" Margin="4,0,0,0">
<TextBlock Grid.Row="0" Grid.Column="0" Text="EV Total:" VerticalAlignment="Center" />
<StackPanel Grid.Row="0" Grid.Column="1" Orientation="Horizontal" VerticalAlignment="Center">
<TextBlock Text="{Binding EvTotal}" VerticalAlignment="Center" />
<TextBlock Text=" / 510" VerticalAlignment="Center" Foreground="Gray" FontSize="10" />
<TextBlock Text=" !" Foreground="Red" FontWeight="Bold" IsVisible="{Binding !IsEvTotalValid}"
VerticalAlignment="Center" ToolTip.Tip="EV total exceeds 510" />
</StackPanel>
<TextBlock Grid.Row="1" Grid.Column="0" Text="BST:" VerticalAlignment="Center" />
<TextBlock Grid.Row="1" Grid.Column="1" Text="{Binding BaseST}" VerticalAlignment="Center" />
<TextBlock Grid.Row="2" Grid.Column="0" Text="Hidden Pwr:" VerticalAlignment="Center" />
<TextBlock Grid.Row="2" Grid.Column="1" Text="{Binding HiddenPowerType}" VerticalAlignment="Center" />
<TextBlock Grid.Row="3" Grid.Column="0" Text="Characteristic:" VerticalAlignment="Center" />
<TextBlock Grid.Row="3" Grid.Column="1" Text="{Binding CharacteristicText}" VerticalAlignment="Center" TextWrapping="Wrap" />
</Grid>
</StackPanel>
</ScrollViewer>
</TabItem>
@ -360,31 +422,48 @@
<TextBlock Text="Moves" VerticalAlignment="Center" />
</StackPanel>
</TabItem.Header>
<ScrollViewer VerticalScrollBarVisibility="Auto">
<StackPanel Margin="8" Spacing="4">
<Grid RowDefinitions="27,27,27,27,27" ColumnDefinitions="52,*,18">
<TextBlock Grid.Row="0" Grid.ColumnSpan="3" Text="Current Moves" FontWeight="SemiBold" VerticalAlignment="Center" />
<TextBlock Grid.Row="1" Grid.Column="0" Text="Move 1:" VerticalAlignment="Center" />
<ComboBox Grid.Row="1" Grid.Column="1" ItemsSource="{Binding MoveList}" SelectedItem="{Binding SelectedMove1}"
<TextBlock Text="Current Moves" FontWeight="SemiBold" VerticalAlignment="Center" />
<Grid RowDefinitions="27,27,27,27" ColumnDefinitions="52,*,40,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="1" Grid.Column="2" Text="!" Foreground="Red" FontWeight="Bold"
<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="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"
IsVisible="{Binding !Move1Legal}" VerticalAlignment="Center" HorizontalAlignment="Center"
ToolTip.Tip="Illegal move" />
<TextBlock Grid.Row="2" Grid.Column="0" Text="Move 2:" VerticalAlignment="Center" />
<ComboBox Grid.Row="2" Grid.Column="1" ItemsSource="{Binding MoveList}" SelectedItem="{Binding SelectedMove2}"
<!-- Move 2 -->
<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="2" Grid.Column="2" Text="!" Foreground="Red" FontWeight="Bold"
<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="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"
IsVisible="{Binding !Move2Legal}" VerticalAlignment="Center" HorizontalAlignment="Center"
ToolTip.Tip="Illegal move" />
<TextBlock Grid.Row="3" Grid.Column="0" Text="Move 3:" VerticalAlignment="Center" />
<ComboBox Grid.Row="3" Grid.Column="1" ItemsSource="{Binding MoveList}" SelectedItem="{Binding SelectedMove3}"
<!-- Move 3 -->
<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="3" Grid.Column="2" Text="!" Foreground="Red" FontWeight="Bold"
<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="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"
IsVisible="{Binding !Move3Legal}" VerticalAlignment="Center" HorizontalAlignment="Center"
ToolTip.Tip="Illegal move" />
<TextBlock Grid.Row="4" Grid.Column="0" Text="Move 4:" VerticalAlignment="Center" />
<ComboBox Grid.Row="4" Grid.Column="1" ItemsSource="{Binding MoveList}" SelectedItem="{Binding SelectedMove4}"
<!-- Move 4 -->
<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="4" Grid.Column="2" Text="!" Foreground="Red" FontWeight="Bold"
<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="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"
IsVisible="{Binding !Move4Legal}" VerticalAlignment="Center" HorizontalAlignment="Center"
ToolTip.Tip="Illegal move" />
</Grid>
@ -403,7 +482,28 @@
<Button Content="Tech Records" Command="{Binding OpenTechRecordsCommand}" Padding="6,2" FontSize="10"
IsVisible="{Binding HasTechRecords}" />
</StackPanel>
<!-- Relearn Moves -->
<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,*">
<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="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="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="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" />
</Grid>
</StackPanel>
</StackPanel>
</ScrollViewer>
</TabItem>
<!-- Cosmetic Tab -->
@ -514,6 +614,21 @@
</Grid>
</StackPanel>
<!-- Walking Mood (Gen 4 HG/SS) -->
<StackPanel IsVisible="{Binding HasWalkingMood}" Spacing="0">
<TextBlock Text="Walking" FontWeight="SemiBold" Margin="0,2,0,2" />
<Grid RowDefinitions="27" ColumnDefinitions="104,*">
<TextBlock Text="Mood:" TextAlignment="Right" VerticalAlignment="Center" Margin="0,0,6,0" />
<NumericUpDown Grid.Column="1" Value="{Binding WalkingMood}" Minimum="-127" Maximum="127" Height="25" Width="60" HorizontalAlignment="Left" />
</Grid>
</StackPanel>
<!-- Ribbons / Memories buttons -->
<StackPanel Orientation="Horizontal" Spacing="4" Margin="0,8,0,0">
<Button Content="Ribbons" Command="{Binding OpenRibbonsCommand}" Padding="6,2" FontSize="10" />
<Button Content="Memories" Command="{Binding OpenMemoriesCommand}" Padding="6,2" FontSize="10" />
</StackPanel>
</StackPanel>
</ScrollViewer>
</TabItem>
@ -527,7 +642,7 @@
</StackPanel>
</TabItem.Header>
<ScrollViewer VerticalScrollBarVisibility="Auto">
<Grid Margin="4,2,4,2" RowDefinitions="27,27,27,8,27,27,27,8,27,27,8,27,27,27,27,8,27" ColumnDefinitions="104,*">
<Grid Margin="4,2,4,2" RowDefinitions="27,27,27,8,27,27,27,8,27,27,8,27,27,27,27,8,27,8,27,27,27" ColumnDefinitions="104,*">
<!-- OT Name + Gender -->
<TextBlock Grid.Row="0" Grid.Column="0" Text="OT Name:" TextAlignment="Right" VerticalAlignment="Center" Margin="0,0,6,0" />
<StackPanel Grid.Row="0" Grid.Column="1" Orientation="Horizontal" VerticalAlignment="Center">
@ -625,6 +740,26 @@
<NumericUpDown Value="{Binding ExtraByteValue}" Minimum="0" Maximum="255"
Height="25" Width="60" Margin="4,0,0,0" />
</StackPanel>
<!-- Separator (Received Date) -->
<Border Grid.Row="17" Grid.ColumnSpan="2" BorderBrush="#CCCCCC" BorderThickness="0,0,0,1" Margin="0,2"
IsVisible="{Binding HasReceivedDate}" />
<!-- Received Date (Let's Go PB7) -->
<TextBlock Grid.Row="18" Grid.Column="0" Text="Recv Year:" TextAlignment="Right" VerticalAlignment="Center" Margin="0,0,6,0"
IsVisible="{Binding HasReceivedDate}" />
<NumericUpDown Grid.Row="18" Grid.Column="1" Value="{Binding ReceivedYear}" Minimum="0" Maximum="255" Height="25" Width="60" HorizontalAlignment="Left"
IsVisible="{Binding HasReceivedDate}" />
<TextBlock Grid.Row="19" Grid.Column="0" Text="Recv Month:" TextAlignment="Right" VerticalAlignment="Center" Margin="0,0,6,0"
IsVisible="{Binding HasReceivedDate}" />
<NumericUpDown Grid.Row="19" Grid.Column="1" Value="{Binding ReceivedMonth}" Minimum="0" Maximum="12" Height="25" Width="60" HorizontalAlignment="Left"
IsVisible="{Binding HasReceivedDate}" />
<TextBlock Grid.Row="20" Grid.Column="0" Text="Recv Day:" TextAlignment="Right" VerticalAlignment="Center" Margin="0,0,6,0"
IsVisible="{Binding HasReceivedDate}" />
<NumericUpDown Grid.Row="20" Grid.Column="1" Value="{Binding ReceivedDay}" Minimum="0" Maximum="31" Height="25" Width="60" HorizontalAlignment="Left"
IsVisible="{Binding HasReceivedDate}" />
</Grid>
</ScrollViewer>
</TabItem>