xpipe/app/src/main/java/io/xpipe/app/browser/fs/OpenFileSystemComp.java

121 lines
4.7 KiB
Java
Raw Normal View History

2024-04-14 04:23:09 +12:00
package io.xpipe.app.browser.fs;
2023-02-20 06:44:47 +13:00
2024-04-14 04:23:09 +12:00
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;
2024-04-14 04:23:09 +12:00
import io.xpipe.app.browser.file.BrowserContextMenu;
import io.xpipe.app.browser.file.BrowserFileListComp;
2023-05-21 01:49:58 +12:00
import io.xpipe.app.comp.base.ModalOverlayComp;
2023-05-26 10:29:24 +12:00
import io.xpipe.app.comp.base.MultiContentComp;
2023-05-21 01:49:58 +12:00
import io.xpipe.app.fxcomps.Comp;
2023-02-20 06:44:47 +13:00
import io.xpipe.app.fxcomps.SimpleComp;
2023-05-21 01:49:58 +12:00
import io.xpipe.app.fxcomps.SimpleCompStructure;
import io.xpipe.app.fxcomps.augment.ContextMenuAugment;
2023-05-26 10:29:24 +12:00
import io.xpipe.app.fxcomps.impl.VerticalComp;
2023-04-06 02:41:02 +12:00
import io.xpipe.app.fxcomps.util.Shortcuts;
2024-04-19 09:37:28 +12:00
2023-02-20 06:44:47 +13:00
import javafx.geometry.Insets;
2024-01-18 09:58:33 +13:00
import javafx.geometry.Pos;
2023-05-21 01:49:58 +12:00
import javafx.scene.control.Button;
import javafx.scene.control.MenuButton;
2023-04-06 02:41:02 +12:00
import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyCodeCombination;
2023-05-21 01:49:58 +12:00
import javafx.scene.input.KeyCombination;
2023-05-22 02:12:06 +12:00
import javafx.scene.input.MouseButton;
2024-01-18 09:58:33 +13:00
import javafx.scene.layout.HBox;
2023-05-21 01:49:58 +12:00
import javafx.scene.layout.Priority;
import javafx.scene.layout.Region;
import javafx.scene.layout.VBox;
2024-04-19 09:37:28 +12:00
import atlantafx.base.controls.Spacer;
2023-02-20 06:44:47 +13:00
import org.kordamp.ikonli.javafx.FontIcon;
2024-04-18 16:38:56 +12:00
import java.util.ArrayList;
2023-05-26 10:29:24 +12:00
import java.util.List;
import java.util.Map;
2023-02-20 06:44:47 +13:00
public class OpenFileSystemComp extends SimpleComp {
private final OpenFileSystemModel model;
2024-04-18 16:38:56 +12:00
private final boolean showStatusBar;
2023-02-20 06:44:47 +13:00
2024-04-18 16:38:56 +12:00
public OpenFileSystemComp(OpenFileSystemModel model, boolean showStatusBar) {
2023-02-20 06:44:47 +13:00
this.model = model;
2024-04-18 16:38:56 +12:00
this.showStatusBar = showStatusBar;
2023-02-20 06:44:47 +13:00
}
@Override
protected Region createSimple() {
2023-05-26 10:29:24 +12:00
var alertOverlay = new ModalOverlayComp(Comp.of(() -> createContent()), model.getOverlay());
2023-05-21 01:49:58 +12:00
return alertOverlay.createRegion();
}
private Region createContent() {
2023-05-27 09:01:57 +12:00
var overview = new Button(null, new FontIcon("mdi2m-monitor"));
2023-08-02 07:34:08 +12:00
overview.setOnAction(e -> model.cdAsync(null));
overview.disableProperty().bind(model.getInOverview());
2023-06-04 01:51:20 +12:00
overview.setAccessibleText("System overview");
2023-05-27 09:01:57 +12:00
2023-09-08 07:18:55 +12:00
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());
2023-02-20 06:44:47 +13:00
2023-05-21 01:49:58 +12:00
var menuButton = new MenuButton(null, new FontIcon("mdral-folder_open"));
2023-05-26 10:29:24 +12:00
new ContextMenuAugment<>(
2024-04-14 04:23:09 +12:00
event -> event.getButton() == MouseButton.PRIMARY,
null,
() -> new BrowserContextMenu(model, null))
2023-05-26 10:29:24 +12:00
.augment(new SimpleCompStructure<>(menuButton));
menuButton.disableProperty().bind(model.getInOverview());
2023-06-04 01:51:20 +12:00
menuButton.setAccessibleText("Directory options");
2023-02-20 06:44:47 +13:00
var filter = new BrowserFilterComp(model, model.getFilter()).createStructure();
2023-05-21 01:49:58 +12:00
Shortcuts.addShortcut(filter.toggleButton(), new KeyCodeCombination(KeyCode.F, KeyCombination.SHORTCUT_DOWN));
2023-02-25 11:16:27 +13:00
2024-01-18 09:58:33 +13:00
var topBar = new HBox();
topBar.setAlignment(Pos.CENTER);
topBar.getStyleClass().add("top-bar");
topBar.getChildren()
2023-05-26 10:29:24 +12:00
.setAll(
2023-05-27 09:01:57 +12:00
overview,
2023-05-26 10:29:24 +12:00
backBtn,
forthBtn,
new Spacer(10),
2024-01-18 09:58:33 +13:00
new BrowserNavBar(model).hgrow().createRegion(),
new Spacer(5),
2023-05-26 10:29:24 +12:00
filter.get(),
refreshBtn,
terminalBtn,
menuButton);
2023-02-20 06:44:47 +13:00
2023-05-26 10:29:24 +12:00
var content = createFileListContent();
var root = new VBox(topBar, content);
VBox.setVgrow(content, Priority.ALWAYS);
2023-02-20 06:44:47 +13:00
root.setPadding(Insets.EMPTY);
2023-05-21 01:49:58 +12:00
return root;
2023-02-20 06:44:47 +13:00
}
2023-05-26 10:29:24 +12:00
private Region createFileListContent() {
2023-06-16 15:38:39 +12:00
var directoryView = new BrowserFileListComp(model.getFileList())
.apply(struc -> VBox.setVgrow(struc.get(), Priority.ALWAYS));
2024-04-18 16:38:56 +12:00
var fileListElements = new ArrayList<Comp<?>>();
fileListElements.add(directoryView);
if (showStatusBar) {
var statusBar = new BrowserStatusBarComp(model);
fileListElements.add(statusBar);
}
var fileList = new VerticalComp(fileListElements);
2023-05-26 10:29:24 +12:00
var home = new BrowserOverviewComp(model);
var stack = new MultiContentComp(Map.of(
home,
model.getCurrentPath().isNull(),
fileList,
2024-04-14 04:23:09 +12:00
model.getCurrentPath().isNull().not()));
2023-05-26 10:29:24 +12:00
return stack.createRegion();
}
2023-02-20 06:44:47 +13:00
}