From 388a20d5a41bace2afab0724cb9c91bb69a6df36 Mon Sep 17 00:00:00 2001 From: crschnick Date: Wed, 9 Jul 2025 14:23:53 +0000 Subject: [PATCH] Rework async browser actions --- .../file/BrowserFileSystemTabModel.java | 14 ++++-- .../menu/MultiExecuteMenuProvider.java | 48 ++++++++++--------- .../browser/menu/impl/BackMenuProvider.java | 5 +- .../menu/impl/EditFileMenuProvider.java | 9 ++-- .../menu/impl/ForwardMenuProvider.java | 5 +- .../browser/menu/impl/JavapMenuProvider.java | 19 ++++---- .../impl/RefreshDirectoryMenuProvider.java | 5 +- dist/changelogs/17.0.md | 1 + .../script/RunFileScriptMenuProvider.java | 3 -- 9 files changed, 62 insertions(+), 47 deletions(-) diff --git a/app/src/main/java/io/xpipe/app/browser/file/BrowserFileSystemTabModel.java b/app/src/main/java/io/xpipe/app/browser/file/BrowserFileSystemTabModel.java index eb74e1eb1..0bf2ade2a 100644 --- a/app/src/main/java/io/xpipe/app/browser/file/BrowserFileSystemTabModel.java +++ b/app/src/main/java/io/xpipe/app/browser/file/BrowserFileSystemTabModel.java @@ -163,12 +163,12 @@ public final class BrowserFileSystemTabModel extends BrowserStoreSessionTab entries) throws Exception { + public void refreshBrowserEntriesSync(List entries) { refreshFileEntriesSync( entries.stream().map(BrowserEntry::getRawFileEntry).collect(Collectors.toList())); } - public void refreshFileEntriesSync(List entries) throws Exception { + public void refreshFileEntriesSync(List entries) { if (fileList.getAll().getValue().size() < 10) { refreshSync(); return; @@ -179,9 +179,13 @@ public final class BrowserFileSystemTabModel extends BrowserStoreSessionTab entries) throws Exception { - var sc = model.getFileSystem().getShell().orElseThrow(); - for (BrowserEntry entry : entries) { - var c = createCommand(sc, model, entry); - if (c == null) { - return; - } + ThreadHelper.runAsync(() -> { + var sc = model.getFileSystem().getShell().orElseThrow(); + for (BrowserEntry entry : entries) { + var c = createCommand(sc, model, entry); + if (c == null) { + return; + } - var cmd = sc.command(c); - CommandDialog.runAndShow(cmd); - } - model.refreshBrowserEntriesSync(entries); + var cmd = sc.command(c); + CommandDialog.runAndShow(cmd); + } + model.refreshBrowserEntriesSync(entries); + }); } @Override @@ -84,19 +87,18 @@ public abstract class MultiExecuteMenuProvider implements BrowserMenuBranchProvi @Override public void execute(BrowserFileSystemTabModel model, List entries) throws Exception { - var sc = model.getFileSystem().getShell().orElseThrow(); - for (BrowserEntry entry : entries) { - var cmd = createCommand(sc, model, entry); - if (cmd == null) { - continue; - } + ThreadHelper.runFailableAsync(() -> { + var sc = model.getFileSystem().getShell().orElseThrow(); + for (BrowserEntry entry : entries) { + var cmd = createCommand(sc, model, entry); + if (cmd == null) { + continue; + } - sc.command(cmd) - .withWorkingDirectory( - model.getCurrentDirectory().getPath()) - .execute(); - } - model.refreshBrowserEntriesSync(entries); + sc.command(cmd).withWorkingDirectory(model.getCurrentDirectory().getPath()).execute(); + } + model.refreshBrowserEntriesSync(entries); + }); } @Override diff --git a/app/src/main/java/io/xpipe/app/browser/menu/impl/BackMenuProvider.java b/app/src/main/java/io/xpipe/app/browser/menu/impl/BackMenuProvider.java index 1ddf5f3a0..d2ee1a643 100644 --- a/app/src/main/java/io/xpipe/app/browser/menu/impl/BackMenuProvider.java +++ b/app/src/main/java/io/xpipe/app/browser/menu/impl/BackMenuProvider.java @@ -6,6 +6,7 @@ import io.xpipe.app.browser.menu.BrowserMenuLeafProvider; import io.xpipe.app.core.AppI18n; import io.xpipe.app.util.LabelGraphic; +import io.xpipe.app.util.ThreadHelper; import javafx.beans.value.ObservableValue; import javafx.scene.input.KeyCode; import javafx.scene.input.KeyCodeCombination; @@ -17,7 +18,9 @@ public class BackMenuProvider implements BrowserMenuLeafProvider { @Override public void execute(BrowserFileSystemTabModel model, List entries) { - model.backSync(1); + ThreadHelper.runAsync(() -> { + model.backSync(1); + }); } public String getId() { diff --git a/app/src/main/java/io/xpipe/app/browser/menu/impl/EditFileMenuProvider.java b/app/src/main/java/io/xpipe/app/browser/menu/impl/EditFileMenuProvider.java index 9b5e45fee..a9e6910d4 100644 --- a/app/src/main/java/io/xpipe/app/browser/menu/impl/EditFileMenuProvider.java +++ b/app/src/main/java/io/xpipe/app/browser/menu/impl/EditFileMenuProvider.java @@ -8,6 +8,7 @@ import io.xpipe.app.browser.menu.BrowserMenuLeafProvider; import io.xpipe.app.core.AppI18n; import io.xpipe.app.prefs.AppPrefs; import io.xpipe.app.util.LabelGraphic; +import io.xpipe.app.util.ThreadHelper; import io.xpipe.core.FileKind; import javafx.beans.value.ObservableValue; @@ -26,9 +27,11 @@ public class EditFileMenuProvider implements BrowserMenuLeafProvider { @Override public void execute(BrowserFileSystemTabModel model, List entries) { - for (BrowserEntry entry : entries) { - BrowserFileOpener.openInTextEditor(model, entry.getRawFileEntry()); - } + ThreadHelper.runAsync(() -> { + for (BrowserEntry entry : entries) { + BrowserFileOpener.openInTextEditor(model, entry.getRawFileEntry()); + } + }); } @Override diff --git a/app/src/main/java/io/xpipe/app/browser/menu/impl/ForwardMenuProvider.java b/app/src/main/java/io/xpipe/app/browser/menu/impl/ForwardMenuProvider.java index 415994cee..7059af089 100644 --- a/app/src/main/java/io/xpipe/app/browser/menu/impl/ForwardMenuProvider.java +++ b/app/src/main/java/io/xpipe/app/browser/menu/impl/ForwardMenuProvider.java @@ -6,6 +6,7 @@ import io.xpipe.app.browser.menu.BrowserMenuLeafProvider; import io.xpipe.app.core.AppI18n; import io.xpipe.app.util.LabelGraphic; +import io.xpipe.app.util.ThreadHelper; import javafx.beans.value.ObservableValue; import javafx.scene.input.KeyCode; import javafx.scene.input.KeyCodeCombination; @@ -17,7 +18,9 @@ public class ForwardMenuProvider implements BrowserMenuLeafProvider { @Override public void execute(BrowserFileSystemTabModel model, List entries) { - model.forthSync(1); + ThreadHelper.runAsync(() -> { + model.forthSync(1); + }); } public String getId() { diff --git a/app/src/main/java/io/xpipe/app/browser/menu/impl/JavapMenuProvider.java b/app/src/main/java/io/xpipe/app/browser/menu/impl/JavapMenuProvider.java index 831742f8c..911343acf 100644 --- a/app/src/main/java/io/xpipe/app/browser/menu/impl/JavapMenuProvider.java +++ b/app/src/main/java/io/xpipe/app/browser/menu/impl/JavapMenuProvider.java @@ -11,6 +11,7 @@ import io.xpipe.app.process.CommandBuilder; import io.xpipe.app.process.ShellControl; import io.xpipe.app.util.FileOpener; +import io.xpipe.app.util.ThreadHelper; import javafx.beans.property.SimpleStringProperty; import javafx.beans.value.ObservableValue; @@ -42,16 +43,14 @@ public class JavapMenuProvider @Override public void execute(BrowserFileSystemTabModel model, List entries) throws Exception { - ShellControl sc = model.getFileSystem().getShell().orElseThrow(); - for (BrowserEntry entry : entries) { - var command = CommandBuilder.of() - .add("javap", "-c", "-p") - .addFile(entry.getRawFileEntry().getPath()); - var out = sc.command(command) - .withWorkingDirectory(model.getCurrentDirectory().getPath()) - .readStdoutOrThrow(); - FileOpener.openReadOnlyString(out); - } + ThreadHelper.runFailableAsync(() -> { + ShellControl sc = model.getFileSystem().getShell().orElseThrow(); + for (BrowserEntry entry : entries) { + var command = CommandBuilder.of().add("javap", "-c", "-p").addFile(entry.getRawFileEntry().getPath()); + var out = sc.command(command).withWorkingDirectory(model.getCurrentDirectory().getPath()).readStdoutOrThrow(); + FileOpener.openReadOnlyString(out); + } + }); } @Override diff --git a/app/src/main/java/io/xpipe/app/browser/menu/impl/RefreshDirectoryMenuProvider.java b/app/src/main/java/io/xpipe/app/browser/menu/impl/RefreshDirectoryMenuProvider.java index b53beb183..2cf9727ac 100644 --- a/app/src/main/java/io/xpipe/app/browser/menu/impl/RefreshDirectoryMenuProvider.java +++ b/app/src/main/java/io/xpipe/app/browser/menu/impl/RefreshDirectoryMenuProvider.java @@ -6,6 +6,7 @@ import io.xpipe.app.browser.menu.BrowserMenuLeafProvider; import io.xpipe.app.core.AppI18n; import io.xpipe.app.util.LabelGraphic; +import io.xpipe.app.util.ThreadHelper; import javafx.beans.value.ObservableValue; import javafx.scene.input.KeyCode; import javafx.scene.input.KeyCodeCombination; @@ -17,7 +18,9 @@ public class RefreshDirectoryMenuProvider implements BrowserMenuLeafProvider { @Override public void execute(BrowserFileSystemTabModel model, List entries) { - model.refreshSync(); + ThreadHelper.runAsync(() -> { + model.refreshSync(); + }); } public String getId() { diff --git a/dist/changelogs/17.0.md b/dist/changelogs/17.0.md index b156733a8..726d08107 100644 --- a/dist/changelogs/17.0.md +++ b/dist/changelogs/17.0.md @@ -132,6 +132,7 @@ The HTTP API has been improved in various areas. The action system is integrated - You can now disable icon sources without having to remove them - Terminal connections now enable truecolor mode if possible - Add notification when a password is copied to the clipboard +- Add support for Ghostty on macOS ## Fixes diff --git a/ext/base/src/main/java/io/xpipe/ext/base/script/RunFileScriptMenuProvider.java b/ext/base/src/main/java/io/xpipe/ext/base/script/RunFileScriptMenuProvider.java index 20f8456d9..ebbbd17be 100644 --- a/ext/base/src/main/java/io/xpipe/ext/base/script/RunFileScriptMenuProvider.java +++ b/ext/base/src/main/java/io/xpipe/ext/base/script/RunFileScriptMenuProvider.java @@ -47,9 +47,6 @@ public class RunFileScriptMenuProvider implements BrowserMenuBranchProvider { DataStorage.get().getEffectiveCategoryConfig(model.getEntry().get()); if (Boolean.TRUE.equals(config.getDontAllowScripts())) { return List.of(new BrowserMenuLeafProvider() { - @Override - public void execute(BrowserFileSystemTabModel model, List entries) {} - @Override public ObservableValue getName(BrowserFileSystemTabModel model, List entries) { return AppI18n.observable("scriptsDisabled");