mirror of
https://github.com/kwsch/PKHeX.git
synced 2026-03-21 17:48:28 -05:00
All subform ViewModels now use transactional cancel semantics matching WinForms: edits happen on a clone, Cancel discards them, Save copies the clone back to the origin via CopyChangesFrom. Gen 1-2: SAVEventReset1, SAVHallOfFame1, SAVMisc2, SAVRTC2 Gen 3: SAVRoamer3, SAVSecretBase3, SAVHallOfFame3, SAVRTC3, SAVMisc3, PokeBlock3CaseEditor, SimplePokedex Gen 4: PokeGear4, Trainer4BR, BattlePass4, Gear4, Apricorn4, HoneyTree4, Underground4, Geonet4, PoffinCase4, Pokedex4 Gen 5: Pokedex5, UnityTower5, DLC5 Gen 6: SAVPokepuff6 Gen 7: SAVHallOfFame7 Gen 8 BDSP: Poffin8b, SealStickers8b, Underground8b Cross-gen: EventFlags, EventFlags2, EventWork, Inventory, MailBox, Wondercard, BoxLayout, TrainerStat
143 lines
3.4 KiB
C#
143 lines
3.4 KiB
C#
using System;
|
|
using System.Collections.ObjectModel;
|
|
using CommunityToolkit.Mvvm.ComponentModel;
|
|
using CommunityToolkit.Mvvm.Input;
|
|
using PKHeX.Core;
|
|
|
|
namespace PKHeX.Avalonia.ViewModels.Subforms;
|
|
|
|
/// <summary>
|
|
/// Model for a single PokeBlock entry in the case.
|
|
/// </summary>
|
|
public partial class PokeBlock3Model : ObservableObject
|
|
{
|
|
private readonly PokeBlock3 _block;
|
|
public int Index { get; }
|
|
|
|
[ObservableProperty]
|
|
private PokeBlock3Color _color;
|
|
|
|
[ObservableProperty]
|
|
private byte _spicy;
|
|
|
|
[ObservableProperty]
|
|
private byte _dry;
|
|
|
|
[ObservableProperty]
|
|
private byte _sweet;
|
|
|
|
[ObservableProperty]
|
|
private byte _bitter;
|
|
|
|
[ObservableProperty]
|
|
private byte _sour;
|
|
|
|
[ObservableProperty]
|
|
private byte _feel;
|
|
|
|
public string DisplayName => $"{Index + 1:00} - {Color}";
|
|
|
|
public PokeBlock3Model(PokeBlock3 block, int index)
|
|
{
|
|
_block = block;
|
|
Index = index;
|
|
_color = block.Color;
|
|
_spicy = block.Spicy;
|
|
_dry = block.Dry;
|
|
_sweet = block.Sweet;
|
|
_bitter = block.Bitter;
|
|
_sour = block.Sour;
|
|
_feel = block.Feel;
|
|
}
|
|
|
|
public void SaveToBlock()
|
|
{
|
|
_block.Color = Color;
|
|
_block.Spicy = Spicy;
|
|
_block.Dry = Dry;
|
|
_block.Sweet = Sweet;
|
|
_block.Bitter = Bitter;
|
|
_block.Sour = Sour;
|
|
_block.Feel = Feel;
|
|
}
|
|
|
|
public void LoadFromBlock()
|
|
{
|
|
Color = _block.Color;
|
|
Spicy = _block.Spicy;
|
|
Dry = _block.Dry;
|
|
Sweet = _block.Sweet;
|
|
Bitter = _block.Bitter;
|
|
Sour = _block.Sour;
|
|
Feel = _block.Feel;
|
|
OnPropertyChanged(nameof(DisplayName));
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// ViewModel for the Gen 3 PokeBlock Case editor.
|
|
/// Allows viewing and editing all 40 PokeBlock slots.
|
|
/// </summary>
|
|
public partial class PokeBlock3CaseEditorViewModel : SaveEditorViewModelBase
|
|
{
|
|
private readonly SaveFile _origin;
|
|
private readonly SAV3 _sav;
|
|
private readonly ISaveBlock3LargeHoenn _hoenn;
|
|
private readonly PokeBlock3Case _case;
|
|
|
|
public ObservableCollection<PokeBlock3Model> Blocks { get; } = [];
|
|
public Array ColorValues { get; } = Enum.GetValues<PokeBlock3Color>();
|
|
|
|
[ObservableProperty]
|
|
private PokeBlock3Model? _selectedBlock;
|
|
|
|
[ObservableProperty]
|
|
private int _selectedBlockIndex = -1;
|
|
|
|
public PokeBlock3CaseEditorViewModel(SAV3 sav, ISaveBlock3LargeHoenn hoenn) : base(sav)
|
|
{
|
|
_origin = sav;
|
|
_sav = (SAV3)sav.Clone();
|
|
_hoenn = (ISaveBlock3LargeHoenn)_sav.LargeBlock;
|
|
_case = _hoenn.PokeBlocks;
|
|
|
|
for (int i = 0; i < _case.Blocks.Length; i++)
|
|
Blocks.Add(new PokeBlock3Model(_case.Blocks[i], i));
|
|
|
|
if (Blocks.Count > 0)
|
|
SelectedBlockIndex = 0;
|
|
}
|
|
|
|
partial void OnSelectedBlockIndexChanged(int value)
|
|
{
|
|
if (value >= 0 && value < Blocks.Count)
|
|
SelectedBlock = Blocks[value];
|
|
}
|
|
|
|
[RelayCommand]
|
|
private void MaximizeAll()
|
|
{
|
|
_case.MaximizeAll(true);
|
|
foreach (var block in Blocks)
|
|
block.LoadFromBlock();
|
|
}
|
|
|
|
[RelayCommand]
|
|
private void DeleteAll()
|
|
{
|
|
_case.DeleteAll();
|
|
foreach (var block in Blocks)
|
|
block.LoadFromBlock();
|
|
}
|
|
|
|
[RelayCommand]
|
|
private void Save()
|
|
{
|
|
foreach (var block in Blocks)
|
|
block.SaveToBlock();
|
|
_hoenn.PokeBlocks = _case;
|
|
_origin.CopyChangesFrom(_sav);
|
|
Modified = true;
|
|
}
|
|
}
|