mirror of
https://github.com/xpipe-io/xpipe.git
synced 2024-05-23 21:50:10 +12:00
121 lines
4.7 KiB
Java
121 lines
4.7 KiB
Java
package io.xpipe.app.browser.fs;
|
|
|
|
import io.xpipe.app.browser.BrowserFilterComp;
|
|
import io.xpipe.app.browser.BrowserNavBar;
|
|
import io.xpipe.app.browser.BrowserOverviewComp;
|
|
import io.xpipe.app.browser.BrowserStatusBarComp;
|
|
import io.xpipe.app.browser.action.BrowserAction;
|
|
import io.xpipe.app.browser.file.BrowserContextMenu;
|
|
import io.xpipe.app.browser.file.BrowserFileListComp;
|
|
import io.xpipe.app.comp.base.ModalOverlayComp;
|
|
import io.xpipe.app.comp.base.MultiContentComp;
|
|
import io.xpipe.app.fxcomps.Comp;
|
|
import io.xpipe.app.fxcomps.SimpleComp;
|
|
import io.xpipe.app.fxcomps.SimpleCompStructure;
|
|
import io.xpipe.app.fxcomps.augment.ContextMenuAugment;
|
|
import io.xpipe.app.fxcomps.impl.VerticalComp;
|
|
import io.xpipe.app.fxcomps.util.Shortcuts;
|
|
|
|
import javafx.geometry.Insets;
|
|
import javafx.geometry.Pos;
|
|
import javafx.scene.control.Button;
|
|
import javafx.scene.control.MenuButton;
|
|
import javafx.scene.input.KeyCode;
|
|
import javafx.scene.input.KeyCodeCombination;
|
|
import javafx.scene.input.KeyCombination;
|
|
import javafx.scene.input.MouseButton;
|
|
import javafx.scene.layout.HBox;
|
|
import javafx.scene.layout.Priority;
|
|
import javafx.scene.layout.Region;
|
|
import javafx.scene.layout.VBox;
|
|
|
|
import atlantafx.base.controls.Spacer;
|
|
import org.kordamp.ikonli.javafx.FontIcon;
|
|
|
|
import java.util.ArrayList;
|
|
import java.util.List;
|
|
import java.util.Map;
|
|
|
|
public class OpenFileSystemComp extends SimpleComp {
|
|
|
|
private final OpenFileSystemModel model;
|
|
private final boolean showStatusBar;
|
|
|
|
public OpenFileSystemComp(OpenFileSystemModel model, boolean showStatusBar) {
|
|
this.model = model;
|
|
this.showStatusBar = showStatusBar;
|
|
}
|
|
|
|
@Override
|
|
protected Region createSimple() {
|
|
var alertOverlay = new ModalOverlayComp(Comp.of(() -> createContent()), model.getOverlay());
|
|
return alertOverlay.createRegion();
|
|
}
|
|
|
|
private Region createContent() {
|
|
var overview = new Button(null, new FontIcon("mdi2m-monitor"));
|
|
overview.setOnAction(e -> model.cdAsync(null));
|
|
overview.disableProperty().bind(model.getInOverview());
|
|
overview.setAccessibleText("System overview");
|
|
|
|
var backBtn = BrowserAction.byId("back", model, List.of()).toButton(model, List.of());
|
|
var forthBtn = BrowserAction.byId("forward", model, List.of()).toButton(model, List.of());
|
|
var refreshBtn = BrowserAction.byId("refresh", model, List.of()).toButton(model, List.of());
|
|
var terminalBtn = BrowserAction.byId("openTerminal", model, List.of()).toButton(model, List.of());
|
|
|
|
var menuButton = new MenuButton(null, new FontIcon("mdral-folder_open"));
|
|
new ContextMenuAugment<>(
|
|
event -> event.getButton() == MouseButton.PRIMARY,
|
|
null,
|
|
() -> new BrowserContextMenu(model, null))
|
|
.augment(new SimpleCompStructure<>(menuButton));
|
|
menuButton.disableProperty().bind(model.getInOverview());
|
|
menuButton.setAccessibleText("Directory options");
|
|
|
|
var filter = new BrowserFilterComp(model, model.getFilter()).createStructure();
|
|
Shortcuts.addShortcut(filter.toggleButton(), new KeyCodeCombination(KeyCode.F, KeyCombination.SHORTCUT_DOWN));
|
|
|
|
var topBar = new HBox();
|
|
topBar.setAlignment(Pos.CENTER);
|
|
topBar.getStyleClass().add("top-bar");
|
|
topBar.getChildren()
|
|
.setAll(
|
|
overview,
|
|
backBtn,
|
|
forthBtn,
|
|
new Spacer(10),
|
|
new BrowserNavBar(model).hgrow().createRegion(),
|
|
new Spacer(5),
|
|
filter.get(),
|
|
refreshBtn,
|
|
terminalBtn,
|
|
menuButton);
|
|
|
|
var content = createFileListContent();
|
|
var root = new VBox(topBar, content);
|
|
VBox.setVgrow(content, Priority.ALWAYS);
|
|
root.setPadding(Insets.EMPTY);
|
|
return root;
|
|
}
|
|
|
|
private Region createFileListContent() {
|
|
var directoryView = new BrowserFileListComp(model.getFileList())
|
|
.apply(struc -> VBox.setVgrow(struc.get(), Priority.ALWAYS));
|
|
var fileListElements = new ArrayList<Comp<?>>();
|
|
fileListElements.add(directoryView);
|
|
if (showStatusBar) {
|
|
var statusBar = new BrowserStatusBarComp(model);
|
|
fileListElements.add(statusBar);
|
|
}
|
|
var fileList = new VerticalComp(fileListElements);
|
|
|
|
var home = new BrowserOverviewComp(model);
|
|
var stack = new MultiContentComp(Map.of(
|
|
home,
|
|
model.getCurrentPath().isNull(),
|
|
fileList,
|
|
model.getCurrentPath().isNull().not()));
|
|
return stack.createRegion();
|
|
}
|
|
}
|