From c491dcd3c9de35d9d4ec28994bee3babece32b56 Mon Sep 17 00:00:00 2001 From: crschnick Date: Tue, 10 Mar 2026 00:37:40 +0000 Subject: [PATCH] Rework --- .../app/action/QuickConnectProvider.java | 4 ++++ .../app/hub/comp/StoreFilterFieldComp.java | 2 ++ .../xpipe/app/hub/comp/StoreFilterState.java | 23 +++++++++++-------- .../xpipe/app/hub/comp/StoreQuickConnect.java | 16 +++++++++++-- .../io/xpipe/app/resources/style/style.css | 2 +- lang/strings/translations_en.properties | 2 +- 6 files changed, 36 insertions(+), 13 deletions(-) diff --git a/app/src/main/java/io/xpipe/app/action/QuickConnectProvider.java b/app/src/main/java/io/xpipe/app/action/QuickConnectProvider.java index 2d807856b..334f43e38 100644 --- a/app/src/main/java/io/xpipe/app/action/QuickConnectProvider.java +++ b/app/src/main/java/io/xpipe/app/action/QuickConnectProvider.java @@ -1,6 +1,8 @@ package io.xpipe.app.action; import io.xpipe.app.ext.DataStore; +import io.xpipe.app.storage.DataStorage; +import io.xpipe.app.storage.DataStoreEntry; import java.net.URI; import java.util.List; @@ -21,6 +23,8 @@ public interface QuickConnectProvider extends ActionProvider { String getName(); + Optional findExisting(DataStore store); + DataStore createStore(String arguments, DataStore existing); String getPlaceholder(); diff --git a/app/src/main/java/io/xpipe/app/hub/comp/StoreFilterFieldComp.java b/app/src/main/java/io/xpipe/app/hub/comp/StoreFilterFieldComp.java index 5606e8745..d10f8759f 100644 --- a/app/src/main/java/io/xpipe/app/hub/comp/StoreFilterFieldComp.java +++ b/app/src/main/java/io/xpipe/app/hub/comp/StoreFilterFieldComp.java @@ -127,6 +127,8 @@ public class StoreFilterFieldComp extends SimpleRegionBuilder { var fieldComp = RegionBuilder.of(() -> field); var inputGroup = new InputGroupComp(List.of(fieldComp, menuButton)); inputGroup.setMainReference(fieldComp); + inputGroup.prefHeight(47); + inputGroup.minHeight(47); return inputGroup.build(); } } diff --git a/app/src/main/java/io/xpipe/app/hub/comp/StoreFilterState.java b/app/src/main/java/io/xpipe/app/hub/comp/StoreFilterState.java index 6c8350335..1b2654523 100644 --- a/app/src/main/java/io/xpipe/app/hub/comp/StoreFilterState.java +++ b/app/src/main/java/io/xpipe/app/hub/comp/StoreFilterState.java @@ -43,10 +43,6 @@ public class StoreFilterState { return false; } - if (!v.contains(" ")) { - return false; - } - return QuickConnectProvider.find(v).isPresent(); }, rawText); @@ -57,10 +53,6 @@ public class StoreFilterState { return false; } - if (!v.contains(" ")) { - return false; - } - return LauncherUrlProvider.find(v).isPresent(); }, rawText); @@ -84,10 +76,19 @@ public class StoreFilterState { var type = TypeFactory.defaultInstance().constructType(new TypeReference>() {}); List recentSearches = AppCache.getNonNull("recentSearches", type, () -> List.of()); List recentQuickConnections = AppCache.getNonNull("recentQuickConnections", type, () -> List.of()); + List recentUrls = AppCache.getNonNull("recentUrls", type, () -> List.of()); INSTANCE = new StoreFilterState(); INSTANCE.recentSearches.setContent(recentSearches); INSTANCE.recentQuickConnections.setContent(recentQuickConnections); + INSTANCE.recentUrls.setContent(recentUrls); + } + + public void reset() { + AppCache.update("recentSearches", recentSearches); + AppCache.update("recentQuickConnections", recentQuickConnections); + AppCache.update("recentUrls", recentUrls); + INSTANCE = null; } public void set(String s) { @@ -162,7 +163,11 @@ public class StoreFilterState { return false; } - return StoreQuickConnect.launchQuickConnect(rawText.getValue()); + var r = StoreQuickConnect.launchQuickConnect(rawText.getValue()); + if (r) { + putQuickConnect(rawText.getValue()); + } + return r; } return false; diff --git a/app/src/main/java/io/xpipe/app/hub/comp/StoreQuickConnect.java b/app/src/main/java/io/xpipe/app/hub/comp/StoreQuickConnect.java index 91a0451d3..0f5f4141b 100644 --- a/app/src/main/java/io/xpipe/app/hub/comp/StoreQuickConnect.java +++ b/app/src/main/java/io/xpipe/app/hub/comp/StoreQuickConnect.java @@ -68,8 +68,20 @@ public class StoreQuickConnect { return false; } - DataStorage.get().updateEntryStore(quickConnectEntry, newStore); + if (newStore.isComplete()) { + var existing = provider.get().findExisting(newStore); + if (existing.isPresent()) { + try { + existing.get().getProvider().launch(existing.get()).run(); + return true; + } catch (Exception e) { + ErrorEventFactory.fromThrowable(e).handle(); + return false; + } + } + } + DataStorage.get().updateEntryStore(quickConnectEntry, newStore); var model = StoreCreationDialog.showEdit(quickConnectEntry, newStore, false, finished -> { update(finished.getStore()); ThreadHelper.runAsync(() -> { @@ -85,7 +97,7 @@ public class StoreQuickConnect { }); var wasCached = AppCache.getNonNull("quickConnect", DataStore.class, () -> null) != null; - if (wasCached) { + if (newStore.isComplete() && wasCached) { GlobalTimer.delay(() -> { Platform.runLater(() -> { model.finish(); diff --git a/app/src/main/resources/io/xpipe/app/resources/style/style.css b/app/src/main/resources/io/xpipe/app/resources/style/style.css index c419ab3ce..b8d762b31 100644 --- a/app/src/main/resources/io/xpipe/app/resources/style/style.css +++ b/app/src/main/resources/io/xpipe/app/resources/style/style.css @@ -256,7 +256,7 @@ } .store-filter-state-comp .button:disabled { - -fx-opacity: 1.0; + -fx-opacity: 0.9; } .store-filter-state-comp .label { diff --git a/lang/strings/translations_en.properties b/lang/strings/translations_en.properties index 310214215..2b622f6b1 100644 --- a/lang/strings/translations_en.properties +++ b/lang/strings/translations_en.properties @@ -103,7 +103,7 @@ null=$VALUE$ must be not null roots=Roots scripts=Scripts searchFilter=Search ... -storeFilterPrompt=Find a host, tag, or ssh user@host +storeFilterPrompt=Search or run ... #context: last used recent=Recent shortcut=Shortcut