Improve browser navigation bar

This commit is contained in:
crschnick 2023-05-15 19:39:50 +00:00
parent 441226855f
commit 0eea4f3e3f
5 changed files with 85 additions and 15 deletions

View file

@ -0,0 +1,50 @@
package io.xpipe.app.browser;
import io.xpipe.app.fxcomps.SimpleComp;
import io.xpipe.app.fxcomps.impl.TextFieldComp;
import io.xpipe.app.fxcomps.util.SimpleChangeListener;
import javafx.beans.property.SimpleStringProperty;
import javafx.css.PseudoClass;
import javafx.geometry.Pos;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Priority;
import javafx.scene.layout.Region;
import javafx.scene.layout.StackPane;
public class BrowserNavBar extends SimpleComp {
private static final PseudoClass INVISIBLE = PseudoClass.getPseudoClass("invisible");
private final OpenFileSystemModel model;
public BrowserNavBar(OpenFileSystemModel model) {
this.model = model;
}
@Override
protected Region createSimple() {
var path = new SimpleStringProperty(model.getCurrentPath().get());
path.addListener((observable, oldValue, newValue) -> {
var changed = model.cd(newValue);
changed.ifPresent(path::set);
});
var pathBar = new TextFieldComp(path, true).createRegion();
pathBar.getStyleClass().add("path-text");
model.getCurrentPath().addListener((observable, oldValue, newValue) -> {
path.set(newValue);
});
SimpleChangeListener.apply(pathBar.focusedProperty(), val -> {
pathBar.pseudoClassStateChanged(INVISIBLE, !val);
});
var breadcrumbs = new FileBrowserBreadcrumbBar(model)
.hide(pathBar.focusedProperty())
.createRegion();
var stack = new StackPane(pathBar, breadcrumbs);
HBox.setHgrow(stack, Priority.ALWAYS);
stack.setAlignment(Pos.CENTER_LEFT);
return stack;
}
}

View file

@ -1,7 +1,6 @@
package io.xpipe.app.browser;
import atlantafx.base.controls.Breadcrumbs;
import atlantafx.base.theme.Styles;
import io.xpipe.app.fxcomps.SimpleComp;
import io.xpipe.app.fxcomps.util.PlatformThread;
import io.xpipe.app.fxcomps.util.SimpleChangeListener;
@ -9,6 +8,7 @@ import io.xpipe.core.impl.FileNames;
import javafx.scene.Node;
import javafx.scene.control.Button;
import javafx.scene.control.ButtonBase;
import javafx.scene.control.Label;
import javafx.scene.layout.Region;
import javafx.util.Callback;
@ -24,7 +24,6 @@ public class FileBrowserBreadcrumbBar extends SimpleComp {
protected Region createSimple() {
Callback<Breadcrumbs.BreadCrumbItem<String>, ButtonBase> crumbFactory = crumb -> {
var btn = new Button(FileNames.getFileName(crumb.getValue()), null);
btn.getStyleClass().add(Styles.FLAT);
btn.setFocusTraversable(false);
return btn;
};
@ -42,6 +41,13 @@ public class FileBrowserBreadcrumbBar extends SimpleComp {
return;
}
var sc = model.getFileSystem().getShell();
if (sc.isEmpty()) {
breadcrumbs.setDividerFactory(item -> item != null && !item.isLast() ? new Label("/") : null);
} else {
breadcrumbs.setDividerFactory(item -> item != null && !item.isLast() ? new Label(sc.get().getOsType().getFileSystemSeparator()) : null);
}
var elements = FileNames.splitHierarchy(val);
Breadcrumbs.BreadCrumbItem<String> items = Breadcrumbs.buildTreeModel(elements.toArray(String[]::new));
breadcrumbs.setSelectedCrumb(items);

View file

@ -54,17 +54,6 @@ public class OpenFileSystemComp extends SimpleComp {
forthBtn.setOnAction(e -> model.forth());
forthBtn.disableProperty().bind(model.getHistory().canGoForthProperty().not());
var path = new SimpleStringProperty(model.getCurrentPath().get());
var pathBar = new TextFieldComp(path, true).createRegion();
path.addListener((observable, oldValue, newValue) -> {
var changed = model.cd(newValue);
changed.ifPresent(path::set);
});
model.getCurrentPath().addListener((observable, oldValue, newValue) -> {
path.set(newValue);
});
HBox.setHgrow(pathBar, Priority.ALWAYS);
var refreshBtn = new Button(null, new FontIcon("mdmz-refresh"));
refreshBtn.setOnAction(e -> model.refresh());
Shortcuts.addShortcut(refreshBtn, new KeyCodeCombination(KeyCode.F5));
@ -86,7 +75,7 @@ public class OpenFileSystemComp extends SimpleComp {
var topBar = new ToolBar();
topBar.getItems()
.setAll(backBtn, forthBtn, new Spacer(10), new FileBrowserBreadcrumbBar(model).createRegion(), filter.get(), refreshBtn, terminalBtn, addBtn);
.setAll(backBtn, forthBtn, new Spacer(10), new BrowserNavBar(model).createRegion(), filter.get(), refreshBtn, terminalBtn, addBtn);
// ~

View file

@ -82,7 +82,15 @@
}
.browser .breadcrumbs .button {
-fx-padding: 0;
-fx-padding: 3px 1px 3px 1px;
-fx-background-color: transparent;
}
.browser .breadcrumbs .button:hover {
-fx-background-color: -color-neutral-muted;
}
.browser .path-text:invisible {
-fx-text-fill: transparent;
}
.browser .context-menu .accelerator-text {

View file

@ -25,6 +25,8 @@ public sealed interface OsType permits OsType.Windows, OsType.Linux, OsType.MacO
String getHomeDirectory(ShellControl pc) throws Exception;
String getFileSystemSeparator();
String getName();
String getTempDirectory(ShellControl pc) throws Exception;
@ -41,6 +43,11 @@ public sealed interface OsType permits OsType.Windows, OsType.Linux, OsType.MacO
pc.getShellDialect().getPrintEnvironmentVariableCommand("USERPROFILE"));
}
@Override
public String getFileSystemSeparator() {
return "\\";
}
@Override
public String getName() {
return "Windows";
@ -87,6 +94,11 @@ public sealed interface OsType permits OsType.Windows, OsType.Linux, OsType.MacO
return pc.executeSimpleStringCommand(pc.getShellDialect().getPrintEnvironmentVariableCommand("HOME"));
}
@Override
public String getFileSystemSeparator() {
return "/";
}
@Override
public String getTempDirectory(ShellControl pc) throws Exception {
return "/tmp/";
@ -157,6 +169,11 @@ public sealed interface OsType permits OsType.Windows, OsType.Linux, OsType.MacO
return found;
}
@Override
public String getFileSystemSeparator() {
return "/";
}
@Override
public String getName() {
return "Mac";