From 8e8a34f2c530ead2bb19701f7c2c26e4d0298f57 Mon Sep 17 00:00:00 2001 From: crschnick Date: Thu, 18 Jun 2026 11:51:53 +0000 Subject: [PATCH] Modal overlay fixes --- .../io/xpipe/app/comp/base/ModalOverlay.java | 2 +- .../app/comp/base/ModalOverlayStackComp.java | 12 +---------- .../io/xpipe/app/core/window/AppDialog.java | 21 +++++++++++-------- .../xpipe/app/issue/ErrorHandlerDialog.java | 2 +- 4 files changed, 15 insertions(+), 22 deletions(-) diff --git a/app/src/main/java/io/xpipe/app/comp/base/ModalOverlay.java b/app/src/main/java/io/xpipe/app/comp/base/ModalOverlay.java index b23c6a80a..39daae6eb 100644 --- a/app/src/main/java/io/xpipe/app/comp/base/ModalOverlay.java +++ b/app/src/main/java/io/xpipe/app/comp/base/ModalOverlay.java @@ -98,6 +98,6 @@ public class ModalOverlay { } public void close() { - AppDialog.closeDialog(this); + AppDialog.hide(this); } } diff --git a/app/src/main/java/io/xpipe/app/comp/base/ModalOverlayStackComp.java b/app/src/main/java/io/xpipe/app/comp/base/ModalOverlayStackComp.java index 41ce60ef9..f59c3bc98 100644 --- a/app/src/main/java/io/xpipe/app/comp/base/ModalOverlayStackComp.java +++ b/app/src/main/java/io/xpipe/app/comp/base/ModalOverlayStackComp.java @@ -30,22 +30,12 @@ public class ModalOverlayStackComp extends SimpleRegionBuilder { } private BaseRegionBuilder buildModalOverlay(BaseRegionBuilder current, int index) { - AtomicInteger currentIndex = new AtomicInteger(index); var prop = new SimpleObjectProperty<>(modalOverlay.size() > index ? modalOverlay.get(index) : null); modalOverlay.addListener((ListChangeListener) c -> { - var ex = prop.get(); - // Don't shift just for an index change - if (ex != null && c.getList().contains(ex)) { - currentIndex.set(c.getList().indexOf(ex)); - return; - } else { - currentIndex.set(index); - } - prop.set(modalOverlay.size() > index ? modalOverlay.get(index) : null); }); prop.addListener((observable, oldValue, newValue) -> { - if (newValue == null && modalOverlay.indexOf(oldValue) == currentIndex.get()) { + if (newValue == null) { modalOverlay.remove(oldValue); } }); diff --git a/app/src/main/java/io/xpipe/app/core/window/AppDialog.java b/app/src/main/java/io/xpipe/app/core/window/AppDialog.java index eec766578..7b1a9028b 100644 --- a/app/src/main/java/io/xpipe/app/core/window/AppDialog.java +++ b/app/src/main/java/io/xpipe/app/core/window/AppDialog.java @@ -37,14 +37,6 @@ public class AppDialog { return Optional.of(modalOverlays.getLast()); } - public static void closeDialog(ModalOverlay overlay) { - PlatformThread.runLaterIfNeeded(() -> { - synchronized (modalOverlays) { - modalOverlays.remove(overlay); - } - }); - } - public static void waitForAllDialogsClose() { while (!modalOverlays.isEmpty()) { ThreadHelper.sleep(10); @@ -63,7 +55,18 @@ public class AppDialog { public static void hide(ModalOverlay o) { PlatformThread.runLaterIfNeeded(() -> { - modalOverlays.remove(o); + var firstElement = o.equals(modalOverlays.stream() + .filter(modalOverlay -> modalOverlay != null) + .findFirst().orElse(null)); + var lastElement = modalOverlays.getLast().equals(o); + // Prevent indices from being moved when closing a modal in the back + if (firstElement && !lastElement) { + modalOverlays.set(modalOverlays.indexOf(o), null); + } else if (firstElement && lastElement) { + modalOverlays.clear(); + } else { + modalOverlays.remove(o); + } }); } diff --git a/app/src/main/java/io/xpipe/app/issue/ErrorHandlerDialog.java b/app/src/main/java/io/xpipe/app/issue/ErrorHandlerDialog.java index f988b84ed..0f3008909 100644 --- a/app/src/main/java/io/xpipe/app/issue/ErrorHandlerDialog.java +++ b/app/src/main/java/io/xpipe/app/issue/ErrorHandlerDialog.java @@ -32,7 +32,7 @@ public class ErrorHandlerDialog { try { var modal = new AtomicReference(); var comp = new ErrorHandlerComp(event, () -> { - AppDialog.closeDialog(modal.get()); + AppDialog.hide(modal.get()); }); comp.prefWidth(event.getThrowable() != null ? 600 : 500); var headerId = event.isTerminal() ? "terminalErrorOccured" : "errorOccured";