From f225599b4107afe8b10696a67fa6f3782dcbaa58 Mon Sep 17 00:00:00 2001 From: crschnick Date: Sun, 14 Jun 2026 02:03:19 +0000 Subject: [PATCH] Rework --- .../io/xpipe/app/browser/BrowserFileChooserSessionComp.java | 5 +++++ app/src/main/java/io/xpipe/app/core/AppLayoutModel.java | 3 ++- .../main/java/io/xpipe/app/ext/ProcessControlProvider.java | 2 ++ lang/strings/translations_en.properties | 4 ++++ 4 files changed, 13 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/io/xpipe/app/browser/BrowserFileChooserSessionComp.java b/app/src/main/java/io/xpipe/app/browser/BrowserFileChooserSessionComp.java index 6cc69388c..8e58bd040 100644 --- a/app/src/main/java/io/xpipe/app/browser/BrowserFileChooserSessionComp.java +++ b/app/src/main/java/io/xpipe/app/browser/BrowserFileChooserSessionComp.java @@ -16,6 +16,7 @@ import io.xpipe.app.hub.comp.StoreViewState; import io.xpipe.app.platform.BindingsHelper; import io.xpipe.app.platform.InputHelper; import io.xpipe.app.platform.PlatformThread; +import io.xpipe.app.storage.DataStorage; import io.xpipe.app.storage.DataStoreEntry; import io.xpipe.app.storage.DataStoreEntryRef; import io.xpipe.app.util.FileReference; @@ -57,6 +58,10 @@ public class BrowserFileChooserSessionComp extends ModalOverlayContentComp { boolean save, boolean directory, Predicate filter) { + if (store.get() == null && DataStorage.get().getStoreEntries().stream().noneMatch(filter)) { + return; + } + var model = new BrowserFileChooserSessionModel(directory); model.setOnFinish(fileStores -> { file.accept(fileStores.size() > 0 ? fileStores.getFirst() : null); 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 4e1c27fa1..e68025c0c 100644 --- a/app/src/main/java/io/xpipe/app/core/AppLayoutModel.java +++ b/app/src/main/java/io/xpipe/app/core/AppLayoutModel.java @@ -6,6 +6,7 @@ import io.xpipe.app.comp.BaseRegionBuilder; import io.xpipe.app.comp.base.ModalButton; import io.xpipe.app.comp.base.ModalOverlay; import io.xpipe.app.core.window.AppDialog; +import io.xpipe.app.ext.ProcessControlProvider; import io.xpipe.app.hub.comp.StoreLayoutComp; import io.xpipe.app.hub.comp.StoreViewState; import io.xpipe.app.platform.LabelGraphic; @@ -242,7 +243,7 @@ public class AppLayoutModel { AppI18n.observable("webtop"), new LabelGraphic.IconGraphic("mdal-desktop_mac"), null, - () -> Hyperlinks.open(Hyperlinks.GITHUB_WEBTOP), + () -> ProcessControlProvider.get().showWebtopDeploymentDialog(), null)); } else { l.add( diff --git a/app/src/main/java/io/xpipe/app/ext/ProcessControlProvider.java b/app/src/main/java/io/xpipe/app/ext/ProcessControlProvider.java index 0a04022f0..11c6b1e80 100644 --- a/app/src/main/java/io/xpipe/app/ext/ProcessControlProvider.java +++ b/app/src/main/java/io/xpipe/app/ext/ProcessControlProvider.java @@ -89,4 +89,6 @@ public abstract class ProcessControlProvider { CommandBuilder b, String prefix, UUID requestId, UUID secretId, String... askpassName); public abstract void refreshWsl(); + + public abstract void showWebtopDeploymentDialog(); } diff --git a/lang/strings/translations_en.properties b/lang/strings/translations_en.properties index 15980186c..949efb676 100644 --- a/lang/strings/translations_en.properties +++ b/lang/strings/translations_en.properties @@ -2245,4 +2245,8 @@ webtop.displayName=XPipe Webtop webtop.displayDescription=Access and manage a webtop environment remotely webtopHost=Host webtopHostDescription=The container the webtop environment is running on +webtopDeploymentName=Hostname +webtopDeploymentNameDescription=The name of the container +webtopDeploymentType=Deployment type +webtopDeploymentTypeDescription=The kind of container system the webtop should be deployed on