Check unsaved entity on sav export

Add setting to skip the unsaved entity check
Add setting to skip the overwrite? prompt and always call Save As

Change Overwrite prompt to have distinct buttons rather than rows that can be mis-clicked.

fix some comments/strings from Pokemon=>Pokémon

add some underline shortcut key for main menu for English translation
This commit is contained in:
Kurt 2026-02-22 11:11:16 -06:00
parent 1aedb012ac
commit d690f1c5d3
50 changed files with 145 additions and 73 deletions

View File

@ -1,4 +1,4 @@
namespace PKHeX.Core;
namespace PKHeX.Core;
/// <summary>
/// Simple interface representing a <see cref="PKM"/> viewer.
@ -44,4 +44,10 @@ public interface IPKMView
/// <param name="focus">Cause the viewer to give focus to itself.</param>
/// <param name="skipConversionCheck">Cause the viewer to skip converting the data. Faster if it is known that the format is the same as the previous format.</param>
void PopulateFields(PKM pk, bool focus = true, bool skipConversionCheck = false);
/// <summary>
/// Messages back that the entity has been saved.
/// </summary>
/// <param name="pk">Pokémon data that was saved.</param>
void NotifyWasExported(PKM pk);
}

View File

@ -5,6 +5,12 @@ namespace PKHeX.Core;
public sealed class AdvancedSettings
{
[LocalizedDescription("Skip the Overwrite prompt when exporting a save file, to always Save As...")]
public bool SaveExportForceSaveAs { get; set; }
[LocalizedDescription("Check if the Pokémon in the editor has unsaved changes before exporting the save file.")]
public bool SaveExportCheckUnsavedEntity { get; set; } = true;
[LocalizedDescription("Folder path that contains dump(s) of block hash-names. If a specific dump file does not exist, only names defined within the program's code will be loaded.")]
public string PathBlockKeyList { get; set; } = string.Empty;

View File

@ -13,4 +13,5 @@ public sealed class FakePKMEditor(PKM template) : IPKMView
public PKM PreparePKM(bool click = true) => Data;
public void PopulateFields(PKM pk, bool focus = true, bool skipConversionCheck = false) => Data = pk;
public void NotifyWasExported(PKM pk) { }
}

View File

