diff --git a/locales/en-US.json b/locales/en-US.json index 6cb1cd0..60d2185 100644 --- a/locales/en-US.json +++ b/locales/en-US.json @@ -36,6 +36,8 @@ "DLG_RESUME_TITLE": "Resume Installation", "DLG_RESUME_MESSAGE": "Previous installation was interrupted at \"{0}\". Resume from there?", + "DLG_STALE_PROGRESS_TITLE": "Progress Discarded", + "DLG_STALE_PROGRESS_MESSAGE": "The saved progress file refers to a mod that no longer exists in the modlist. Press OK to start a full installation, or Cancel to abort.", "DLG_HASH_MISMATCH_TITLE": "Hash Mismatch", "DLG_HASH_MISMATCH_UPDATE_TITLE": "Update Hashes", diff --git a/src/main/java/de/tosox/zonerelay/ui/MainFrameController.java b/src/main/java/de/tosox/zonerelay/ui/MainFrameController.java index 9bd5604..df83de0 100644 --- a/src/main/java/de/tosox/zonerelay/ui/MainFrameController.java +++ b/src/main/java/de/tosox/zonerelay/ui/MainFrameController.java @@ -17,6 +17,7 @@ import java.io.IOException; import java.nio.file.Files; import java.util.List; +import java.util.Optional; import java.util.stream.Stream; @Singleton @@ -91,8 +92,12 @@ public void onInstallClick() { return; } - String resumeFromId = promptForResume(config); + Optional resumeResult = promptForResume(config); + if (resumeResult.isEmpty()) { + return; + } + String resumeFromId = resumeResult.get().isEmpty() ? null : resumeResult.get(); installCoordinator.startInstallation(config, mainFrame.isFullInstallSelected(), resumeFromId); } @@ -113,33 +118,46 @@ public void onLaunchClick() { } } - private String promptForResume(ModlistConfig config) { + private Optional promptForResume(ModlistConfig config) { if (!progressStore.hasSavedState()) { - return null; + return Optional.of(""); } String savedId = progressStore.load(); if (savedId == null) { - return null; + return Optional.of(""); } String entryName = findEntryNameById(config, savedId); - String displayName = (entryName != null) ? entryName : savedId; + if (entryName == null) { + int choice = JOptionPane.showConfirmDialog( + mainFrame, + localizer.translate("DLG_STALE_PROGRESS_MESSAGE"), + localizer.translate("DLG_STALE_PROGRESS_TITLE"), + JOptionPane.OK_CANCEL_OPTION, + JOptionPane.WARNING_MESSAGE + ); + if (choice != JOptionPane.OK_OPTION) { + return Optional.empty(); + } + progressStore.clear(); + return Optional.of(""); + } int choice = JOptionPane.showConfirmDialog( mainFrame, - localizer.translate("DLG_RESUME_MESSAGE", displayName), + localizer.translate("DLG_RESUME_MESSAGE", entryName), localizer.translate("DLG_RESUME_TITLE"), JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE ); if (choice == JOptionPane.YES_OPTION) { - return savedId; + return Optional.of(savedId); } progressStore.clear(); - return null; + return Optional.of(""); } private String findEntryNameById(ModlistConfig config, String id) {