From 1fc211e9f3d1b7f889d61b016e4ce0f148ac01d2 Mon Sep 17 00:00:00 2001 From: crschnick Date: Tue, 15 Sep 2026 09:12:52 +0000 Subject: [PATCH] Synchronize queue entries --- .../io/xpipe/app/action/AbstractAction.java | 4 +-- .../xpipe/app/beacon/api/AskpassExchange.java | 4 +-- .../io/xpipe/app/comp/base/AppLayoutComp.java | 2 +- .../io/xpipe/app/comp/base/ModalOverlay.java | 2 +- .../io/xpipe/app/core/AppExecutableCache.java | 4 +-- .../io/xpipe/app/core/AppLayoutModel.java | 34 +++++++++++++++---- .../app/hub/creation/StoreCreationDialog.java | 4 +-- .../app/terminal/TerminalDockHubManager.java | 4 +-- .../java/io/xpipe/app/util/ScanDialog.java | 8 ++--- 9 files changed, 44 insertions(+), 22 deletions(-) diff --git a/app/src/main/java/io/xpipe/app/action/AbstractAction.java b/app/src/main/java/io/xpipe/app/action/AbstractAction.java index d37fa8313..6be3dd9e4 100644 --- a/app/src/main/java/io/xpipe/app/action/AbstractAction.java +++ b/app/src/main/java/io/xpipe/app/action/AbstractAction.java @@ -38,7 +38,7 @@ public abstract class AbstractAction { AppCache.update("pickIntroductionShown", true); } - AppLayoutModel.get().getQueueEntries().add(queueEntry); + AppLayoutModel.get().showQueueEntry(queueEntry); pick = action -> { if (action instanceof SerializableAction) { cancelPick(); @@ -55,7 +55,7 @@ public abstract class AbstractAction { }); public static synchronized void cancelPick() { - AppLayoutModel.get().getQueueEntries().remove(queueEntry); + AppLayoutModel.get().hideQueueEntry(queueEntry); pick = null; } diff --git a/app/src/main/java/io/xpipe/app/beacon/api/AskpassExchange.java b/app/src/main/java/io/xpipe/app/beacon/api/AskpassExchange.java index 30d210a21..841c60b3c 100644 --- a/app/src/main/java/io/xpipe/app/beacon/api/AskpassExchange.java +++ b/app/src/main/java/io/xpipe/app/beacon/api/AskpassExchange.java @@ -61,10 +61,10 @@ public class AskpassExchange extends BeaconInterface { new SimpleStringProperty(msg.getPrompt()), new LabelGraphic.IconGraphic("mdi2f-fingerprint"), () -> true); - AppLayoutModel.get().getQueueEntries().add(qe); + AppLayoutModel.get().showQueueEntry(qe); GlobalTimer.delay( () -> { - AppLayoutModel.get().getQueueEntries().remove(qe); + AppLayoutModel.get().hideQueueEntry(qe); }, Duration.ofSeconds(15)); } diff --git a/app/src/main/java/io/xpipe/app/comp/base/AppLayoutComp.java b/app/src/main/java/io/xpipe/app/comp/base/AppLayoutComp.java index 8d016d85d..1713f852d 100644 --- a/app/src/main/java/io/xpipe/app/comp/base/AppLayoutComp.java +++ b/app/src/main/java/io/xpipe/app/comp/base/AppLayoutComp.java @@ -52,7 +52,7 @@ public class AppLayoutComp extends RegionStructureBuilder { - AppLayoutModel.get().getQueueEntries().add(entry); + AppLayoutModel.get().showQueueEntry(entry); }); } diff --git a/app/src/main/java/io/xpipe/app/core/AppExecutableCache.java b/app/src/main/java/io/xpipe/app/core/AppExecutableCache.java index c6ecf926f..3a72175ef 100644 --- a/app/src/main/java/io/xpipe/app/core/AppExecutableCache.java +++ b/app/src/main/java/io/xpipe/app/core/AppExecutableCache.java @@ -33,7 +33,7 @@ public class AppExecutableCache { Hyperlinks.open(url); return true; }); - AppLayoutModel.get().getQueueEntries().add(queueEntry); + AppLayoutModel.get().showQueueEntry(queueEntry); try { function.accept(file); @@ -47,7 +47,7 @@ public class AppExecutableCache { throw e; } } finally { - AppLayoutModel.get().getQueueEntries().remove(queueEntry); + AppLayoutModel.get().hideQueueEntry(queueEntry); } } } diff --git a/app/src/main/java/io/xpipe/app/core/AppLayoutModel.java b/app/src/main/java/io/xpipe/app/core/AppLayoutModel.java index 92dc4f6ac..b72fc1e51 100644 --- a/app/src/main/java/io/xpipe/app/core/AppLayoutModel.java +++ b/app/src/main/java/io/xpipe/app/core/AppLayoutModel.java @@ -36,6 +36,7 @@ import javafx.scene.input.KeyCombination; import lombok.*; import lombok.experimental.NonFinal; import lombok.extern.jackson.Jacksonized; +import org.int4.fx.builders.FX; import org.kordamp.ikonli.javafx.FontIcon; import java.time.Duration; @@ -43,21 +44,25 @@ import java.util.ArrayList; import java.util.List; import java.util.function.Supplier; -@Getter public class AppLayoutModel { private static AppLayoutModel INSTANCE; + @Getter private final SavedState savedState; + @Getter private final List entries; + @Getter private final Property selected; private final ObservableList queueEntries; + @Getter private final BooleanProperty ptbAvailable = new SimpleBooleanProperty(); + @Getter private final BooleanProperty portraitLayoutCollapsed = new SimpleBooleanProperty(); public AppLayoutModel(SavedState savedState) { @@ -136,10 +141,10 @@ public class AppLayoutModel { true); AppSizeBreakpoints.compactMode().subscribe(v -> { if (v) { - getQueueEntries().add(toggleExpand); + queueEntries.add(toggleExpand); portraitExpanded.set(false); } else { - getQueueEntries().remove(toggleExpand); + queueEntries.remove(toggleExpand); portraitExpanded.set(true); } }); @@ -169,6 +174,23 @@ public class AppLayoutModel { INSTANCE = null; } + public synchronized void hideQueueEntry(QueueEntry entry) { + queueEntries.remove(entry); + } + + public ObservableList getQueueEntriesRaw() { + return queueEntries; + } + + public synchronized List getQueueEntries() { + var copy = new ArrayList<>(queueEntries); + return copy; + } + + public void showQueueEntry(QueueEntry entry) { + showQueueEntry(entry, null, true); + } + public synchronized void showQueueEntry(QueueEntry entry, Duration duration, boolean allowDuplicates) { if (!allowDuplicates && queueEntries.contains(entry)) { return; @@ -376,19 +398,19 @@ public class AppLayoutModel { var r = getAction().get(); if (r) { PlatformThread.runLaterIfNeeded(() -> { - AppLayoutModel.get().getQueueEntries().remove(this); + AppLayoutModel.get().hideQueueEntry(this); }); } } catch (Throwable t) { PlatformThread.runLaterIfNeeded(() -> { - AppLayoutModel.get().getQueueEntries().remove(this); + AppLayoutModel.get().hideQueueEntry(this); }); throw t; } } public void hide() { - AppLayoutModel.get().getQueueEntries().remove(this); + AppLayoutModel.get().hideQueueEntry(this); } } } diff --git a/app/src/main/java/io/xpipe/app/hub/creation/StoreCreationDialog.java b/app/src/main/java/io/xpipe/app/hub/creation/StoreCreationDialog.java index c36dc68c7..d110a4faf 100644 --- a/app/src/main/java/io/xpipe/app/hub/creation/StoreCreationDialog.java +++ b/app/src/main/java/io/xpipe/app/hub/creation/StoreCreationDialog.java @@ -202,7 +202,7 @@ public class StoreCreationDialog { var queueEntry = StoreCreationQueueEntry.of(model, modal); modal.setHideAction(() -> { - AppLayoutModel.get().getQueueEntries().add(queueEntry); + AppLayoutModel.get().showQueueEntry(queueEntry); showNotice(); }); @@ -212,7 +212,7 @@ public class StoreCreationDialog { } modal.hide(); - AppLayoutModel.get().getQueueEntries().add(queueEntry); + AppLayoutModel.get().showQueueEntry(queueEntry); showNotice(); }); modal.setRequireCloseButtonForClose(true); diff --git a/app/src/main/java/io/xpipe/app/terminal/TerminalDockHubManager.java b/app/src/main/java/io/xpipe/app/terminal/TerminalDockHubManager.java index 77484b416..f7b9b194e 100644 --- a/app/src/main/java/io/xpipe/app/terminal/TerminalDockHubManager.java +++ b/app/src/main/java/io/xpipe/app/terminal/TerminalDockHubManager.java @@ -339,7 +339,7 @@ public class TerminalDockHubManager { showing.set(true); NativeWinWindowControl.MAIN_WINDOW.setWindowsTransitionsEnabled(false); - AppLayoutModel.get().getQueueEntries().add(queueEntry); + AppLayoutModel.get().showQueueEntry(queueEntry); } public void disableDock() { @@ -354,7 +354,7 @@ public class TerminalDockHubManager { showDialogIfNeeded(); NativeWinWindowControl.MAIN_WINDOW.setWindowsTransitionsEnabled(true); - AppLayoutModel.get().getQueueEntries().remove(queueEntry); + AppLayoutModel.get().hideQueueEntry(queueEntry); } public void triggerDock() { diff --git a/app/src/main/java/io/xpipe/app/util/ScanDialog.java b/app/src/main/java/io/xpipe/app/util/ScanDialog.java index c4ca049ef..39940048f 100644 --- a/app/src/main/java/io/xpipe/app/util/ScanDialog.java +++ b/app/src/main/java/io/xpipe/app/util/ScanDialog.java @@ -31,10 +31,10 @@ public class ScanDialog { var button = new ModalButton( "ok", () -> { - AppLayoutModel.get().getQueueEntries().add(queueEntry); + AppLayoutModel.get().showQueueEntry(queueEntry); ThreadHelper.runAsync(() -> { comp.finish(); - AppLayoutModel.get().getQueueEntries().remove(queueEntry); + AppLayoutModel.get().hideQueueEntry(queueEntry); }); }, true, @@ -59,10 +59,10 @@ public class ScanDialog { var button = new ModalButton( "ok", () -> { - AppLayoutModel.get().getQueueEntries().add(queueEntry); + AppLayoutModel.get().showQueueEntry(queueEntry); ThreadHelper.runAsync(() -> { comp.finish(); - AppLayoutModel.get().getQueueEntries().remove(queueEntry); + AppLayoutModel.get().hideQueueEntry(queueEntry); }); }, true,