From 8b24eb16253531004c0b315cc9676836dc39418d Mon Sep 17 00:00:00 2001 From: Christopher Schnick Date: Thu, 7 Mar 2024 00:35:59 +0100 Subject: [PATCH] Retire error handler --- .../crschnick/pdxu/app/core/ErrorHandler.java | 123 ++---------------- .../pdxu/app/core/settings/Settings.java | 6 +- .../pdxu/app/core/settings/SettingsEntry.java | 1 - .../crschnick/pdxu/app/gui/GuiMenuBar.java | 6 - .../pdxu/app/gui/GuiSavegameEntry.java | 17 +-- .../com/crschnick/pdxu/app/gui/GuiStyle.java | 2 +- .../pdxu/app/gui/dialog/GuiErrorReporter.java | 79 ++--------- .../pdxu/app/gui/game/Ck3Backgrounds.java | 2 +- .../pdxu/app/savegame/FileImporter.java | 3 +- .../pdxu/app/savegame/SavegameStorage.java | 4 +- .../com/crschnick/pdxu/editor/Editor.java | 2 +- .../pdxu/editor/gui/GuiEditorMenuBar.java | 8 -- 12 files changed, 32 insertions(+), 221 deletions(-) diff --git a/pdxu-app/src/main/java/com/crschnick/pdxu/app/core/ErrorHandler.java b/pdxu-app/src/main/java/com/crschnick/pdxu/app/core/ErrorHandler.java index a7b8d9e7..8456ba23 100644 --- a/pdxu-app/src/main/java/com/crschnick/pdxu/app/core/ErrorHandler.java +++ b/pdxu-app/src/main/java/com/crschnick/pdxu/app/core/ErrorHandler.java @@ -3,26 +3,14 @@ import com.crschnick.pdxu.app.gui.dialog.GuiErrorReporter; import com.crschnick.pdxu.app.util.SupportedOs; import com.crschnick.pdxu.app.util.ThreadHelper; -import io.sentry.Attachment; import io.sentry.Sentry; import io.sentry.SentryEvent; -import io.sentry.UserFeedback; -import io.sentry.protocol.SentryId; import javafx.application.Platform; -import org.apache.commons.io.FileUtils; import org.slf4j.LoggerFactory; -import java.io.ByteArrayOutputStream; import java.io.IOException; import java.nio.file.Files; -import java.nio.file.Path; -import java.util.ArrayList; -import java.util.List; -import java.util.Random; import java.util.concurrent.CountDownLatch; -import java.util.concurrent.atomic.AtomicReference; -import java.util.zip.ZipEntry; -import java.util.zip.ZipOutputStream; public class ErrorHandler { @@ -110,7 +98,7 @@ public static void setPlatformShutdown() { public static void registerThread(Thread thread) { thread.setUncaughtExceptionHandler((t, e) -> { - handleException(e, "An uncaught exception was thrown", null); + handleException(e, "An uncaught exception was thrown"); }); } @@ -142,26 +130,25 @@ private static void unpreparedStartup(Throwable ex) { } public static void handleTerminalException(Throwable ex) { - handleException(ex, null, null, true); + handleException(ex, null, true); } public static void handleException(Throwable ex) { - handleException(ex, "An error occured", null); + handleException(ex, "An error occured"); } - public static void handleException(Throwable ex, String msg, Path attachFile) { - handleException(ex, msg, attachFile, false); + public static void handleException(Throwable ex, String msg) { + handleException(ex, msg, false); } - private static CountDownLatch showErrorReporter(Throwable ex, Path attachFile, boolean terminal) { + private static CountDownLatch showErrorReporter(Throwable ex, boolean terminal) { CountDownLatch latch = new CountDownLatch(1); Runnable run = () -> { boolean show = (PdxuInstallation.getInstance() == null || PdxuInstallation.getInstance().isProduction()) && !errorReporterShowing; if (show) { errorReporterShowing = true; - boolean shouldSendDiagnostics = GuiErrorReporter.showException(ex, terminal); - reportError(ex, shouldSendDiagnostics, attachFile, terminal); + GuiErrorReporter.showException(ex, terminal); errorReporterShowing = false; } @@ -175,7 +162,7 @@ private static CountDownLatch showErrorReporter(Throwable ex, Path attachFile, b return latch; } - private static void handleException(Throwable ex, String msg, Path attachFile, boolean terminal) { + private static void handleException(Throwable ex, String msg, boolean terminal) { if (ex == null) { return; } @@ -189,7 +176,7 @@ private static void handleException(Throwable ex, String msg, Path attachFile, b } if (!platformShutdown) { - var latch = showErrorReporter(ex, attachFile, terminal); + var latch = showErrorReporter(ex, terminal); if (terminal) { try { latch.await(); @@ -218,96 +205,4 @@ private static void handleException(Throwable ex, String msg, Path attachFile, b System.exit(1); } } - - public static void reportError(Throwable t, boolean diag, Path attachFile, boolean terminal) { - if (diag) { - AtomicReference id = new AtomicReference<>(); - Sentry.withScope(scope -> { - LogManager.getInstance().getLogFile().ifPresent(l -> { - scope.addAttachment(new Attachment(l.toString())); - }); - scope.setTag("diagnoticsData", "true"); - Sentry.setExtra("terminal", String.valueOf(terminal)); - id.set(Sentry.captureException(t)); - }); - if (attachFile != null) { - addAttachment(id.get(), attachFile); - } - } else { - Sentry.withScope(scope -> { - scope.setTag("diagnoticsData", "false"); - Sentry.setExtra("terminal", String.valueOf(terminal)); - Sentry.captureException(t); - }); - } - } - - private static void addAttachment(SentryId id, Path attachFile) { - if (!Files.exists(attachFile)) { - return; - } - - try { - var bytes = Files.readAllBytes(attachFile); - var out = new ByteArrayOutputStream(); - var zipName = "pdxu-report-" + new Random().nextInt(Integer.MAX_VALUE) + ".zip"; - try (var zipOut = new ZipOutputStream(out)) { - zipOut.putNextEntry(new ZipEntry(attachFile.getFileName().toString())); - zipOut.write(bytes); - } - - for (var part : splitInPartsIfNeeded(zipName, out.toByteArray())) { - Sentry.withScope(scope -> { - scope.setTag("id", id.toString()); - scope.addAttachment(new Attachment(part.toString())); - Sentry.captureMessage("Attachment"); - }); - } - } catch (IOException e) { - e.printStackTrace(); - } - } - - private static List splitInPartsIfNeeded(String prefix, byte[] bytes) throws IOException { - var length = 9_000_000; - if (bytes.length <= length) { - Files.write(FileUtils.getTempDirectory().toPath().resolve(prefix), bytes); - return List.of(FileUtils.getTempDirectory().toPath().resolve(prefix)); - } - - List files = new ArrayList<>(); - for (int i = 0; i < Math.ceil((double) bytes.length / length); i++) { - var file = FileUtils.getTempDirectory().toPath().resolve(prefix + ".part" + i); - try (var out = Files.newOutputStream(file)) { - out.write(bytes, i * length, Math.min(length, bytes.length - (i * length))); - } - files.add(file); - } - return files; - } - - public static void reportIssue(Path attachFile) { - Runnable run = () -> { - var r = GuiErrorReporter.showIssueDialog(); - r.ifPresent(msg -> { - AtomicReference id = new AtomicReference<>(); - Sentry.withScope(scope -> { - LogManager.getInstance().getLogFile().ifPresent(l -> { - scope.addAttachment(new Attachment(l.toString())); - }); - - id.set(Sentry.captureMessage("User Issue Report")); - Sentry.captureUserFeedback(new UserFeedback(id.get(), null, null, msg)); - }); - if (attachFile != null) { - addAttachment(id.get(), attachFile); - } - }); - }; - if (Platform.isFxApplicationThread()) { - run.run(); - } else { - Platform.runLater(run); - } - } } diff --git a/pdxu-app/src/main/java/com/crschnick/pdxu/app/core/settings/Settings.java b/pdxu-app/src/main/java/com/crschnick/pdxu/app/core/settings/Settings.java index 7fa2f177..9940abcb 100644 --- a/pdxu-app/src/main/java/com/crschnick/pdxu/app/core/settings/Settings.java +++ b/pdxu-app/src/main/java/com/crschnick/pdxu/app/core/settings/Settings.java @@ -180,7 +180,7 @@ public void check() { hoi4.getValue() == null && stellaris.getValue() == null && ck2.getValue() == null && vic2.getValue() == null && vic3.getValue() == null; if (hasNoValidInstallation) { - var res = GuiErrorReporter.showSimpleErrorMessage(""" + GuiErrorReporter.showSimpleErrorMessage(""" Welcome to the Pdx-Unlimiter! The automatic game detection did not detect any supported Paradox game. @@ -188,9 +188,7 @@ public void check() { Note that you can't do anything useful with the Pdx-Unlimiter until at least one installation is set. """); - if (res) { - Platform.runLater(GuiSettings::showSettings); - } + Platform.runLater(GuiSettings::showSettings); } // Disable irony if needed diff --git a/pdxu-app/src/main/java/com/crschnick/pdxu/app/core/settings/SettingsEntry.java b/pdxu-app/src/main/java/com/crschnick/pdxu/app/core/settings/SettingsEntry.java index 2dfb754c..e788ed73 100644 --- a/pdxu-app/src/main/java/com/crschnick/pdxu/app/core/settings/SettingsEntry.java +++ b/pdxu-app/src/main/java/com/crschnick/pdxu/app/core/settings/SettingsEntry.java @@ -446,7 +446,6 @@ protected boolean isValid(GameDist newValue) { return false; } catch (Exception e) { showInstallErrorMessage(e.getClass().getSimpleName() + ": " + e.getMessage()); - ErrorHandler.reportError(e, false, null, false); return false; } } diff --git a/pdxu-app/src/main/java/com/crschnick/pdxu/app/gui/GuiMenuBar.java b/pdxu-app/src/main/java/com/crschnick/pdxu/app/gui/GuiMenuBar.java index c8ecda92..ae7fac93 100644 --- a/pdxu-app/src/main/java/com/crschnick/pdxu/app/gui/GuiMenuBar.java +++ b/pdxu-app/src/main/java/com/crschnick/pdxu/app/gui/GuiMenuBar.java @@ -111,12 +111,6 @@ private static MenuBar createMenuBar() { }); help.getItems().add(guide); - MenuItem is = new MenuItem(PdxuI18n.get("REPORT_ISSUE")); - is.setOnAction((a) -> { - ErrorHandler.reportIssue(null); - }); - help.getItems().add(is); - MenuItem discord = new MenuItem(PdxuI18n.get("DISCORD")); discord.setOnAction((a) -> { Hyperlinks.open(Hyperlinks.DISCORD); diff --git a/pdxu-app/src/main/java/com/crschnick/pdxu/app/gui/GuiSavegameEntry.java b/pdxu-app/src/main/java/com/crschnick/pdxu/app/gui/GuiSavegameEntry.java index bb58f5e8..cf1bf10c 100644 --- a/pdxu-app/src/main/java/com/crschnick/pdxu/app/gui/GuiSavegameEntry.java +++ b/pdxu-app/src/main/java/com/crschnick/pdxu/app/gui/GuiSavegameEntry.java @@ -1,6 +1,5 @@ package com.crschnick.pdxu.app.gui; -import com.crschnick.pdxu.app.core.ErrorHandler; import com.crschnick.pdxu.app.core.PdxuInstallation; import com.crschnick.pdxu.app.core.SavegameManagerState; import com.crschnick.pdxu.app.core.TaskExecutor; @@ -10,7 +9,10 @@ import com.crschnick.pdxu.app.installation.GameInstallation; import com.crschnick.pdxu.app.lang.LanguageManager; import com.crschnick.pdxu.app.lang.PdxuI18n; -import com.crschnick.pdxu.app.savegame.*; +import com.crschnick.pdxu.app.savegame.SavegameActions; +import com.crschnick.pdxu.app.savegame.SavegameBranches; +import com.crschnick.pdxu.app.savegame.SavegameContext; +import com.crschnick.pdxu.app.savegame.SavegameEntry; import com.crschnick.pdxu.app.util.SupportedOs; import com.crschnick.pdxu.app.util.integration.ConverterSupport; import com.crschnick.pdxu.app.util.integration.Eu4SeHelper; @@ -162,17 +164,6 @@ private static > HBox createButtonBar(SavegameEntry GuiTooltips.install(export, PdxuI18n.get("EXPORT_SAVEGAME", SavegameContext.getContext(e).getGame().getTranslatedFullName())); staticButtons.getChildren().add(export); } - { - Button report = new JFXButton(null, new FontIcon()); - report.setGraphic(new FontIcon()); - report.setOnMouseClicked((m) -> { - ErrorHandler.reportIssue(SavegameContext.getContext(e).getStorage().getSavegameFile(e)); - }); - report.getStyleClass().add("report-button"); - report.setAccessibleText("Report"); - GuiTooltips.install(report, PdxuI18n.get("REPORT_SAVEGAME_ISSUE")); - staticButtons.getChildren().add(report); - } { Button copy = new JFXButton(null, new FontIcon()); copy.setGraphic(new FontIcon()); diff --git a/pdxu-app/src/main/java/com/crschnick/pdxu/app/gui/GuiStyle.java b/pdxu-app/src/main/java/com/crschnick/pdxu/app/gui/GuiStyle.java index 94258c00..00dcdaee 100644 --- a/pdxu-app/src/main/java/com/crschnick/pdxu/app/gui/GuiStyle.java +++ b/pdxu-app/src/main/java/com/crschnick/pdxu/app/gui/GuiStyle.java @@ -83,7 +83,7 @@ public static void addStylesheets(Scene scene) { .map(p -> p.toUri().toString()) .forEach(s -> scene.getStylesheets().add(s)); } catch (IOException e) { - ErrorHandler.handleException(e, "Pdx-Unlimiter installation files could not be found at " + PdxuInstallation.getInstance().getResourceDir() + ". Were they deleted somehow?", null); + ErrorHandler.handleException(e, "Pdx-Unlimiter installation files could not be found at " + PdxuInstallation.getInstance().getResourceDir() + ". Were they deleted somehow?"); } } diff --git a/pdxu-app/src/main/java/com/crschnick/pdxu/app/gui/dialog/GuiErrorReporter.java b/pdxu-app/src/main/java/com/crschnick/pdxu/app/gui/dialog/GuiErrorReporter.java index 02ef62c2..03ddcb23 100644 --- a/pdxu-app/src/main/java/com/crschnick/pdxu/app/gui/dialog/GuiErrorReporter.java +++ b/pdxu-app/src/main/java/com/crschnick/pdxu/app/gui/dialog/GuiErrorReporter.java @@ -1,7 +1,6 @@ package com.crschnick.pdxu.app.gui.dialog; import com.crschnick.pdxu.app.PdxuApp; -import com.crschnick.pdxu.app.core.PdxuInstallation; import com.crschnick.pdxu.app.util.Hyperlinks; import javafx.application.Platform; import javafx.event.ActionEvent; @@ -10,53 +9,30 @@ import javafx.scene.control.ButtonType; import javafx.scene.control.TextArea; import javafx.scene.layout.VBox; -import javafx.stage.Modality; import java.io.PrintWriter; import java.io.StringWriter; -import java.util.Optional; import java.util.concurrent.CountDownLatch; -import java.util.concurrent.atomic.AtomicBoolean; public class GuiErrorReporter { - public static void showReportSent() { - // Don't show confirmation in case the error occurred - // before the installation has been initialized as we can't load styles - if (PdxuInstallation.getInstance() == null) { - return; - } - - Alert a = GuiDialogHelper.createAlert(); - a.initModality(Modality.WINDOW_MODAL); - a.setAlertType(Alert.AlertType.CONFIRMATION); - a.setTitle("Report sent"); - a.setHeaderText("Your report has been successfully sent! Thank you"); - a.show(); - } - - public static boolean showException(Throwable e, boolean terminal) { + public static void showException(Throwable e, boolean terminal) { StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter(sw); e.printStackTrace(pw); String stackTrace = sw.toString(); - boolean r = showErrorMessage(e.getMessage(), stackTrace, true, terminal); - if (r) { - showReportSent(); - } - return r; + showErrorMessage(e.getMessage(), stackTrace, true, terminal); } - public static boolean showSimpleErrorMessage(String msg) { - return showErrorMessage(msg, null, false, false); + public static void showSimpleErrorMessage(String msg) { + showErrorMessage(msg, null, false, false); } - public static boolean showErrorMessage(String msg, String details, boolean reportable, boolean terminal) { - AtomicBoolean shouldSend = new AtomicBoolean(false); + public static void showErrorMessage(String msg, String details, boolean reportable, boolean terminal) { if (!Platform.isFxApplicationThread()) { CountDownLatch latch = new CountDownLatch(1); Platform.runLater(() -> { - shouldSend.set(showErrorMessageInternal(msg, details, reportable, terminal)); + showErrorMessageInternal(msg, details, reportable, terminal); latch.countDown(); }); try { @@ -64,12 +40,11 @@ public static boolean showErrorMessage(String msg, String details, boolean repor } catch (InterruptedException ignored) { } } else { - shouldSend.set(showErrorMessageInternal(msg, details, reportable, terminal)); + showErrorMessageInternal(msg, details, reportable, terminal); } - return shouldSend.get(); } - private static boolean showErrorMessageInternal(String msg, String details, boolean reportable, boolean terminal) { + private static void showErrorMessageInternal(String msg, String details, boolean reportable, boolean terminal) { Alert alert = new Alert(Alert.AlertType.ERROR); // Create Alert without icon since it may not have loaded yet if (PdxuApp.getApp() != null && PdxuApp.getApp().getIcon() != null) { @@ -78,10 +53,9 @@ private static boolean showErrorMessageInternal(String msg, String details, bool alert.getButtonTypes().clear(); if (reportable) { - ButtonType autoReport = new ButtonType("Report automatically", ButtonBar.ButtonData.OK_DONE); ButtonType reportOnGithub = new ButtonType("Report on github", ButtonBar.ButtonData.APPLY); ButtonType reportOnDiscord = new ButtonType("Get help on Discord", ButtonBar.ButtonData.APPLY); - alert.getButtonTypes().addAll(reportOnDiscord, reportOnGithub, autoReport); + alert.getButtonTypes().addAll(reportOnDiscord, reportOnGithub); alert.getDialogPane().lookupButton(reportOnGithub).addEventFilter(ActionEvent.ACTION, event -> { Hyperlinks.open(Hyperlinks.NEW_ISSUE); @@ -99,9 +73,7 @@ private static boolean showErrorMessageInternal(String msg, String details, bool alert.setTitle("Pdx-Unlimiter"); alert.setHeaderText((msg != null ? msg.substring(0, Math.min(msg.length(), 1000)) : "An error occured") + (reportable ? """ - - You can notify the developers of this error automatically by clicking the 'Report automatically' button. (This will send some diagnostics data.) - Alternatively, you can also report it on GitHub to provide some information about the issue and get notified about the status of your reported issue. + You can report the issue on GitHub or Discord to provide some information about the issue and get notified about the status of your reported issue. """ + (!terminal ? "Note that this error is not terminal and you can continue using the Pdx-Unlimiter.\n" + "However, if something is no longer working correctly, you should try to restart the Pdx-Unlimiter." : @@ -124,35 +96,6 @@ private static boolean showErrorMessageInternal(String msg, String details, bool alert.getDialogPane().setMaxWidth(800); - Optional r = alert.showAndWait(); - return r.isPresent() && r.get().getButtonData().equals(ButtonBar.ButtonData.OK_DONE); - } - - public static Optional showIssueDialog() { - Alert alert = new Alert(Alert.AlertType.NONE); - GuiDialogHelper.setIcon(alert); - - alert.getButtonTypes().clear(); - ButtonType report = new ButtonType("Send", ButtonBar.ButtonData.APPLY); - alert.getButtonTypes().addAll(report); - alert.setTitle("Issue reporter"); - alert.setHeaderText(""" - If you encountered an issue, please describe it here. - - By clicking 'Send', you send this report and additional log information to the developers. - If you want to get notified of a fix or help the devs in case of any questions, - please include some sort of contact information, like a reddit/discord/github username or an email - """); - - VBox dialogPaneContent = new VBox(); - TextArea textArea = new TextArea(); - textArea.autosize(); - dialogPaneContent.getChildren().addAll(textArea); - alert.getDialogPane().setContent(dialogPaneContent); - - Optional r = alert.showAndWait(); - r.ifPresent(b -> showReportSent()); - return r.isPresent() && textArea.getText().length() > 0 && r.get().getButtonData().equals(ButtonBar.ButtonData.APPLY) ? - Optional.ofNullable(textArea.getText()) : Optional.empty(); + alert.showAndWait(); } } diff --git a/pdxu-app/src/main/java/com/crschnick/pdxu/app/gui/game/Ck3Backgrounds.java b/pdxu-app/src/main/java/com/crschnick/pdxu/app/gui/game/Ck3Backgrounds.java index ba67fc75..56b7dbed 100644 --- a/pdxu-app/src/main/java/com/crschnick/pdxu/app/gui/game/Ck3Backgrounds.java +++ b/pdxu-app/src/main/java/com/crschnick/pdxu/app/gui/game/Ck3Backgrounds.java @@ -32,7 +32,7 @@ public static Color getBackgroundColor(SavegameInfo info) { ArrayNode node = TextFormatParser.text().parse(file); cache.addColors(node); } catch (Exception e) { - ErrorHandler.handleException(e, "Couldn't parse title data", file); + ErrorHandler.handleException(e, "Couldn't parse title data"); } } diff --git a/pdxu-app/src/main/java/com/crschnick/pdxu/app/savegame/FileImporter.java b/pdxu-app/src/main/java/com/crschnick/pdxu/app/savegame/FileImporter.java index 8c48629b..763cb739 100644 --- a/pdxu-app/src/main/java/com/crschnick/pdxu/app/savegame/FileImporter.java +++ b/pdxu-app/src/main/java/com/crschnick/pdxu/app/savegame/FileImporter.java @@ -107,8 +107,7 @@ public static void importTargets(Collection targets) .ifPresent(e -> { ErrorHandler.handleException( ((SavegameParseResult.Error) e.getValue()).error, - null, - e.getKey().getPath()); + null); }); Platform.runLater(() -> GuiImporter.showResultDialog(statusMap)); diff --git a/pdxu-app/src/main/java/com/crschnick/pdxu/app/savegame/SavegameStorage.java b/pdxu-app/src/main/java/com/crschnick/pdxu/app/savegame/SavegameStorage.java index 3cf71be2..40b48678 100644 --- a/pdxu-app/src/main/java/com/crschnick/pdxu/app/savegame/SavegameStorage.java +++ b/pdxu-app/src/main/java/com/crschnick/pdxu/app/savegame/SavegameStorage.java @@ -499,13 +499,13 @@ public void success(SavegameParseResult.Success s) { @Override public void error(SavegameParseResult.Error er) { e.fail(); - ErrorHandler.handleException(er.error, null, file); + ErrorHandler.handleException(er.error, null); } @Override public void invalid(SavegameParseResult.Invalid iv) { e.fail(); - ErrorHandler.handleException(new IllegalArgumentException(iv.message), null, file); + ErrorHandler.handleException(new IllegalArgumentException(iv.message), null); } }); } diff --git a/pdxu-editor/src/main/java/com/crschnick/pdxu/editor/Editor.java b/pdxu-editor/src/main/java/com/crschnick/pdxu/editor/Editor.java index d14509f8..e573060f 100644 --- a/pdxu-editor/src/main/java/com/crschnick/pdxu/editor/Editor.java +++ b/pdxu-editor/src/main/java/com/crschnick/pdxu/editor/Editor.java @@ -78,7 +78,7 @@ public void createNewEditor(EditTarget target) { try { nodes = target.parse(); } catch (Exception e) { - ErrorHandler.handleException(e, null, target.getFile()); + ErrorHandler.handleException(e, null); return; } EditorState state = new EditorState(target.getName(), target.getFileContext(), nodes, target.getParser(), n -> { diff --git a/pdxu-editor/src/main/java/com/crschnick/pdxu/editor/gui/GuiEditorMenuBar.java b/pdxu-editor/src/main/java/com/crschnick/pdxu/editor/gui/GuiEditorMenuBar.java index 22062430..f024dc5b 100644 --- a/pdxu-editor/src/main/java/com/crschnick/pdxu/editor/gui/GuiEditorMenuBar.java +++ b/pdxu-editor/src/main/java/com/crschnick/pdxu/editor/gui/GuiEditorMenuBar.java @@ -1,7 +1,6 @@ package com.crschnick.pdxu.editor.gui; import com.crschnick.pdxu.app.core.ErrorHandler; -import com.crschnick.pdxu.app.lang.PdxuI18n; import com.crschnick.pdxu.app.util.Hyperlinks; import com.crschnick.pdxu.editor.EditorState; import com.crschnick.pdxu.editor.adapter.EditorSavegameAdapter; @@ -39,13 +38,6 @@ public static MenuBar createMenuBar(EditorState state) { }); editor.getItems().add(guide); - MenuItem is = new MenuItem(PdxuI18n.get("REPORT_ISSUE")); - is.setOnAction((a) -> { - ErrorHandler.reportIssue(null); - }); - editor.getItems().add(is); - - Menu jump = new Menu("Jump to"); Runnable fillJumps = () -> { if (state.isSavegame()) {