diff --git a/app/src/main/java/io/xpipe/app/browser/action/LeafAction.java b/app/src/main/java/io/xpipe/app/browser/action/LeafAction.java index c79413332..558f47a76 100644 --- a/app/src/main/java/io/xpipe/app/browser/action/LeafAction.java +++ b/app/src/main/java/io/xpipe/app/browser/action/LeafAction.java @@ -3,14 +3,13 @@ package io.xpipe.app.browser.action; import io.xpipe.app.browser.file.BrowserEntry; import io.xpipe.app.browser.fs.OpenFileSystemModel; import io.xpipe.app.fxcomps.impl.TooltipAugment; +import io.xpipe.app.fxcomps.util.BindingsHelper; import io.xpipe.app.fxcomps.util.Shortcuts; import io.xpipe.app.util.BooleanScope; import io.xpipe.app.util.LicenseProvider; import io.xpipe.app.util.ThreadHelper; - import javafx.scene.control.Button; import javafx.scene.control.MenuItem; - import org.kordamp.ikonli.javafx.FontIcon; import java.util.List; @@ -65,7 +64,13 @@ public interface LeafAction extends BrowserAction { default MenuItem toMenuItem(OpenFileSystemModel model, List selected) { var name = getName(model, selected); var mi = new MenuItem(); - mi.textProperty().bind(name); + mi.textProperty().bind(BindingsHelper.map(name, s -> { + if (getProFeatureId() != null + && !LicenseProvider.get().getFeature(getProFeatureId()).isSupported()) { + return s + " (Pro)"; + } + return s; + })); mi.setOnAction(event -> { ThreadHelper.runFailableAsync(() -> { BooleanScope.execute(model.getBusy(), () -> { @@ -86,10 +91,8 @@ public interface LeafAction extends BrowserAction { mi.setMnemonicParsing(false); mi.setDisable(!isActive(model, selected)); - if (getProFeatureId() != null - && !LicenseProvider.get().getFeature(getProFeatureId()).isSupported()) { + if (getProFeatureId() != null && !LicenseProvider.get().getFeature(getProFeatureId()).isSupported()) { mi.setDisable(true); - mi.setText(mi.getText() + " (Pro)"); } return mi; diff --git a/app/src/main/resources/io/xpipe/app/resources/style/bookmark.css b/app/src/main/resources/io/xpipe/app/resources/style/bookmark.css index c521ef04c..6fdc219b5 100644 --- a/app/src/main/resources/io/xpipe/app/resources/style/bookmark.css +++ b/app/src/main/resources/io/xpipe/app/resources/style/bookmark.css @@ -1,7 +1,7 @@ .bookmark-list > .categories { -fx-padding: 1em; - -fx-background-color: -color-bg-subtle; + -fx-background-color: -color-bg-default; -fx-border-color: -color-border-default; -fx-border-width: 0 0 1 0; } diff --git a/app/src/main/resources/io/xpipe/app/resources/style/browser.css b/app/src/main/resources/io/xpipe/app/resources/style/browser.css index a33805d0c..5d820ec04 100644 --- a/app/src/main/resources/io/xpipe/app/resources/style/browser.css +++ b/app/src/main/resources/io/xpipe/app/resources/style/browser.css @@ -11,7 +11,7 @@ -fx-border-color: -color-border-default; -fx-border-width: 1px 0 0 0; -fx-padding: 1em; - -fx-background-color: -color-bg-subtle; + -fx-background-color: -color-bg-default; } .transfer .button { diff --git a/app/src/main/resources/io/xpipe/app/resources/style/color-box.css b/app/src/main/resources/io/xpipe/app/resources/style/color-box.css index 303bc459b..b7db6da5a 100644 --- a/app/src/main/resources/io/xpipe/app/resources/style/color-box.css +++ b/app/src/main/resources/io/xpipe/app/resources/style/color-box.css @@ -24,7 +24,7 @@ } .root:light .color-box.gray { - -fx-background-color: derive(-color-bg-default, -2%); + -fx-background-color: derive(-color-bg-default, -3%); -fx-border-color: derive(-color-border-default, -10%); } diff --git a/app/src/main/resources/io/xpipe/app/resources/style/popup-menu.css b/app/src/main/resources/io/xpipe/app/resources/style/popup-menu.css index fc045503a..b42a7297c 100644 --- a/app/src/main/resources/io/xpipe/app/resources/style/popup-menu.css +++ b/app/src/main/resources/io/xpipe/app/resources/style/popup-menu.css @@ -1,12 +1,12 @@ -.menu-button .context-menu > * > * { +.store-header-bar .menu-button .context-menu > * > * { -fx-padding: 5px 10px 5px 10px; } -.menu-button .context-menu > * { +.store-header-bar .menu-button .context-menu > * { -fx-padding: 0; } -.menu-button .context-menu { +.store-header-bar .menu-button .context-menu { -fx-padding: 3px; -fx-background-radius: 4px; -fx-border-radius: 4px; diff --git a/ext/base/src/main/java/io/xpipe/ext/base/browser/BrowseInNativeManagerAction.java b/ext/base/src/main/java/io/xpipe/ext/base/browser/BrowseInNativeManagerAction.java index f136b2d07..5c4306e8e 100644 --- a/ext/base/src/main/java/io/xpipe/ext/base/browser/BrowseInNativeManagerAction.java +++ b/ext/base/src/main/java/io/xpipe/ext/base/browser/BrowseInNativeManagerAction.java @@ -4,6 +4,7 @@ import io.xpipe.app.browser.action.LeafAction; import io.xpipe.app.browser.file.BrowserEntry; import io.xpipe.app.browser.fs.OpenFileSystemModel; import io.xpipe.app.core.AppI18n; +import io.xpipe.app.util.LocalShell; import io.xpipe.core.process.OsType; import io.xpipe.core.process.ShellControl; import io.xpipe.core.process.ShellDialect; @@ -17,34 +18,34 @@ public class BrowseInNativeManagerAction implements LeafAction { @Override public void execute(OpenFileSystemModel model, List entries) throws Exception { - ShellControl sc = model.getFileSystem().getShell().get(); + ShellControl sc = model.getFileSystem().getShell().orElseThrow(); ShellDialect d = sc.getShellDialect(); for (BrowserEntry entry : entries) { var e = entry.getRawFileEntry().getPath(); var localFile = sc.getLocalSystemAccess().translateToLocalSystemPath(e); - switch (OsType.getLocal()) { - case OsType.Windows windows -> { - if (entry.getRawFileEntry().getKind() == FileKind.DIRECTORY) { - sc.executeSimpleCommand("explorer " + d.fileArgument(localFile)); - } else { - sc.executeSimpleCommand("explorer /select," + d.fileArgument(localFile)); + try (var local = LocalShell.getShell().start()) { + switch (OsType.getLocal()) { + case OsType.Windows windows -> { + // Explorer does not support single quotes, so use normal quotes + if (entry.getRawFileEntry().getKind() == FileKind.DIRECTORY) { + local.executeSimpleCommand("explorer " + d.quoteArgument(localFile)); + } else { + local.executeSimpleCommand("explorer /select," + d.quoteArgument(localFile)); + } + } + case OsType.Linux linux -> { + var action = entry.getRawFileEntry().getKind() == FileKind.DIRECTORY ? + "org.freedesktop.FileManager1.ShowFolders" : + "org.freedesktop.FileManager1.ShowItems"; + var dbus = String.format(""" + dbus-send --session --print-reply --dest=org.freedesktop.FileManager1 --type=method_call /org/freedesktop/FileManager1 %s array:string:"file://%s" string:"" + """, action, localFile); + local.executeSimpleCommand(dbus); + } + case OsType.MacOs macOs -> { + local.executeSimpleCommand( + "open " + (entry.getRawFileEntry().getKind() == FileKind.DIRECTORY ? "" : "-R ") + d.fileArgument(localFile)); } - } - case OsType.Linux linux -> { - var action = entry.getRawFileEntry().getKind() == FileKind.DIRECTORY - ? "org.freedesktop.FileManager1.ShowFolders" - : "org.freedesktop.FileManager1.ShowItems"; - var dbus = String.format( - """ - dbus-send --session --print-reply --dest=org.freedesktop.FileManager1 --type=method_call /org/freedesktop/FileManager1 %s array:string:"file://%s" string:"" - """, - action, localFile); - sc.executeSimpleCommand(dbus); - } - case OsType.MacOs macOs -> { - sc.executeSimpleCommand( - "open " + (entry.getRawFileEntry().getKind() == FileKind.DIRECTORY ? "" : "-R ") - + d.fileArgument(localFile)); } } } diff --git a/app/src/main/java/io/xpipe/app/browser/action/ExecuteApplicationAction.java b/ext/base/src/main/java/io/xpipe/ext/base/browser/ExecuteApplicationAction.java similarity index 87% rename from app/src/main/java/io/xpipe/app/browser/action/ExecuteApplicationAction.java rename to ext/base/src/main/java/io/xpipe/ext/base/browser/ExecuteApplicationAction.java index 4d1fec818..85e480c6c 100644 --- a/app/src/main/java/io/xpipe/app/browser/action/ExecuteApplicationAction.java +++ b/ext/base/src/main/java/io/xpipe/ext/base/browser/ExecuteApplicationAction.java @@ -1,5 +1,7 @@ -package io.xpipe.app.browser.action; +package io.xpipe.ext.base.browser; +import io.xpipe.app.browser.action.ApplicationPathAction; +import io.xpipe.app.browser.action.LeafAction; import io.xpipe.app.browser.file.BrowserEntry; import io.xpipe.app.browser.fs.OpenFileSystemModel; import io.xpipe.core.process.ShellControl; diff --git a/ext/base/src/main/java/io/xpipe/ext/base/browser/JarAction.java b/ext/base/src/main/java/io/xpipe/ext/base/browser/JarAction.java index 36bcf580c..af8c3f424 100644 --- a/ext/base/src/main/java/io/xpipe/ext/base/browser/JarAction.java +++ b/ext/base/src/main/java/io/xpipe/ext/base/browser/JarAction.java @@ -1,7 +1,6 @@ package io.xpipe.ext.base.browser; import io.xpipe.app.browser.action.BrowserActionFormatter; -import io.xpipe.app.browser.action.MultiExecuteAction; import io.xpipe.app.browser.file.BrowserEntry; import io.xpipe.app.browser.fs.OpenFileSystemModel; import io.xpipe.app.browser.icon.BrowserIconFileType; diff --git a/ext/base/src/main/java/io/xpipe/ext/base/browser/JavapAction.java b/ext/base/src/main/java/io/xpipe/ext/base/browser/JavapAction.java index c88abe333..076157ebe 100644 --- a/ext/base/src/main/java/io/xpipe/ext/base/browser/JavapAction.java +++ b/ext/base/src/main/java/io/xpipe/ext/base/browser/JavapAction.java @@ -1,7 +1,6 @@ package io.xpipe.ext.base.browser; import io.xpipe.app.browser.action.BrowserActionFormatter; -import io.xpipe.app.browser.action.ToFileCommandAction; import io.xpipe.app.browser.file.BrowserEntry; import io.xpipe.app.browser.fs.OpenFileSystemModel; import io.xpipe.app.browser.icon.BrowserIconFileType; diff --git a/app/src/main/java/io/xpipe/app/browser/action/MultiExecuteAction.java b/ext/base/src/main/java/io/xpipe/ext/base/browser/MultiExecuteAction.java similarity index 93% rename from app/src/main/java/io/xpipe/app/browser/action/MultiExecuteAction.java rename to ext/base/src/main/java/io/xpipe/ext/base/browser/MultiExecuteAction.java index 1be973367..852ab0966 100644 --- a/app/src/main/java/io/xpipe/app/browser/action/MultiExecuteAction.java +++ b/ext/base/src/main/java/io/xpipe/ext/base/browser/MultiExecuteAction.java @@ -1,5 +1,7 @@ -package io.xpipe.app.browser.action; +package io.xpipe.ext.base.browser; +import io.xpipe.app.browser.action.BranchAction; +import io.xpipe.app.browser.action.LeafAction; import io.xpipe.app.browser.file.BrowserEntry; import io.xpipe.app.browser.fs.OpenFileSystemModel; import io.xpipe.app.core.AppI18n; @@ -7,11 +9,8 @@ import io.xpipe.app.prefs.AppPrefs; import io.xpipe.app.util.TerminalLauncher; import io.xpipe.core.process.CommandBuilder; import io.xpipe.core.process.ShellControl; - import javafx.beans.value.ObservableValue; -import org.apache.commons.io.FilenameUtils; - import java.util.List; public abstract class MultiExecuteAction implements BranchAction { @@ -30,8 +29,7 @@ public abstract class MultiExecuteAction implements BranchAction { for (BrowserEntry entry : entries) { TerminalLauncher.open( model.getEntry().getEntry(), - FilenameUtils.getBaseName( - entry.getRawFileEntry().getPath()), + entry.getRawFileEntry().getName(), model.getCurrentDirectory() != null ? model.getCurrentDirectory() .getPath() diff --git a/ext/base/src/main/java/io/xpipe/ext/base/browser/RenameAction.java b/ext/base/src/main/java/io/xpipe/ext/base/browser/RenameAction.java index e47d697e9..ea3ba6866 100644 --- a/ext/base/src/main/java/io/xpipe/ext/base/browser/RenameAction.java +++ b/ext/base/src/main/java/io/xpipe/ext/base/browser/RenameAction.java @@ -40,7 +40,7 @@ public class RenameAction implements LeafAction { @Override public ObservableValue getName(OpenFileSystemModel model, List entries) { - return AppI18n.observable("openWithDefaultApplication"); + return AppI18n.observable("rename"); } @Override diff --git a/ext/base/src/main/java/io/xpipe/ext/base/browser/RunAction.java b/ext/base/src/main/java/io/xpipe/ext/base/browser/RunAction.java index 7905d96c3..505786ff0 100644 --- a/ext/base/src/main/java/io/xpipe/ext/base/browser/RunAction.java +++ b/ext/base/src/main/java/io/xpipe/ext/base/browser/RunAction.java @@ -1,6 +1,5 @@ package io.xpipe.ext.base.browser; -import io.xpipe.app.browser.action.MultiExecuteAction; import io.xpipe.app.browser.file.BrowserEntry; import io.xpipe.app.browser.fs.OpenFileSystemModel; import io.xpipe.app.core.AppI18n; diff --git a/app/src/main/java/io/xpipe/app/browser/action/ToFileCommandAction.java b/ext/base/src/main/java/io/xpipe/ext/base/browser/ToFileCommandAction.java similarity index 87% rename from app/src/main/java/io/xpipe/app/browser/action/ToFileCommandAction.java rename to ext/base/src/main/java/io/xpipe/ext/base/browser/ToFileCommandAction.java index a14311e3d..a9a1de88b 100644 --- a/app/src/main/java/io/xpipe/app/browser/action/ToFileCommandAction.java +++ b/ext/base/src/main/java/io/xpipe/ext/base/browser/ToFileCommandAction.java @@ -1,5 +1,7 @@ -package io.xpipe.app.browser.action; +package io.xpipe.ext.base.browser; +import io.xpipe.app.browser.action.ApplicationPathAction; +import io.xpipe.app.browser.action.LeafAction; import io.xpipe.app.browser.file.BrowserEntry; import io.xpipe.app.browser.fs.OpenFileSystemModel; import io.xpipe.app.util.FileOpener; diff --git a/ext/base/src/main/java/io/xpipe/ext/base/browser/UnzipAction.java b/ext/base/src/main/java/io/xpipe/ext/base/browser/UnzipAction.java index 259fd9c79..c4f34ab36 100644 --- a/ext/base/src/main/java/io/xpipe/ext/base/browser/UnzipAction.java +++ b/ext/base/src/main/java/io/xpipe/ext/base/browser/UnzipAction.java @@ -1,6 +1,5 @@ package io.xpipe.ext.base.browser; -import io.xpipe.app.browser.action.ExecuteApplicationAction; import io.xpipe.app.browser.file.BrowserEntry; import io.xpipe.app.browser.fs.OpenFileSystemModel; import io.xpipe.app.browser.icon.BrowserIconFileType;