@ -155,7 +155,7 @@ public static class Encounters5B2W2
public static readonly EncounterStatic5N[] Encounter_B2W2_N =
[
// N's Pokemon
// N's Pokémon
new(0xFF01007F) { Species = 509, Level = 07, Location = 015, Ability = OnlySecond, Nature = Nature.Timid }, // Purloin @ Route 2
new(0xFF01007F) { Species = 519, Level = 13, Location = 033, Ability = OnlySecond, Nature = Nature.Sassy }, // Pidove @ Pinwheel Forest
new(0xFF00003F) { Species = 532, Level = 13, Location = 033, Ability = OnlyFirst, Nature = Nature.Rash }, // Timburr @ Pinwheel Forest

View File

@ -11,7 +11,7 @@ public sealed class EvolutionRuleTweak
public static readonly EvolutionRuleTweak Default = new();
/// <summary>
/// In Sword &amp; Shield (Generation 8+), level 100 Pokemon can trigger evolution methods via Rare Candy level up.
/// In Sword &amp; Shield (Generation 8+), level 100 Pokémon can trigger evolution methods via Rare Candy level up.
/// </summary>
public static readonly EvolutionRuleTweak Level100 = new() { AllowLevelUpEvolution100 = true };

View File

@ -93,7 +93,7 @@ private static bool IsValidMemory29(Species encountered, Species species, GameVe
return true;
// OT Memory checks from here on.
// Zacian and Zamazenta being in an OT memory need to match the Pokemon's version.
// Zacian and Zamazenta being in an OT memory need to match the Pokémon's version.
if (version == GameVersion.SW && encountered == Zamazenta)
return false;
if (version == GameVersion.SH && encountered == Zacian)

View File

@ -89,7 +89,7 @@ public static bool IsRibbonValidFootprint(PKM pk, EvolutionHistory evos)
public static bool IsRibbonValidMasterRank(PKM pk, IEncounterTemplate enc, EvolutionHistory evos)
{
// Legends can compete in Ranked starting from Series 10.
// Past gen Pokemon can get the ribbon only if they've been reset.
// Past gen Pokémon can get the ribbon only if they've been reset.
if (evos.HasVisitedSWSH && IsRibbonValidMasterRankSWSH(pk, enc))
return true;

View File

@ -4,7 +4,7 @@
namespace PKHeX.Core;
/// <summary>
/// Pokemon Link Data Storage
/// Pokémon Link Data Storage
/// </summary>
/// <remarks>
/// This Template object is very similar to the <see cref="PCD"/> structure in that it stores more data than just the gift.
@ -37,7 +37,7 @@ public byte Flags
/// </summary>
public string Origin { get => StringConverter6.GetString(Source); set => StringConverter6.SetString(Source, value, 54, 0, StringConverterOption.ClearZero); }
// Pokemon transfer flags?
// transfer flags?
public uint Flags1 { get => ReadUInt32LittleEndian(Data[0x099..]); set => WriteUInt32LittleEndian(Data[0x099..], value); }
public uint Flags2 { get => ReadUInt32LittleEndian(Data[0x141..]); set => WriteUInt32LittleEndian(Data[0x141..], value); }
public uint Flags3 { get => ReadUInt32LittleEndian(Data[0x1E9..]); set => WriteUInt32LittleEndian(Data[0x1E9..], value); }

View File

@ -38,20 +38,20 @@ public static string[] GetExtensions(byte maxGeneration = Latest.Generation)
for (int i = min; i <= maxGeneration; i++)
result.Add($"pk{i}");
if (min < 3)
result.Add(ExtensionSK2); // stadium
result.Add(ExtensionSK2); // Stadium
if (maxGeneration >= 3)
{
result.Add(ExtensionCK3); // colosseum
result.Add(ExtensionXK3); // xd
result.Add(ExtensionCK3); // Colosseum
result.Add(ExtensionXK3); // XD
}
if (maxGeneration >= 4)
{
result.Add(ExtensionBK4); // battle revolution
result.Add(ExtensionRK4); // My Pokemon Ranch
result.Add(ExtensionRK4); // My Pokémon Ranch
}
if (maxGeneration >= 7)
result.Add(ExtensionPB7); // let's go
result.Add(ExtensionPB7); // Let's Go, Pikachu/Eevee
if (maxGeneration >= 8)
result.Add(ExtensionPB8); // Brilliant Diamond & Shining Pearl
if (maxGeneration >= 8)

View File

@ -4,6 +4,7 @@ MsgProgramIllegalModeActive = Illegaler Modus aktiviert.
MsgProgramUpdateAvailable = Neues Update verfügbar!
MsgProgramCloseUnsaved = Nicht gespeicherte Änderungen gehen verloren.
MsgProgramCloseConfirm = Bist du sicher, dass du PKHeX schließen möchtest?
MsgProgramSaveUnsaved = The Pokémon in the editor has unsaved changes.
MsgProgramSaveFileConfirm = Bist du sicher, dass du einen Spielstand laden möchtest?
MsgProgramError = FEHLER
MsgProgramErrorExpectedHex = Die erwartete Eingabe darf nur die folgenden Zeichen enthalten (0-9, A-F).

View File

@ -4,6 +4,7 @@ MsgProgramIllegalModeActive = Illegal mode activated.
MsgProgramUpdateAvailable = New Update Available!
MsgProgramCloseUnsaved = Any unsaved changes will be lost.
MsgProgramCloseConfirm = Are you sure you want to close PKHeX?
MsgProgramSaveUnsaved = The Pokémon in the editor has unsaved changes.
MsgProgramSaveFileConfirm = Are you sure you want to load a new save file?
MsgProgramError = ERROR
MsgProgramErrorExpectedHex = Expected Text containing only the following characters (0-9, A-F).
@ -56,7 +57,7 @@ MsgFileWriteProtected = File's location is write protected:
MsgFileWriteProtectedAdvice = If the file is on a removable disk (SD card), please ensure the write protection switch is not set.
MsgFileInUse = Unable to load file. It could be in use by another program.
MsgFileUnsupported = Attempted to load an unsupported file type/size. This could mean PKHeX doesn't support your save file or your save file is corrupt.
MsgPKMUnsupported = Attempted to load an unsupported file type/size. This could be caused by loading a different generation Pokemon file on an unsupported generation or your file is corrupt.
MsgPKMUnsupported = Attempted to load an unsupported file type/size. This could be caused by loading a different generation Pokémon file on an unsupported generation or your file is corrupt.
MsgPKMConvertSuccess = Converted from {0} to {1}.
MsgPKMConvertFail = Conversion failed.
MsgPKMMysteryGiftFail = Mystery Gift is not a Pokémon.
@ -109,7 +110,7 @@ MsgSaveSlotBadData = Unable to set to this slot.
MsgSaveBackup = Saved Backup of current SAV to:
MsgSaveBackupNotFound = Original file has been moved; unable to copy a backup.
MsgSaveCurrentGeneration = Current SAV Generation: {0}
MsgSaveBoxCloneFromTabs = Clone Pokemon from Editing Tabs to all slots in {0}?
MsgSaveBoxCloneFromTabs = Clone Pokémon from Editing Tabs to all slots in {0}?
MsgSaveBoxSortCurrent = Sort Current Box?
MsgSaveBoxSortCurrentFailBattle = Battle Box slots prevent the sorting of box.
MsgSaveBoxSortCurrentSuccess = Current Box sorted!

View File

@ -4,6 +4,7 @@ MsgProgramIllegalModeActive = Modo Ilegal activado.
MsgProgramUpdateAvailable = ¡Actualización disponible!
MsgProgramCloseUnsaved = Cualquier cambio no guardado se perderá.
MsgProgramCloseConfirm = ¿Estás seguro de que quieres cerrar PKHeX?
MsgProgramSaveUnsaved = The Pokémon in the editor has unsaved changes.
MsgProgramSaveFileConfirm = ¿Estás seguro de que quieres cargar un nuevo archivo de guardado?
MsgProgramError = ERROR
MsgProgramErrorExpectedHex = Se esperaba texto conteniendo solamente los siguiente caracteres (0-9, A-F).

View File

@ -4,6 +4,7 @@ MsgProgramIllegalModeActive = Modo Ilegal activado.
MsgProgramUpdateAvailable = ¡Actualización disponible!
MsgProgramCloseUnsaved = Cualquier cambio no guardado se perderá.
MsgProgramCloseConfirm = ¿Estás seguro de que quieres cerrar PKHeX?
MsgProgramSaveUnsaved = The Pokémon in the editor has unsaved changes.
MsgProgramSaveFileConfirm = ¿Estás seguro de que quieres cargar un nuevo archivo de guardado?
MsgProgramError = ERROR
MsgProgramErrorExpectedHex = Se esperaba texto conteniendo solamente los siguiente caracteres (0-9, A-F).

View File

@ -4,6 +4,7 @@ MsgProgramIllegalModeActive = Mode illégal activé.
MsgProgramUpdateAvailable = Nouvelle mise à jour disponible !
MsgProgramCloseUnsaved = Tout changement non sauvegardé sera perdu.
MsgProgramCloseConfirm = Êtes-vous sûr de vouloir fermer PKHeX ?
MsgProgramSaveUnsaved = The Pokémon in the editor has unsaved changes.
MsgProgramSaveFileConfirm = Voulez-vous vraiment charger un nouveau fichier de sauvegarde ?
MsgProgramError = Erreur
MsgProgramErrorExpectedHex = Le texte ne doit contenir que les caractères suivants (0-9, A-F).

View File

@ -4,6 +4,7 @@ MsgProgramIllegalModeActive = Modalità illegale attivata.
MsgProgramUpdateAvailable = Nuovo aggiornamento disponibile!
MsgProgramCloseUnsaved = Tutte le modifiche non salvate andranno perse.
MsgProgramCloseConfirm = Sei scuro di voler chiudere PKHeX?
MsgProgramSaveUnsaved = The Pokémon in the editor has unsaved changes.
MsgProgramSaveFileConfirm = Sei sicuro di voler caricare un nuovo file di salvataggio?
MsgProgramError = ERRORE
MsgProgramErrorExpectedHex = Previsto testo contenente i caratteri seguenti (0-9, A-F).

View File

@ -4,6 +4,7 @@ MsgProgramIllegalModeActive = チートモードがアクティブ化してい
MsgProgramUpdateAvailable = 新しいバージョンがあります!
MsgProgramCloseUnsaved = 保存されていない変更は失われます。
MsgProgramCloseConfirm = PKHeXを閉じてもよろしいですか
MsgProgramSaveUnsaved = The Pokémon in the editor has unsaved changes.
MsgProgramSaveFileConfirm = 新しいセーブファイルをロードしてもよろしいですか?
MsgProgramError = ERROR
MsgProgramErrorExpectedHex = 次の文字0-9,A-Fのみを含むテキストが必要です。

View File

@ -4,6 +4,7 @@ MsgProgramIllegalModeActive = 불법 모드를 사용합니다.
MsgProgramUpdateAvailable = 새 업데이트가 있습니다!
MsgProgramCloseUnsaved = 저장하지 않은 변경 사항은 손실됩니다.
MsgProgramCloseConfirm = 정말 PKHeX를 종료하시겠습니까?
MsgProgramSaveUnsaved = The Pokémon in the editor has unsaved changes.
MsgProgramSaveFileConfirm = 새로운 저장 파일을 불러오시겠다는 확신이 있습니까?
MsgProgramError = 오류
MsgProgramErrorExpectedHex = 숫자(0-9)와 일부 알파벳(A-F)만 사용할 수 있습니다.

View File

@ -4,6 +4,7 @@ MsgProgramIllegalModeActive = 非法模式启动。
MsgProgramUpdateAvailable = 有新版本!
MsgProgramCloseUnsaved = 未保存的更改将会丢失。
MsgProgramCloseConfirm = 你确定要关闭 PKHeX 吗?
MsgProgramSaveUnsaved = The Pokémon in the editor has unsaved changes.
MsgProgramSaveFileConfirm = 确定要加载新的存档文件吗?
MsgProgramError = 错误
MsgProgramErrorExpectedHex = 文本仅能包含以下字符(0-9, A-F)。

View File

@ -4,6 +4,7 @@ MsgProgramIllegalModeActive = 使用不合法模式啟動。
MsgProgramUpdateAvailable = 新版本經已發佈!
MsgProgramCloseUnsaved = 未保存之更改將會丟失。
MsgProgramCloseConfirm = 你確定要關閉 PKHeX 嗎?
MsgProgramSaveUnsaved = The Pokémon in the editor has unsaved changes.
MsgProgramSaveFileConfirm = 確定要載入新的儲存資料檔案嗎?
MsgProgramError = 錯誤
MsgProgramErrorExpectedHex = 文本僅能包含以下字元(0-9, A-F)。

View File

@ -14,7 +14,7 @@
0190 * Kurt can check GS Ball
0191 * Kurt ready to return GS Ball (combine with above Flag)
0192 * GS Ball can be inserted into Ilex Forest Shrine
1809 * No Mystery Gift item is waiting in the Pokemon Center
1809 * No Mystery Gift item is waiting in the Pokémon Center
0672 * Ho-Oh puzzle solved in Ruins of Alph
0673 * Kabuto puzzle solved in Ruins of Alph
0674 * Omanyte puzzle solved in Ruins of Alph

View File

@ -1,5 +1,5 @@
0x4021 m Repel Step Counter
0x4023 * Starter Pokemon 00:Treecko,01:Torchic,02:Mudkip
0x4023 * Starter Pokémon 00:Treecko,01:Torchic,02:Mudkip
0x4024 r Mirage Island RND (High)
0x4025 r Mirage Island RND (Low)
0x4026 * Current Secret Base
@ -9,7 +9,7 @@
0x402C * Reset RTC 00:Disabled,2336:Enabled
0x402D * Enigma Berry Available
0x403E r Wild Pokemon in Altering Cave 00:Zubat,01:Mareep (Illegal),02:Pineco (Illegal),03:Houndour (Illegal),04:Teddiursa (Illegal),05:Aipom (Illegal),06:Shuckle (Illegal),07:Stantler (Illegal),08:Smeargle (Illegal)
0x403E r Wild Pokémon in Altering Cave 00:Zubat,01:Mareep (Illegal),02:Pineco (Illegal),03:Houndour (Illegal),04:Teddiursa (Illegal),05:Aipom (Illegal),06:Shuckle (Illegal),07:Stantler (Illegal),08:Smeargle (Illegal)
0x4040 * Days Passed

View File

@ -7,9 +7,9 @@
0x405B s Defeated Rival (S.S. Anne) 0:No,1:Yes
0x405C s Defeated Rival (Silph Co.) 0:No,1:Yes
0x405D s Defeated Rival (Pokemon Tower) 0:No,1:Yes
0x4089 s Rival Met (Six Island Pokemon Center) 0:No,1:Yes
0x4089 s Rival Met (Six Island Pokémon Center) 0:No,1:Yes
0x4024 r Wild Pokemon in Altering Cave 00:Zubat,01:Mareep (Illegal),02:Pineco (Illegal),03:Houndour (Illegal),04:Teddiursa (Illegal),05:Aipom (Illegal),06:Shuckle (Illegal),07:Stantler (Illegal),08:Smeargle (Illegal)
0x4024 r Wild Pokémon in Altering Cave 00:Zubat,01:Mareep (Illegal),02:Pineco (Illegal),03:Houndour (Illegal),04:Teddiursa (Illegal),05:Aipom (Illegal),06:Shuckle (Illegal),07:Stantler (Illegal),08:Smeargle (Illegal)
0x4049 a Hall of Fame Trainer Card Sticker 0:None,1:Level 1,2:Level 2,3:Level 3
0x404A a Hatched Eggs Trainer Card Sticker 0:None,1:Level 1,2:Level 2,3:Level 3

View File

@ -1,5 +1,5 @@
0x4021 m Repel Step Counter
0x4023 * Starter Pokemon 00:Treecko,01:Torchic,02:Mudkip
0x4023 * Starter Pokémon 00:Treecko,01:Torchic,02:Mudkip
0x4024 r Mirage Island RND (High)
0x4025 r Mirage Island RND (Low)
0x4026 * Current Secret Base

View File

@ -469,7 +469,7 @@
759 r Defeated Deoxys
760 m Change text of old woman in Celadon Mansion (after HoF)
761 s Spoke to Prof. Oak's Aide in Vermilion City
762 * Received Everstone (Oak's Aide, Rock Tunnel Pokemon Center)
762 * Received Everstone (Oak's Aide, Rock Tunnel Pokémon Center)
763 s Gave Meteorite and received Moon Stone from Lostelle's daddy
764 * Full Restore from man for driving off bikers on Three Island received
765 * Received Amulet Coin (Oak's Aide, Route 16)

View File

@ -105,7 +105,7 @@
0x2D8 s Zafiro Robado
0x2D6 s Puerta Abierta de la Guarida Rocket
0x2DC s Recibido Zafiro
0x2FA s Recibida Piedra Eterna (Ayudante de Oak, Centro Pokemon del Túnel Roca)
0x2FA s Recibida Piedra Eterna (Ayudante de Oak, Centro Pokémon del Túnel Roca)
0x252 s Recibido Buscaobjetos (Ayudante de Oak, Ruta 11)
0x256 s Recibido Rep. Exp. (Ayudante de Oak, Ruta 15)
0x2FD s Recibido Amuleto Suerte (Ayudante de Oak, Ruta 16)

View File

@ -105,7 +105,7 @@
0x2D8 s Zafiro Robado
0x2D6 s Puerta Abierta de la Guarida Rocket
0x2DC s Recibido Zafiro
0x2FA s Recibida Piedra Eterna (Ayudante de Oak, Centro Pokemon del Túnel Roca)
0x2FA s Recibida Piedra Eterna (Ayudante de Oak, Centro Pokémon del Túnel Roca)
0x252 s Recibido Buscaobjetos (Ayudante de Oak, Ruta 11)
0x256 s Recibido Rep. Exp. (Ayudante de Oak, Ruta 15)
0x2FD s Recibido Amuleto Suerte (Ayudante de Oak, Ruta 16)

View File

@ -59,7 +59,7 @@
0x3D1 r Overworld Hidden (Electrode 1 in Hideout)
0x3D2 r Overworld Hidden (Electrode 2 in Hideout)
0x800 s Received Starter Pokemon
0x800 s Received Starter Pokémon
0x801 s Received Pokedex
0x802 s Received PokeNav
0x804 s Entered Hall of Fame

View File

@ -1,4 +1,4 @@
0669 r Team Plasma Guide (Pokemon League Pokemon Center) Disappeared
0669 r Team Plasma Guide (Pokémon League Pokémon Center) Disappeared
0661 r Reshiram/Zekrom (N's Castle) Disappeared
0307 r Reshiram/Zekrom Captured
0766 r Reshiram/Zekrom (Dragonspiral Tower) Disappeared

View File

@ -63,7 +63,7 @@ public SAV4Ranch(Memory<byte> data) : base(data, typeof(RK4), 0)
// 00: size, ???
// 01: size, count, Mii data[count]
// 02: size, count, Mii Link data[count]
// 03: size, count, Pokemon (PK4 + metadata)[count]
// 03: size, count, Pokémon (PK4 + metadata)[count]
// 04: size, count, ???
MiiCountOffset = ReadInt32BigEndian(Data[0x24..]) + 4;

View File

@ -86,7 +86,7 @@ public static void SetQRData(PK7 pk7, Span<byte> span, int box = 0, int slot = 0
WriteInt32LittleEndian(span[0x0C..], slot);
WriteInt32LittleEndian(span[0x10..], num_copies); // No need to check max num_copies, payload parser handles it on-console.
pk7.EncryptedPartyData.CopyTo(span[0x30..]); // Copy in pokemon data
pk7.EncryptedPartyData.CopyTo(span[0x30..]); // Copy in Pokémon data
SetDexData(span[0x140..], pk7.Species, pk7.Form, pk7.IsShiny, pk7.Gender);
var chk = Checksums.CRC16Invert(span[..0x1A0]);

View File

@ -137,8 +137,8 @@ public static class RecordLists
{073, "Used Splash"},
{074, "Used Struggle"},
{075, "Noneffective move used on you"},
{076, "Own Pokemon Attacked"},
{077, "Own Pokemon Fainted"},
{076, "Own Pokémon Attacked"},
{077, "Own Pokémon Fainted"},
{078, "Failed to Run"},
{079, "Pokemon Fled"},
{080, "Failed Fishing"},
@ -375,7 +375,7 @@ public static class RecordLists
{177, "Trainer's Eye Rematches"},
{178, "FUREAI Interest ???"}, // similar to US/UM idb
{179, "Shiny Pokemon Encountered"},
{179, "Shiny Pokémon Encountered"},
{180, "Trick House Clears"},
{181, "Eon Ticket 1 (SpotPass)"},
{182, "Eon Ticket 2 (Mystery Gift)"},
@ -487,7 +487,7 @@ public static class RecordLists
{124, "PP Raised"},
{125, "Amie Used"},
{126, "Fishing Chains"},
{127, "Shiny Pokemon Encountered"},
{127, "Shiny Pokémon Encountered"},
{128, "Missions Participated In"},
{129, "Facilities Hosted"},
{130, "QR Code Scans"},

View File

@ -18,6 +18,7 @@ public static class MessageStrings
public static string MsgProgramUpdateAvailable { get; set; } = "New Update Available!";
public static string MsgProgramCloseUnsaved { get; set; } = "Any unsaved changes will be lost.";
public static string MsgProgramCloseConfirm { get; set; } = "Are you sure you want to close PKHeX?";
public static string MsgProgramSaveUnsaved { get; set; } = "The Pokémon in the editor has unsaved changes.";
public static string MsgProgramSaveFileConfirm { get; set; } = "Are you sure you want to load a new save file?";
public static string MsgProgramError { get; set; } = "ERROR";
public static string MsgProgramErrorExpectedHex { get; set; } = "Expected Text containing only the following characters (0-9, A-F).";
@ -85,7 +86,7 @@ public static class MessageStrings
public static string MsgFileWriteProtectedAdvice { get; set; } = "If the file is on a removable disk (SD card), please ensure the write protection switch is not set.";
public static string MsgFileInUse { get; set; } = "Unable to load file. It could be in use by another program.";
public static string MsgFileUnsupported { get; set; } = "Attempted to load an unsupported file type/size. This could mean PKHeX doesn't support your save file or your save file is corrupt.";
public static string MsgPKMUnsupported { get; set; } = "Attempted to load an unsupported file type/size. This could be caused by loading a different generation Pokemon file on an unsupported generation or your file is corrupt.";
public static string MsgPKMUnsupported { get; set; } = "Attempted to load an unsupported file type/size. This could be caused by loading a different generation Pokémon file on an unsupported generation or your file is corrupt.";
public static string MsgPKMConvertSuccess { get; set; } = "Converted from {0} to {1}.";
public static string MsgPKMConvertFail { get; set; } = "Conversion failed.";
@ -157,7 +158,7 @@ public static class MessageStrings
public static string MsgSaveBackupNotFound { get; set; } = "Original file has been moved; unable to copy a backup.";
public static string MsgSaveCurrentGeneration { get; set; } = "Current SAV Generation: {0}";
public static string MsgSaveBoxCloneFromTabs { get; set; } = "Clone Pokemon from Editing Tabs to all slots in {0}?";
public static string MsgSaveBoxCloneFromTabs { get; set; } = "Clone Pokémon from Editing Tabs to all slots in {0}?";
public static string MsgSaveBoxSortCurrent { get; set; } = "Sort Current Box?";
public static string MsgSaveBoxSortCurrentFailBattle { get; set; } = "Battle Box slots prevent the sorting of box.";
public static string MsgSaveBoxSortCurrentSuccess { get; set; } = "Current Box sorted!";

View File

@ -166,7 +166,8 @@ public bool HaX
set => field = Stats.HaX = value;
}
private byte[] LastData = [];
private byte[] LastData { get; set; } = [];
public void NotifyWasExported(PKM pk) => LastData = pk.Data.ToArray();
public PKM Data => Entity;
public PKM Entity { get; private set; } = null!;
@ -233,7 +234,6 @@ public PKM PreparePKM(bool click = true)
}
var pk = GetPKMfromFields();
LastData = pk.Data.ToArray();
return pk.Clone();
}
@ -355,7 +355,7 @@ private void LoadFieldsFromPKM(PKM pk, bool focus = true, bool skipConversionChe
SetMarkings();
UpdateLegality();
UpdateSprite();
LastData = PreparePKM().Data.ToArray();
NotifyWasExported(PreparePKM());
RefreshFontWarningButton();
}

View File

@ -53,6 +53,7 @@ private void ClickSet(object sender, EventArgs e)
if (!editor.EditsComplete)
return;
PKM pk = editor.PreparePKM();
var preModify = pk.Clone();
var info = GetSenderInfo(sender);
var sav = info.View.SAV;
@ -69,6 +70,7 @@ private void ClickSet(object sender, EventArgs e)
return;
}
editor.NotifyWasExported(preModify);
Manager.Hover.Stop();
Editor.Slots.Set(info.Slot, pk);
Manager.SE.UpdateUndoRedo();

View File

@ -1029,7 +1029,8 @@ public bool ExportSaveFile()
bool reload = SAV is IStorageCleanup b && b.FixStoragePreWrite();
if (reload)
ReloadSlots();
return WinFormsUtil.ExportSAVDialog(this, SAV, SAV.CurrentBox);
bool forceSaveAs = Main.Settings.Advanced.SaveExportForceSaveAs;
return WinFormsUtil.ExportSAVDialog(this, SAV, SAV.CurrentBox, forceSaveAs);
}
public bool ExportBackup()

View File

@ -1226,6 +1226,7 @@ private async void Dragout_MouseDown(object sender, MouseEventArgs e)
// Gather data
var pk = PreparePKM();
var preModify = pk.Clone();
var encrypt = ModifierKeys == Keys.Control;
var data = encrypt ? pk.EncryptedPartyData : pk.DecryptedPartyData;
@ -1249,6 +1250,7 @@ private async void Dragout_MouseDown(object sender, MouseEventArgs e)
C_SAV.M.Drag.ResetCursor(this);
await DeleteAsync(newfile, 20_000).ConfigureAwait(false);
}
PKME_Tabs.NotifyWasExported(preModify); // restore pre-modify state, in case the user drags into the same program window
}
catch
{
@ -1322,6 +1324,13 @@ private void ClickExportSAV(object sender, EventArgs e)
if (!Menu_ExportSAV.Enabled)
return; // hot-keys can't cheat the system!
if (Settings.Advanced.SaveExportCheckUnsavedEntity && PKME_Tabs.PKMIsUnsaved)
{
var prompt = WinFormsUtil.Prompt(MessageBoxButtons.YesNo, MsgProgramSaveUnsaved, MsgContinue);
if (prompt != DialogResult.Yes)
return;
}
C_SAV.ExportSaveFile();
Text = GetProgramTitle(C_SAV.SAV);
}

View File

@ -301,6 +301,8 @@ LocalizedDescription.RetainMetDateTransfer45=Retain the Met Date when transferri
LocalizedDescription.ReturnNoneIfEmptySearch=Überspringt die Suche, wenn vergessen wurde ein Pokémon / Attacken in die Suchkriterien einzugeben.
LocalizedDescription.RNGFrameNotFound3=Zeigt in der Legalitäts Analyse an, wenn der RNG Frame Check keine Übereinstimmung findet.
LocalizedDescription.RNGFrameNotFound4=Zeigt in der Legalitäts Analyse an, wenn der RNG Frame Check keine Übereinstimmung findet.
LocalizedDescription.SaveExportCheckUnsavedEntity=Prüft, ob das Pokémon im Editor ungespeicherte Änderungen hat, bevor die Speicherdatei exportiert wird.
LocalizedDescription.SaveExportForceSaveAs=Überspringt die Überschreiben-Abfrage beim Exportieren einer Speicherdatei, um immer Speichern unter... zu verwenden.
LocalizedDescription.SearchBackups=Suche beim Laden der PKM Datenbank auch in den Backup Spielständen.
LocalizedDescription.SearchExtraSaves=Durchsuche beim Laden der PKM Datenbank auch Backup Verzeichnisse.
LocalizedDescription.SearchExtraSavesDeep=Durchsuche beim Laden der PKM Datenbank auch Unterverzeichmisse der Backup Verzeichnisse.

View File

@ -301,6 +301,8 @@ LocalizedDescription.RetainMetDateTransfer45=Retain the Met Date when transferri
LocalizedDescription.ReturnNoneIfEmptySearch=Skips searching if the user forgot to enter Species / Move(s) into the search criteria.
LocalizedDescription.RNGFrameNotFound3=Severity to flag a Legality Check if the RNG Frame Checking logic does not find a match for Generation 3 encounters.
LocalizedDescription.RNGFrameNotFound4=Severity to flag a Legality Check if the RNG Frame Checking logic does not find a match for Generation 4 encounters.
LocalizedDescription.SaveExportCheckUnsavedEntity=Check if the Pokémon in the editor has unsaved changes before exporting the save file.
LocalizedDescription.SaveExportForceSaveAs=Skip the Overwrite prompt when exporting a save file, to always Save As...
LocalizedDescription.SearchBackups=When loading content for the PKM Database, search within backup save files.
LocalizedDescription.SearchExtraSaves=When loading content for the PKM Database, search within OtherBackupPaths.
LocalizedDescription.SearchExtraSavesDeep=When loading content for the PKM Database, search subfolders within OtherBackupPaths.
@ -529,36 +531,36 @@ Main.Label_SubRegion=Sub Region:
Main.Label_TID=TID:
Main.Label_Total=Total:
Main.Label_Tough=Tough
Main.Menu_About=About PKHeX
Main.Menu_BatchEditor=Batch Editor
Main.Menu_Data=Data
Main.Menu_Database=PKM Database
Main.Menu_DumpBox=Dump Box
Main.Menu_DumpBoxes=Dump Boxes
Main.Menu_About=&About PKHeX
Main.Menu_BatchEditor=&Batch Editor
Main.Menu_Data=&Data
Main.Menu_Database=PKM &Database
Main.Menu_DumpBox=Dump Bo&x
Main.Menu_DumpBoxes=Dump Bo&xes
Main.Menu_EncDatabase=E&ncounter Database
Main.Menu_Exit=Quit
Main.Menu_Exit=&Quit
Main.Menu_ExportBAK=Export Backup
Main.Menu_ExportSAV=Export SAV...
Main.Menu_File=File
Main.Menu_Folder=Open Folder
Main.Menu_Language=Language
Main.Menu_LoadBoxes=Load Boxes
Main.Menu_MGDatabase=Mystery Gift Database
Main.Menu_Open=Open...
Main.Menu_Options=Options
Main.Menu_PopoutBoxAll=All Boxes
Main.Menu_PopoutBoxSingle=Single Box
Main.Menu_Redo=Redo Last Change
Main.Menu_Report=Box Data Report
Main.Menu_Save=Save PKM...
Main.Menu_Settings=Settings
Main.Menu_Showdown=Showdown
Main.Menu_ShowdownExportCurrentBox=Export Current Box to Clipboard
Main.Menu_ShowdownExportParty=Export Party to Clipboard
Main.Menu_ShowdownExportPKM=Export Set to Clipboard
Main.Menu_ShowdownImportPKM=Import Set from Clipboard
Main.Menu_Tools=Tools
Main.Menu_Undo=Undo Last Change
Main.Menu_ExportSAV=&Export SAV...
Main.Menu_File=&File
Main.Menu_Folder=Open &Folder
Main.Menu_Language=&Language
Main.Menu_LoadBoxes=&Load Boxes
Main.Menu_MGDatabase=Mystery &Gift Database
Main.Menu_Open=&Open...
Main.Menu_Options=&Options
Main.Menu_PopoutBoxAll=&All Boxes
Main.Menu_PopoutBoxSingle=&Single Box
Main.Menu_Redo=&Redo Last Change
Main.Menu_Report=Box Data &Report
Main.Menu_Save=&Save PKM...
Main.Menu_Settings=&Settings
Main.Menu_Showdown=&Showdown
Main.Menu_ShowdownExportCurrentBox=Export Current &Box to Clipboard
Main.Menu_ShowdownExportParty=Export &Party to Clipboard
Main.Menu_ShowdownExportPKM=&Export Set to Clipboard
Main.Menu_ShowdownImportPKM=&Import Set from Clipboard
Main.Menu_Tools=&Tools
Main.Menu_Undo=&Undo Last Change
Main.mnu_Delete=Delete
Main.mnu_DeleteAll=Clear
Main.mnu_DeleteClones=Clones

View File

@ -301,6 +301,8 @@ LocalizedDescription.RetainMetDateTransfer45=Mantener la Fecha (de encuentro) al
LocalizedDescription.ReturnNoneIfEmptySearch=Salta la búsqueda si el usuario olvidó ingresar la especie/movimiento(s) en el criterio de búsqueda.
LocalizedDescription.RNGFrameNotFound3=En la validación de legalidad, marcar Severidad si se detecta que la lógica de verificación de tramas RNG no encuentra una coincidencia.
LocalizedDescription.RNGFrameNotFound4=En la validación de legalidad, marcar Severidad si se detecta que la lógica de verificación de tramas RNG no encuentra una coincidencia.
LocalizedDescription.SaveExportCheckUnsavedEntity=Comprueba si el Pokémon en el editor tiene cambios sin guardar antes de exportar el archivo de guardado.
LocalizedDescription.SaveExportForceSaveAs=Omite el aviso de sobrescritura al exportar un archivo de guardado, para usar siempre Guardar como...
LocalizedDescription.SearchBackups=Cuando se carga contenido para la base de datos PKM, buscar entre los archivos de guardado de respaldo.
LocalizedDescription.SearchExtraSaves=Cuando se carga contenido para la base de datos PKM, buscar entre OtherBackupPaths.
LocalizedDescription.SearchExtraSavesDeep=Cuando se carga contenido para la base de datos PKM, buscar subcarpetas entre OtherBackupPaths.

View File

@ -301,6 +301,8 @@ LocalizedDescription.RetainMetDateTransfer45=Mantener la Fecha (de encuentro) al
LocalizedDescription.ReturnNoneIfEmptySearch=Salta la búsqueda si el usuario olvidó ingresar la especie/movimiento(s) en el criterio de búsqueda.
LocalizedDescription.RNGFrameNotFound3=En la validación de legalidad, marcar Severidad si se detecta que la lógica de verificación de tramas RNG no encuentra una coincidencia.
LocalizedDescription.RNGFrameNotFound4=En la validación de legalidad, marcar Severidad si se detecta que la lógica de verificación de tramas RNG no encuentra una coincidencia.
LocalizedDescription.SaveExportCheckUnsavedEntity=Comprueba si el Pokémon en el editor tiene cambios sin guardar antes de exportar el archivo de guardado.
LocalizedDescription.SaveExportForceSaveAs=Omite el aviso de sobrescritura al exportar un archivo de guardado, para usar siempre Guardar como...
LocalizedDescription.SearchBackups=Cuando se carga contenido para la base de datos PKM, buscar entre los archivos de guardado de respaldo.
LocalizedDescription.SearchExtraSaves=Cuando se carga contenido para la base de datos PKM, buscar entre OtherBackupPaths.
LocalizedDescription.SearchExtraSavesDeep=Cuando se carga contenido para la base de datos PKM, buscar subcarpetas entre OtherBackupPaths.

View File

@ -301,6 +301,8 @@ LocalizedDescription.RetainMetDateTransfer45=Retain the Met Date when transferri
LocalizedDescription.ReturnNoneIfEmptySearch=Saute la recherche si l'utilisateur a oublié de saisir Espèce / Capacité(s) dans les critères de recherche.
LocalizedDescription.RNGFrameNotFound3=Severity to flag a Legality Check if the RNG Frame Checking logic does not find a match for Generation 3 encounters.
LocalizedDescription.RNGFrameNotFound4=Severity to flag a Legality Check if the RNG Frame Checking logic does not find a match for Generation 4 encounters.
LocalizedDescription.SaveExportCheckUnsavedEntity=Vérifie si le Pokémon dans l'éditeur a des modifications non enregistrées avant d'exporter le fichier de sauvegarde.
LocalizedDescription.SaveExportForceSaveAs=Ignore l'invite d'écrasement lors de l'exportation d'un fichier de sauvegarde, pour toujours utiliser Enregistrer sous...
LocalizedDescription.SearchBackups=When loading content for the PKM Database, search within backup save files.
LocalizedDescription.SearchExtraSaves=When loading content for the PKM Database, search within OtherBackupPaths.
LocalizedDescription.SearchExtraSavesDeep=When loading content for the PKM Database, search subfolders within OtherBackupPaths.

View File

@ -301,6 +301,8 @@ LocalizedDescription.RetainMetDateTransfer45=Retain the Met Date when transferri
LocalizedDescription.ReturnNoneIfEmptySearch=Salta il processo di ricerca se l'utente non ha inserito la Specie o le Mosse nei filtri di ricerca.
LocalizedDescription.RNGFrameNotFound3=Forza una segnalazione di Legalità se la logica di controllo RNG non trova una corrispondenza.
LocalizedDescription.RNGFrameNotFound4=Forza una segnalazione di Legalità se la logica di controllo RNG non trova una corrispondenza.
LocalizedDescription.SaveExportCheckUnsavedEntity=Controlla se il Pokémon nell'editor ha modifiche non salvate prima di esportare il file di salvataggio.
LocalizedDescription.SaveExportForceSaveAs=Salta la richiesta di sovrascrittura quando si esporta un file di salvataggio, per usare sempre Salva con nome...
LocalizedDescription.SearchBackups=Cerca nei backup dei salvataggi quando carica il contenuto per il Database Pokémon.
LocalizedDescription.SearchExtraSaves=Cerca in OtherBackupPaths quando carica il contenuto per il Database Pokémon.
LocalizedDescription.SearchExtraSavesDeep=Cerca nelle sottocartelle di OtherBackupPaths quando carica il contenuto per il Database Pokémon.

View File

@ -301,6 +301,8 @@ LocalizedDescription.RetainMetDateTransfer45=4世代から5世代に送っ
LocalizedDescription.ReturnNoneIfEmptySearch=ユーザーがポケモンや技の入力をしなかった場合、検索をスキップする。
LocalizedDescription.RNGFrameNotFound3=第3世代の乱数生成にはない個体が見つかった場合、正規チェックにフラグを立てる。
LocalizedDescription.RNGFrameNotFound4=第4世代の乱数生成にはない個体が見つかった場合、正規チェックにフラグを立てる。
LocalizedDescription.SaveExportCheckUnsavedEntity=保存データをエクスポートする前に、エディター内のポケモンに未保存の変更があるか確認します。
LocalizedDescription.SaveExportForceSaveAs=保存データのエクスポート時に上書き確認を表示せず、常に「名前を付けて保存...」を使用します。
LocalizedDescription.SearchBackups=When loading content for the PKM Database, search within backup save files.
LocalizedDescription.SearchExtraSaves=When loading content for the PKM Database, search within OtherBackupPaths.
LocalizedDescription.SearchExtraSavesDeep=When loading content for the PKM Database, search subfolders within OtherBackupPaths.

View File

@ -301,6 +301,8 @@ LocalizedDescription.RetainMetDateTransfer45=Retain the Met Date when transferri
LocalizedDescription.ReturnNoneIfEmptySearch=Skips searching if the user forgot to enter Species / Move(s) into the search criteria.
LocalizedDescription.RNGFrameNotFound3=Severity to flag a Legality Check if the RNG Frame Checking logic does not find a match for Generation 3 encounters.
LocalizedDescription.RNGFrameNotFound4=Severity to flag a Legality Check if the RNG Frame Checking logic does not find a match for Generation 4 encounters.
LocalizedDescription.SaveExportCheckUnsavedEntity=세이브 파일을 내보내기 전에 편집기에서 포켓몬에 저장되지 않은 변경 사항이 있는지 확인합니다.
LocalizedDescription.SaveExportForceSaveAs=세이브 파일을 내보낼 때 덮어쓰기 확인을 건너뛰어 항상 다른 이름으로 저장...을 사용합니다.
LocalizedDescription.SearchBackups=When loading content for the PKM Database, search within backup save files.
LocalizedDescription.SearchExtraSaves=When loading content for the PKM Database, search within OtherBackupPaths.
LocalizedDescription.SearchExtraSavesDeep=When loading content for the PKM Database, search subfolders within OtherBackupPaths.

View File

@ -301,6 +301,8 @@ LocalizedDescription.RetainMetDateTransfer45=在从第4代转移到第5代时保
LocalizedDescription.ReturnNoneIfEmptySearch=如果用户忘记在搜索条件中输入种类/招式,则跳过搜索。
LocalizedDescription.RNGFrameNotFound3=如果 RNG 帧检查逻辑未找到第3代遭遇的匹配项则标记合法性检查的严重性。
LocalizedDescription.RNGFrameNotFound4=如果 RNG 帧检查逻辑未找到第4代遭遇的匹配项则标记合法性检查的严重性。
LocalizedDescription.SaveExportCheckUnsavedEntity=在导出存档文件之前,检查编辑器中的宝可梦是否有未保存的更改。
LocalizedDescription.SaveExportForceSaveAs=导出存档文件时跳过覆盖提示,始终使用“另存为...”。
LocalizedDescription.SearchBackups=当加载 PKM 数据库内容时,包含其他备份储存资料档案。
LocalizedDescription.SearchExtraSaves=当加载 PKM数据库属性时包含其他备份路径内档案。
LocalizedDescription.SearchExtraSavesDeep=当加载 PKM 数据库内容时,包含其他备份路径内子资料夹。

View File

@ -301,6 +301,8 @@ LocalizedDescription.RetainMetDateTransfer45=Retain the Met Date when transferri
LocalizedDescription.ReturnNoneIfEmptySearch=Skips searching if the user forgot to enter Species / Move(s) into the search criteria.
LocalizedDescription.RNGFrameNotFound3=RNG幀匹配度合法性檢查等級。
LocalizedDescription.RNGFrameNotFound4=RNG幀匹配度合法性檢查等級。
LocalizedDescription.SaveExportCheckUnsavedEntity=在匯出儲存資料檔之前,檢查編輯器中的寶可夢是否有未儲存的變更。
LocalizedDescription.SaveExportForceSaveAs=匯出儲存資料檔時跳過覆寫提示,始終使用「另存為...」。
LocalizedDescription.SearchBackups=當加載 PKM 數據庫内容時,包含其他備份儲存資料檔案
LocalizedDescription.SearchExtraSaves=當加載 PKM 數據庫内容時,包含其他備份路徑内檔案
LocalizedDescription.SearchExtraSavesDeep=當加載 PKM 數據庫内容時,包含其他備份路徑内子資料夾

View File

@ -30,6 +30,8 @@ protected override void Dispose(bool disposing)
/// </summary>
private void InitializeComponent()
{
System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle1 = new System.Windows.Forms.DataGridViewCellStyle();
System.Windows.Forms.DataGridViewCellStyle dataGridViewCellStyle2 = new System.Windows.Forms.DataGridViewCellStyle();
FLP_Buttons = new System.Windows.Forms.FlowLayoutPanel();
TC_Tabs = new System.Windows.Forms.TabControl();
Tab_Recent = new System.Windows.Forms.TabPage();
@ -54,7 +56,7 @@ private void InitializeComponent()
FLP_Buttons.Location = new Point(0, 0);
FLP_Buttons.Name = "FLP_Buttons";
FLP_Buttons.Padding = new System.Windows.Forms.Padding(3);
FLP_Buttons.Size = new Size(601, 331);
FLP_Buttons.Size = new Size(616, 331);
FLP_Buttons.TabIndex = 0;
//
// TC_Tabs
@ -86,6 +88,8 @@ private void InitializeComponent()
dgDataRecent.AllowUserToOrderColumns = true;
dgDataRecent.AllowUserToResizeColumns = false;
dgDataRecent.AllowUserToResizeRows = false;
dataGridViewCellStyle1.BackColor = SystemColors.ControlLight;
dgDataRecent.AlternatingRowsDefaultCellStyle = dataGridViewCellStyle1;
dgDataRecent.ClipboardCopyMode = System.Windows.Forms.DataGridViewClipboardCopyMode.EnableAlwaysIncludeHeaderText;
dgDataRecent.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.DisableResizing;
dgDataRecent.Dock = System.Windows.Forms.DockStyle.Fill;
@ -102,7 +106,7 @@ private void InitializeComponent()
Tab_Backup.Controls.Add(dgDataBackup);
Tab_Backup.Location = new Point(4, 26);
Tab_Backup.Name = "Tab_Backup";
Tab_Backup.Size = new Size(601, 331);
Tab_Backup.Size = new Size(616, 331);
Tab_Backup.TabIndex = 2;
Tab_Backup.Text = "Backups";
Tab_Backup.UseVisualStyleBackColor = true;
@ -114,13 +118,15 @@ private void InitializeComponent()
dgDataBackup.AllowUserToOrderColumns = true;
dgDataBackup.AllowUserToResizeColumns = false;
dgDataBackup.AllowUserToResizeRows = false;
dataGridViewCellStyle2.BackColor = SystemColors.ControlLight;
dgDataBackup.AlternatingRowsDefaultCellStyle = dataGridViewCellStyle2;
dgDataBackup.ClipboardCopyMode = System.Windows.Forms.DataGridViewClipboardCopyMode.EnableAlwaysIncludeHeaderText;
dgDataBackup.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.DisableResizing;
dgDataBackup.Dock = System.Windows.Forms.DockStyle.Fill;
dgDataBackup.Location = new Point(0, 0);
dgDataBackup.Name = "dgDataBackup";
dgDataBackup.RowHeadersVisible = false;
dgDataBackup.Size = new Size(601, 331);
dgDataBackup.Size = new Size(616, 331);
dgDataBackup.TabIndex = 1;
dgDataBackup.CellMouseDown += DataGridCellMouseDown;
//
@ -129,7 +135,7 @@ private void InitializeComponent()
Tab_Folders.Controls.Add(FLP_Buttons);
Tab_Folders.Location = new Point(4, 26);
Tab_Folders.Name = "Tab_Folders";
Tab_Folders.Size = new Size(601, 331);
Tab_Folders.Size = new Size(616, 331);
Tab_Folders.TabIndex = 0;
Tab_Folders.Text = "Folders";
Tab_Folders.UseVisualStyleBackColor = true;
@ -160,12 +166,14 @@ private void InitializeComponent()
Controls.Add(CB_FilterColumn);
Controls.Add(TC_Tabs);
Icon = Properties.Resources.Icon;
KeyPreview = true;
MaximizeBox = false;
MinimizeBox = false;
MinimumSize = new Size(640, 400);
Name = "SAV_FolderList";
StartPosition = System.Windows.Forms.FormStartPosition.CenterParent;
Text = "Folder List";
KeyDown += OnKeyDown;
TC_Tabs.ResumeLayout(false);
Tab_Recent.ResumeLayout(false);
((System.ComponentModel.ISupportInitialize)dgDataRecent).EndInit();

View File

@ -72,6 +72,13 @@ public SAV_FolderList(Action<SaveFile> openSaveFile)
}
}
private void OnKeyDown(object sender, KeyEventArgs e)
{
// Quick close with Ctrl+W
if (e.KeyCode == Keys.W && ModifierKeys == Keys.Control)
Close();
}
private static List<INamedFolderPath> GetPathList(IReadOnlyList<string> drives, string backupPath)
{
List<INamedFolderPath> locs =

View File

@ -65,8 +65,8 @@ public DualDiffSelection SelectNewOld(string file, string asNew, string asOld)
public DialogResult RequestOverwrite(string exist)
{
var taskButtonOverwrite = new TaskDialogCommandLinkButton(MessageStrings.MsgDialogFileOverwrite) { AllowCloseDialog = true };
var taskButtonSelect = new TaskDialogCommandLinkButton(MessageStrings.MsgDialogFileSaveAs) { AllowCloseDialog = true };
var taskButtonOverwrite = new TaskDialogButton(MessageStrings.MsgDialogFileOverwrite) { AllowCloseDialog = true };
var taskButtonSelect = new TaskDialogButton(MessageStrings.MsgDialogFileSaveAs) { AllowCloseDialog = true };
var page = new TaskDialogPage
{
Caption = MessageStrings.MsgDialogFileSaveReplace,

View File

@ -387,11 +387,12 @@ private static void SaveBackup(string path)
/// <param name="c">Control to anchor dialog to.</param>
/// <param name="sav"><see cref="SaveFile"/> to be saved.</param>
/// <param name="currentBox">Box the player will be greeted with when accessing the PC in-game.</param>
/// <param name="forceSaveAs">Whether to force the Save As dialog even if the file exists.</param>
/// <returns>True if the file was saved.</returns>
public static bool ExportSAVDialog(Control c, SaveFile sav, int currentBox = 0)
public static bool ExportSAVDialog(Control c, SaveFile sav, int currentBox = 0, bool forceSaveAs = false)
{
// Try to request an overwrite first; if they defer, do the save file dialog.
if (!sav.Metadata.IsBackup && File.Exists(sav.Metadata.FilePath))
if (!forceSaveAs && !sav.Metadata.IsBackup && File.Exists(sav.Metadata.FilePath))
{
var exist = sav.Metadata.FilePath;
var task = c.FindForm()!.RequestOverwrite(exist);