diff --git a/app/src/main/java/io/xpipe/app/core/mode/AppOperationMode.java b/app/src/main/java/io/xpipe/app/core/mode/AppOperationMode.java index 0f08c2b7c..8e1f3e5e1 100644 --- a/app/src/main/java/io/xpipe/app/core/mode/AppOperationMode.java +++ b/app/src/main/java/io/xpipe/app/core/mode/AppOperationMode.java @@ -6,6 +6,7 @@ import io.xpipe.app.core.window.AppMainWindow; import io.xpipe.app.ext.CliProvider; import io.xpipe.app.ext.ExtensionException; import io.xpipe.app.ext.ModuleLayerLoader; +import io.xpipe.app.ext.ProcModuleProvider; import io.xpipe.app.issue.*; import io.xpipe.app.platform.PlatformInit; import io.xpipe.app.platform.PlatformState; @@ -204,6 +205,7 @@ public abstract class AppOperationMode { DataStorage.get().generateCaches(); }); AppMainWindow.postInit(); + ProcModuleProvider.get().postInitWebtopSetup(); } catch (Throwable ex) { ErrorEventFactory.fromThrowable(ex).term().handle(); } diff --git a/app/src/main/java/io/xpipe/app/ext/ProcModuleProvider.java b/app/src/main/java/io/xpipe/app/ext/ProcModuleProvider.java index b30fd9a03..109a801c5 100644 --- a/app/src/main/java/io/xpipe/app/ext/ProcModuleProvider.java +++ b/app/src/main/java/io/xpipe/app/ext/ProcModuleProvider.java @@ -51,6 +51,8 @@ public abstract class ProcModuleProvider { return INSTANCE; } + public abstract void postInitWebtopSetup(); + public abstract String generatePublicSshKey(SecretValue privateKey, SecretRetrievalStrategy passphrase); public abstract Optional generatePublicSshKey(FilePath file) throws Exception; diff --git a/app/src/main/java/io/xpipe/app/hub/entry/StoreEntryWrapper.java b/app/src/main/java/io/xpipe/app/hub/entry/StoreEntryWrapper.java index f10ae9a5b..9ff1face7 100644 --- a/app/src/main/java/io/xpipe/app/hub/entry/StoreEntryWrapper.java +++ b/app/src/main/java/io/xpipe/app/hub/entry/StoreEntryWrapper.java @@ -458,6 +458,10 @@ public class StoreEntryWrapper { DataStorage.get().setOrderIndex(entry, index); } + public void expand() { + this.expanded.set(true); + } + public void toggleExpanded() { this.expanded.set(!expanded.getValue()); } diff --git a/app/src/main/java/io/xpipe/app/hub/section/StoreSectionComp.java b/app/src/main/java/io/xpipe/app/hub/section/StoreSectionComp.java index 855d6d5c6..6e9b16808 100644 --- a/app/src/main/java/io/xpipe/app/hub/section/StoreSectionComp.java +++ b/app/src/main/java/io/xpipe/app/hub/section/StoreSectionComp.java @@ -61,6 +61,9 @@ public class StoreSectionComp extends StoreSectionBaseComp { indicators.apply(struc -> { var pane = (Pane) ((VBox) struc.getChildren().get(1)).getChildren().getFirst(); addVisibilityListeners(struc, pane, () -> buildContent(entryButton).build()); + struc.setOnMouseClicked(e -> { + e.consume(); + }); }); return indicators.build(); diff --git a/app/src/main/java/io/xpipe/app/hub/section/StoreSectionState.java b/app/src/main/java/io/xpipe/app/hub/section/StoreSectionState.java index 96b3b6509..962899eb7 100644 --- a/app/src/main/java/io/xpipe/app/hub/section/StoreSectionState.java +++ b/app/src/main/java/io/xpipe/app/hub/section/StoreSectionState.java @@ -116,7 +116,14 @@ public class StoreSectionState { } private void addListeners() { - Listeners.attach(enabled, all, () -> { + Listeners.attach(enabled, all, (change) -> { + if (change != null) { + while (change.next()) { + if (change.wasAdded()) { + added.addAll(change.getAddedSubList()); + } + } + } updateAll(); }); @@ -129,15 +136,6 @@ public class StoreSectionState { updateShown(false); }); - Listeners.listen(enabled, StoreViewState.get().getAllEntries().getList(), change -> { - while (change.next()) { - if (change.wasAdded()) { - added.addAll(change.getAddedSubList()); - } - } - updateShown(false); - }); - Listeners.attach(enabled, category, () -> { updateShown(true); }); diff --git a/app/src/main/java/io/xpipe/app/platform/Listeners.java b/app/src/main/java/io/xpipe/app/platform/Listeners.java index 355bdc150..c412b7648 100644 --- a/app/src/main/java/io/xpipe/app/platform/Listeners.java +++ b/app/src/main/java/io/xpipe/app/platform/Listeners.java @@ -99,6 +99,23 @@ public class Listeners { }); } + public static void attach(ObservableValue enabled, ObservableList value, Consumer> consumer) { + var listener = new ListChangeListener() { + @Override + public void onChanged(Change c) { + consumer.accept(c); + } + }; + enabled.subscribe(v -> { + if (v) { + value.addListener(listener); + } else { + value.removeListener(listener); + } + }); + consumer.accept(null); + } + public static void listen(ObservableValue enabled, ObservableList value, Consumer> consumer) { var listener = new ListChangeListener() { @Override diff --git a/app/src/main/java/io/xpipe/app/terminal/TerminalLaunch.java b/app/src/main/java/io/xpipe/app/terminal/TerminalLaunch.java index 26eab7da0..35162568e 100644 --- a/app/src/main/java/io/xpipe/app/terminal/TerminalLaunch.java +++ b/app/src/main/java/io/xpipe/app/terminal/TerminalLaunch.java @@ -4,7 +4,11 @@ import io.xpipe.app.core.AppI18n; import io.xpipe.app.core.mode.AppOperationMode; import io.xpipe.app.issue.ErrorEventFactory; import io.xpipe.app.prefs.AppPrefs; -import io.xpipe.app.process.*; +import io.xpipe.app.process.CommandControl; +import io.xpipe.app.process.LocalShell; +import io.xpipe.app.process.ProcessControl; +import io.xpipe.app.process.ShellControl; +import io.xpipe.app.process.ShellScript; import io.xpipe.app.storage.DataStorage; import io.xpipe.app.storage.DataStoreEntry; import io.xpipe.app.util.FailableFunction; @@ -51,10 +55,9 @@ public class TerminalLaunch { if (AppOperationMode.get() == null) { if (command instanceof CommandControl cc) { - var s = cc.prepareTerminalOpen(TerminalInitScriptConfig.ofName(getFullTitle()), WorkingDirectoryFunction.fixed(directory)); TerminalLauncher.openDirect( getFullTitle(), - ignored -> new ShellScript(s), + sc -> new ShellScript(cc.getTerminalCommand().buildFull(sc)), ExternalTerminalType.determineFallbackTerminalToOpen(type, false)); } return; diff --git a/app/src/main/java/io/xpipe/app/util/RemoteDesktopWindow.java b/app/src/main/java/io/xpipe/app/util/RemoteDesktopWindow.java index 01cfafffa..995e9ed7a 100644 --- a/app/src/main/java/io/xpipe/app/util/RemoteDesktopWindow.java +++ b/app/src/main/java/io/xpipe/app/util/RemoteDesktopWindow.java @@ -182,8 +182,10 @@ public class RemoteDesktopWindow { } public void select(RemoteDesktopDockEntry entry) { - model.select(entry); - selected.set(entry); + ThreadHelper.runFailableAsync(() -> { + model.select(entry); + selected.set(entry); + }); } public void close(RemoteDesktopDockEntry entry, boolean closeWindowIfNeeded) { diff --git a/app/src/main/resources/io/xpipe/app/resources/style/store-entry-comp.css b/app/src/main/resources/io/xpipe/app/resources/style/store-entry-comp.css index 205088dd1..7c1fff7ec 100644 --- a/app/src/main/resources/io/xpipe/app/resources/style/store-entry-comp.css +++ b/app/src/main/resources/io/xpipe/app/resources/style/store-entry-comp.css @@ -342,8 +342,8 @@ -fx-background-radius: 0; } -.store-entry-comp .store-entry-badge, .store-entry-comp .store-entry-badge.no-action, .store-entry-comp .store-entry-badge:disabled { - -fx-opacity: 0.85; +.store-entry-badge { + -fx-opacity: 0.75; } .store-entry-comp:hover .store-entry-badge.no-action, .store-entry-comp:hover .store-entry-badge.no-action, .store-entry-comp:hover .store-entry-badge:disabled { diff --git a/version b/version index f988cd35c..b76e6fe74 100644 --- a/version +++ b/version @@ -1 +1 @@ -24.0-34 +24.0-35