From 417aa16f1d48a93ef598a642c45ce4260044fea4 Mon Sep 17 00:00:00 2001 From: crschnick Date: Sun, 26 Feb 2023 20:26:45 +0000 Subject: [PATCH] Various small fixes [release] --- .../io/xpipe/app/browser/FileBrowserComp.java | 122 ++++++++++++------ .../xpipe/app/browser/FileBrowserModel.java | 63 ++++++++- .../io/xpipe/app/browser/FileContextMenu.java | 11 ++ .../io/xpipe/app/browser/FileListComp.java | 14 +- .../io/xpipe/app/browser/FileListModel.java | 11 +- .../xpipe/app/browser/FileSystemHelper.java | 16 +-- .../app/browser/OpenFileSystemModel.java | 4 +- .../app/browser/StandaloneFileBrowser.java | 59 +++++++++ .../java/io/xpipe/app/comp/AppLayoutComp.java | 11 +- .../io/xpipe/app/comp/base/MultiStepComp.java | 2 +- .../source/store/DsLocalFileBrowseComp.java | 46 +------ .../source/store/DsRemoteFileChoiceComp.java | 3 - .../source/store/DsStreamStoreChoiceComp.java | 4 +- .../main/java/io/xpipe/app/core/AppFont.java | 4 + .../app/fxcomps/impl/FileStoreChoiceComp.java | 57 +++----- .../impl/FileSystemStoreChoiceComp.java | 31 ++++- .../app/fxcomps/impl/PrettyImageComp.java | 21 +-- .../java/io/xpipe/app/prefs/AppPrefs.java | 2 +- .../app/prefs/ExternalApplicationType.java | 2 +- .../io/xpipe/app/update/AppInstaller.java | 2 +- .../xpipe/app/util/CustomComboBoxBuilder.java | 8 +- .../io/xpipe/app/util/DesktopShortcuts.java | 2 +- .../java/io/xpipe/app/util/FileOpener.java | 2 +- .../io/xpipe/app/util/MacOsPermissions.java | 2 +- .../java/io/xpipe/app/util/ScriptHelper.java | 2 +- app/src/main/java/module-info.java | 1 + .../io/xpipe/app/resources/style/browser.css | 15 +++ .../io/xpipe/app/resources/style/style.css | 2 +- .../java/io/xpipe/beacon/BeaconProxyImpl.java | 2 +- .../io/xpipe/core/charsetter/Charsetter.java | 4 +- .../java/io/xpipe/core/impl/LocalStore.java | 19 ++- .../core/store/ConnectionFileSystem.java | 11 +- .../java/io/xpipe/core/store/FileSystem.java | 2 + .../io/xpipe/core/store/MachineStore.java | 13 -- .../java/io/xpipe/core/store/ShellStore.java | 13 +- dist/changelogs/0.5.3.md | 1 + .../io/xpipe/ext/base/LocalStoreProvider.java | 2 +- .../xpipe/ext/base/MachineRootContainer.java | 18 --- .../ext/base/actions/StreamExportAction.java | 19 ++- version | 2 +- 40 files changed, 394 insertions(+), 231 deletions(-) create mode 100644 app/src/main/java/io/xpipe/app/browser/StandaloneFileBrowser.java delete mode 100644 core/src/main/java/io/xpipe/core/store/MachineStore.java create mode 100644 dist/changelogs/0.5.3.md delete mode 100644 ext/base/src/main/java/io/xpipe/ext/base/MachineRootContainer.java diff --git a/app/src/main/java/io/xpipe/app/browser/FileBrowserComp.java b/app/src/main/java/io/xpipe/app/browser/FileBrowserComp.java index 4bc7f70e..b7bd6516 100644 --- a/app/src/main/java/io/xpipe/app/browser/FileBrowserComp.java +++ b/app/src/main/java/io/xpipe/app/browser/FileBrowserComp.java @@ -1,22 +1,23 @@ package io.xpipe.app.browser; import atlantafx.base.controls.RingProgressIndicator; +import atlantafx.base.controls.Spacer; import atlantafx.base.theme.Styles; import io.xpipe.app.fxcomps.SimpleComp; import io.xpipe.app.fxcomps.impl.PrettyImageComp; import io.xpipe.app.fxcomps.util.PlatformThread; import io.xpipe.app.storage.DataStorage; +import io.xpipe.core.store.FileSystem; import javafx.beans.binding.Bindings; import javafx.collections.ListChangeListener; import javafx.event.EventHandler; +import javafx.geometry.Insets; +import javafx.geometry.Orientation; +import javafx.geometry.Pos; import javafx.scene.Node; -import javafx.scene.control.Label; -import javafx.scene.control.SplitPane; -import javafx.scene.control.Tab; -import javafx.scene.control.TabPane; +import javafx.scene.control.*; import javafx.scene.input.DragEvent; -import javafx.scene.layout.Region; -import javafx.scene.layout.StackPane; +import javafx.scene.layout.*; import java.util.HashMap; @@ -26,8 +27,6 @@ import static javafx.scene.control.TabPane.TabClosingPolicy.ALL_TABS; public class FileBrowserComp extends SimpleComp { - private static final double TAB_MIN_HEIGHT = 60; - private final FileBrowserModel model; public FileBrowserComp(FileBrowserModel model) { @@ -44,7 +43,40 @@ public class FileBrowserComp extends SimpleComp { // set sidebar width in pixels depending on split pane width (obs, old, val) -> splitPane.setDividerPosition(0, 230 / splitPane.getWidth())); - return splitPane; + return addBottomBar(splitPane); + } + + private Region addBottomBar(Region r) { + if (model.getMode().equals(FileBrowserModel.Mode.BROWSER)) { + return r; + } + + var selectedLabel = new Label("Selected: "); + selectedLabel.setAlignment(Pos.CENTER); + var selected = new HBox(); + selected.setAlignment(Pos.CENTER_LEFT); + selected.setSpacing(10); + model.getSelectedFiles().addListener((ListChangeListener) c -> { + selected.getChildren().setAll(c.getList().stream().map(s -> { + var field = new TextField(s.getPath()); + field.setEditable(false); + field.setPrefWidth(400); + return field; + }).toList()); + }); + var spacer = new Spacer(Orientation.HORIZONTAL); + var button = new Button("Select"); + button.setOnAction(event -> model.finishChooser()); + button.setDefaultButton(true); + var bottomBar = new HBox(selectedLabel, selected, spacer, button); + HBox.setHgrow(selected, Priority.ALWAYS); + bottomBar.setAlignment(Pos.CENTER); + bottomBar.setPadding(new Insets(15)); + bottomBar.getStyleClass().add("chooser-bar"); + + var layout = new VBox(r, bottomBar); + VBox.setVgrow(r, Priority.ALWAYS); + return layout; } private Node createTabs() { @@ -54,6 +86,15 @@ public class FileBrowserComp extends SimpleComp { var map = new HashMap(); + // Restore state + model.getOpenFileSystems().forEach(v -> { + var t = createTab(tabs, v); + map.put(v, t); + tabs.getTabs().add(t); + }); + tabs.getSelectionModel().select(model.getOpenFileSystems().indexOf(model.getSelected().getValue())); + + // Handle selection from platform tabs.getSelectionModel().selectedIndexProperty().addListener((observable, oldValue, newValue) -> { if (newValue.intValue() == -1) { model.getSelected().setValue(null); @@ -63,34 +104,29 @@ public class FileBrowserComp extends SimpleComp { model.getSelected().setValue(model.getOpenFileSystems().get(newValue.intValue())); }); - model.getOpenFileSystems().forEach(v -> { - var t = createTab(tabs, v); - map.put(v, t); - tabs.getTabs().add(t); - }); - if (model.getOpenFileSystems().size() > 0) { - tabs.getSelectionModel().select(0); - } - model.getOpenFileSystems().addListener((ListChangeListener) c -> { - PlatformThread.runLaterIfNeededBlocking(() -> { - while (c.next()) { - for (var r : c.getRemoved()) { + while (c.next()) { + for (var r : c.getRemoved()) { + PlatformThread.runLaterIfNeeded(() -> { var t = map.remove(r); tabs.getTabs().remove(t); - } + }); + } - for (var a : c.getAddedSubList()) { + for (var a : c.getAddedSubList()) { + PlatformThread.runLaterIfNeeded(() -> { var t = createTab(tabs, a); map.put(a, t); tabs.getTabs().add(t); - } + }); } - }); + } }); model.getSelected().addListener((observable, oldValue, newValue) -> { - tabs.getSelectionModel().select(model.getOpenFileSystems().indexOf(newValue)); + PlatformThread.runLaterIfNeeded(() -> { + tabs.getSelectionModel().select(model.getOpenFileSystems().indexOf(newValue)); + }); }); tabs.getTabs().addListener((ListChangeListener) c -> { @@ -100,7 +136,13 @@ public class FileBrowserComp extends SimpleComp { .filter(openFileSystemModelTabEntry -> openFileSystemModelTabEntry.getValue().equals(r)) .findAny() - .orElseThrow(); + .orElse(null); + + // Only handle close events that are triggered from the platform + if (source == null) { + continue; + } + model.closeFileSystem(source.getKey()); } } @@ -110,22 +152,20 @@ public class FileBrowserComp extends SimpleComp { return stack; } - private Node createSingular() { - var stack = - new StackPane(new OpenFileSystemComp(model.getOpenFileSystems().get(0)).createSimple()); - return stack; - } - private TabPane createTabPane() { var tabs = new TabPane(); tabs.setTabDragPolicy(TabPane.TabDragPolicy.REORDER); - tabs.setTabClosingPolicy(ALL_TABS); - Styles.toggleStyleClass(tabs, TabPane.STYLE_CLASS_FLOATING); - // tabs.setStyle("-fx-open-tab-animation:none;-fx-close-tab-animation:none;"); - toggleStyleClass(tabs, DENSE); - tabs.setMinHeight(TAB_MIN_HEIGHT); tabs.setTabMinWidth(Region.USE_COMPUTED_SIZE); + if (!model.getMode().equals(FileBrowserModel.Mode.BROWSER)) { + tabs.setTabClosingPolicy(TabPane.TabClosingPolicy.UNAVAILABLE); + tabs.getStyleClass().add("singular"); + } else { + tabs.setTabClosingPolicy(ALL_TABS); + Styles.toggleStyleClass(tabs, TabPane.STYLE_CLASS_FLOATING); + toggleStyleClass(tabs, DENSE); + } + return tabs; } @@ -180,6 +220,12 @@ public class FileBrowserComp extends SimpleComp { PlatformThread.sync(model.getBusy()))); tab.setGraphic(label); + + if (!this.model.getMode().equals(FileBrowserModel.Mode.BROWSER)) { + label.setManaged(false); + label.setVisible(false); + } + tab.setContent(new OpenFileSystemComp(model).createSimple()); return tab; } diff --git a/app/src/main/java/io/xpipe/app/browser/FileBrowserModel.java b/app/src/main/java/io/xpipe/app/browser/FileBrowserModel.java index 21cbf13d..f69b76b1 100644 --- a/app/src/main/java/io/xpipe/app/browser/FileBrowserModel.java +++ b/app/src/main/java/io/xpipe/app/browser/FileBrowserModel.java @@ -1,29 +1,88 @@ package io.xpipe.app.browser; import io.xpipe.app.util.ThreadHelper; +import io.xpipe.core.impl.FileStore; +import io.xpipe.core.store.FileSystem; import io.xpipe.core.store.ShellStore; import javafx.beans.property.Property; import javafx.beans.property.SimpleObjectProperty; import javafx.collections.FXCollections; import javafx.collections.ObservableList; import lombok.Getter; +import lombok.Setter; + +import java.util.List; +import java.util.Objects; +import java.util.function.Consumer; @Getter public class FileBrowserModel { - public static final FileBrowserModel DEFAULT = new FileBrowserModel(); + public FileBrowserModel(Mode mode) { + this.mode = mode; + } + + public static enum Mode { + BROWSER, + SINGLE_FILE_CHOOSER, + SINGLE_FILE_SAVE, + MULTIPLE_FILE_CHOOSER, + DIRECTORY_CHOOSER + } + + public static final FileBrowserModel DEFAULT = new FileBrowserModel(Mode.BROWSER); + + private final Mode mode; + private final ObservableList selectedFiles = FXCollections.observableArrayList(); + + @Setter + private Consumer> onFinish; private final ObservableList openFileSystems = FXCollections.observableArrayList(); private final Property selected = new SimpleObjectProperty<>(); + public void finishChooser() { + if (getMode().equals(Mode.BROWSER)) { + throw new IllegalStateException(); + } + + closeFileSystem(openFileSystems.get(0)); + + if (selectedFiles.size() == 0) { + return; + } + var stores = selectedFiles.stream().map(entry -> new FileStore(entry.getFileSystem().getStore(), entry.getPath())).toList(); + onFinish.accept(stores); + } + public void closeFileSystem(OpenFileSystemModel open) { ThreadHelper.runAsync(() -> { + if (Objects.equals(selected.getValue(), open)) { + selected.setValue(null); + } open.closeSync(); openFileSystems.remove(open); }); } public void openFileSystem(ShellStore store) { + // Prevent multiple tabs in non browser modes + if (!mode.equals(Mode.BROWSER)) { + ThreadHelper.runAsync(() -> { + var open = openFileSystems.size() > 0 ? openFileSystems.get(0) : null; + if (open != null) { + open.closeSync(); + openFileSystems.remove(open); + } + + var model = new OpenFileSystemModel(this); + openFileSystems.add(model); + selected.setValue(model); + model.switchAsync(store); + }); + return; + } + var found = openFileSystems.stream() .filter(fileSystemModel -> fileSystemModel.getStore().getValue().equals(store)) .findFirst(); @@ -32,7 +91,7 @@ public class FileBrowserModel { return; } - var model = new OpenFileSystemModel(); + var model = new OpenFileSystemModel(this); openFileSystems.add(model); selected.setValue(model); model.switchAsync(store); diff --git a/app/src/main/java/io/xpipe/app/browser/FileContextMenu.java b/app/src/main/java/io/xpipe/app/browser/FileContextMenu.java index 25b159d2..9683bb13 100644 --- a/app/src/main/java/io/xpipe/app/browser/FileContextMenu.java +++ b/app/src/main/java/io/xpipe/app/browser/FileContextMenu.java @@ -2,7 +2,10 @@ package io.xpipe.app.browser; +import io.xpipe.app.comp.source.GuiDsCreatorMultiStep; +import io.xpipe.app.ext.DataSourceProvider; import io.xpipe.app.util.*; +import io.xpipe.core.impl.FileStore; import io.xpipe.core.process.OsType; import io.xpipe.core.process.ShellProcessControl; import io.xpipe.core.store.FileSystem; @@ -103,6 +106,14 @@ final class FileContextMenu extends ContextMenu { getItems().add(open); } + var pipe = new MenuItem("Pipe"); + pipe.setOnAction(event -> { + var store = new FileStore(model.getFileSystem().getStore(), entry.getPath()); + GuiDsCreatorMultiStep.showForStore(DataSourceProvider.Category.STREAM, store, null); + event.consume(); + }); + getItems().add(pipe); + var edit = new MenuItem("Edit"); edit.setOnAction(event -> { FileOpener.openInTextEditor(entry); diff --git a/app/src/main/java/io/xpipe/app/browser/FileListComp.java b/app/src/main/java/io/xpipe/app/browser/FileListComp.java index fbe3cf68..db1ba04c 100644 --- a/app/src/main/java/io/xpipe/app/browser/FileListComp.java +++ b/app/src/main/java/io/xpipe/app/browser/FileListComp.java @@ -15,6 +15,7 @@ import io.xpipe.core.impl.FileNames; import io.xpipe.core.store.FileSystem; import javafx.beans.property.*; import javafx.beans.value.ChangeListener; +import javafx.collections.ListChangeListener; import javafx.css.PseudoClass; import javafx.geometry.Insets; import javafx.geometry.Pos; @@ -85,10 +86,19 @@ final class FileListComp extends AnchorPane { table.getColumns().setAll(filenameCol, sizeCol, mtimeCol); table.getSortOrder().add(filenameCol); table.setSortPolicy(param -> true); - table.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE); table.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY); filenameCol.minWidthProperty().bind(table.widthProperty().multiply(0.5)); + if (fileList.getMode().equals(FileBrowserModel.Mode.SINGLE_FILE_CHOOSER) || fileList.getMode().equals(FileBrowserModel.Mode.DIRECTORY_CHOOSER)) { + table.getSelectionModel().setSelectionMode(SelectionMode.SINGLE); + } else { + table.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE); + } + + table.getSelectionModel().getSelectedItems().addListener((ListChangeListener) c -> { + fileList.getModel().getBrowserModel().getSelectedFiles().setAll(c.getList()); + }); + var draggedOverDirectory = new SimpleBooleanProperty(); table.setOnKeyPressed(event -> { @@ -127,7 +137,7 @@ final class FileListComp extends AnchorPane { row.setOnMouseClicked(e -> { if (e.getClickCount() == 2 && !row.isEmpty()) { - fileList.onClick(row.getItem()); + fileList.onDoubleClick(row.getItem()); } }); diff --git a/app/src/main/java/io/xpipe/app/browser/FileListModel.java b/app/src/main/java/io/xpipe/app/browser/FileListModel.java index 2dd495a1..8489d350 100644 --- a/app/src/main/java/io/xpipe/app/browser/FileListModel.java +++ b/app/src/main/java/io/xpipe/app/browser/FileListModel.java @@ -41,6 +41,10 @@ final class FileListModel { }); } + public FileBrowserModel.Mode getMode() { + return model.getBrowserModel().getMode(); + } + public void setAll(List newFiles) { all.setValue(newFiles); refreshShown(); @@ -80,7 +84,12 @@ final class FileListModel { } } - public void onClick(FileSystem.FileEntry entry) { + public void onDoubleClick(FileSystem.FileEntry entry) { + if (!entry.isDirectory() && getMode().equals(FileBrowserModel.Mode.SINGLE_FILE_CHOOSER)) { + getModel().getBrowserModel().finishChooser(); + return; + } + if (entry.isDirectory()) { model.navigate(entry.getPath(), true); } else { diff --git a/app/src/main/java/io/xpipe/app/browser/FileSystemHelper.java b/app/src/main/java/io/xpipe/app/browser/FileSystemHelper.java index 69a4e9d0..37db1b28 100644 --- a/app/src/main/java/io/xpipe/app/browser/FileSystemHelper.java +++ b/app/src/main/java/io/xpipe/app/browser/FileSystemHelper.java @@ -2,9 +2,9 @@ package io.xpipe.app.browser; import io.xpipe.app.issue.ErrorEvent; import io.xpipe.core.impl.FileNames; +import io.xpipe.core.impl.LocalStore; import io.xpipe.core.process.OsType; import io.xpipe.core.store.FileSystem; -import io.xpipe.core.store.ShellStore; import java.nio.file.Files; import java.nio.file.Path; @@ -13,8 +13,6 @@ import java.util.List; public class FileSystemHelper { - private static OpenFileSystemModel local; - public static String normalizeDirectoryPath(OpenFileSystemModel model, String path) { if (path == null) { return null; @@ -37,19 +35,9 @@ public class FileSystemHelper { return FileNames.toDirectory(path); } - public static OpenFileSystemModel getLocal() throws Exception { - if (local == null) { - var model = new OpenFileSystemModel(); - model.switchFileSystem(ShellStore.local()); - local = model; - } - - return local; - } - public static FileSystem.FileEntry getLocal(Path file) throws Exception { return new FileSystem.FileEntry( - getLocal().getFileSystem(), + LocalStore.getFileSystem(), file.toString(), Files.getLastModifiedTime(file).toInstant(), Files.isDirectory(file), diff --git a/app/src/main/java/io/xpipe/app/browser/OpenFileSystemModel.java b/app/src/main/java/io/xpipe/app/browser/OpenFileSystemModel.java index 3be32062..67999b27 100644 --- a/app/src/main/java/io/xpipe/app/browser/OpenFileSystemModel.java +++ b/app/src/main/java/io/xpipe/app/browser/OpenFileSystemModel.java @@ -30,8 +30,10 @@ final class OpenFileSystemModel { private final ReadOnlyObjectWrapper currentPath = new ReadOnlyObjectWrapper<>(); private final FileBrowserNavigationHistory history = new FileBrowserNavigationHistory(); private final BooleanProperty busy = new SimpleBooleanProperty(); + private final FileBrowserModel browserModel; - public OpenFileSystemModel() { + public OpenFileSystemModel(FileBrowserModel browserModel) { + this.browserModel = browserModel; fileList = new FileListModel(this); } diff --git a/app/src/main/java/io/xpipe/app/browser/StandaloneFileBrowser.java b/app/src/main/java/io/xpipe/app/browser/StandaloneFileBrowser.java new file mode 100644 index 00000000..d42ab294 --- /dev/null +++ b/app/src/main/java/io/xpipe/app/browser/StandaloneFileBrowser.java @@ -0,0 +1,59 @@ +package io.xpipe.app.browser; + +import io.xpipe.app.core.AppFont; +import io.xpipe.app.core.AppI18n; +import io.xpipe.app.core.AppWindowHelper; +import io.xpipe.core.impl.FileStore; +import javafx.beans.property.Property; +import javafx.stage.FileChooser; +import javafx.stage.Window; + +import java.io.File; +import java.util.List; +import java.util.Map; + +public class StandaloneFileBrowser { + + public static void localOpenFileChooser(Property fileStoreProperty, Window owner, Map> extensions) { + FileChooser fileChooser = new FileChooser(); + fileChooser.setTitle(AppI18n.get("browseFileTitle")); + fileChooser.getExtensionFilters().add(new FileChooser.ExtensionFilter(AppI18n.get("anyFile"), "*")); + extensions.forEach((key, value) -> { + fileChooser + .getExtensionFilters() + .add(new FileChooser.ExtensionFilter( + key, value.stream().map(v -> "*." + v).toArray(String[]::new))); + }); + + File file = fileChooser.showOpenDialog(owner); + if (file != null && file.exists()) { + fileStoreProperty.setValue(FileStore.local(file.toPath())); + } + } + + public static void openSingleFile(Property file) { + var model = new FileBrowserModel(FileBrowserModel.Mode.SINGLE_FILE_CHOOSER); + var comp = new FileBrowserComp(model) + .apply(struc -> struc.get().setPrefSize(1200, 700)) + .apply(struc -> AppFont.normal(struc.get())); + var window = AppWindowHelper.sideWindow(AppI18n.get("openFileTitle"), stage -> comp, true, null); + model.setOnFinish(fileStores -> { + file.setValue(fileStores.size() > 0 ? fileStores.get(0) : null); + window.close(); + }); + window.show(); + } + + public static void saveSingleFile(Property file) { + var model = new FileBrowserModel(FileBrowserModel.Mode.SINGLE_FILE_SAVE); + var comp = new FileBrowserComp(model) + .apply(struc -> struc.get().setPrefSize(1200, 700)) + .apply(struc -> AppFont.normal(struc.get())); + var window = AppWindowHelper.sideWindow(AppI18n.get("saveFileTitle"), stage -> comp, true, null); + model.setOnFinish(fileStores -> { + file.setValue(fileStores.size() > 0 ? fileStores.get(0) : null); + window.close(); + }); + window.show(); + } +} diff --git a/app/src/main/java/io/xpipe/app/comp/AppLayoutComp.java b/app/src/main/java/io/xpipe/app/comp/AppLayoutComp.java index 4f9c5d7a..e7e85683 100644 --- a/app/src/main/java/io/xpipe/app/comp/AppLayoutComp.java +++ b/app/src/main/java/io/xpipe/app/comp/AppLayoutComp.java @@ -4,9 +4,11 @@ import io.xpipe.app.browser.FileBrowserComp; import io.xpipe.app.browser.FileBrowserModel; import io.xpipe.app.comp.about.AboutTabComp; import io.xpipe.app.comp.base.SideMenuBarComp; -import io.xpipe.app.comp.storage.collection.SourceCollectionLayoutComp; import io.xpipe.app.comp.storage.store.StoreLayoutComp; -import io.xpipe.app.core.*; +import io.xpipe.app.core.AppActionLinkDetector; +import io.xpipe.app.core.AppFont; +import io.xpipe.app.core.AppI18n; +import io.xpipe.app.core.AppProperties; import io.xpipe.app.fxcomps.Comp; import io.xpipe.app.fxcomps.CompStructure; import io.xpipe.app.fxcomps.SimpleCompStructure; @@ -28,9 +30,6 @@ public class AppLayoutComp extends Comp> { private final Property selected; public AppLayoutComp() { - var firstTime = AppCache.get("firstTimeLayout", Boolean.class, () -> true); - AppCache.update("firstTimeLayout", false); - entries = createEntryList(); selected = new SimpleObjectProperty<>(entries.get(0)); @@ -44,7 +43,7 @@ public class AppLayoutComp extends Comp> { var l = new ArrayList<>(List.of( new SideMenuBarComp.Entry(AppI18n.observable("connections"), "mdi2c-connection", new StoreLayoutComp()), new SideMenuBarComp.Entry(AppI18n.observable("browser"), "mdi2f-file-cabinet", new FileBrowserComp(FileBrowserModel.DEFAULT)), - new SideMenuBarComp.Entry(AppI18n.observable("data"), "mdsal-dvr", new SourceCollectionLayoutComp()), + //new SideMenuBarComp.Entry(AppI18n.observable("data"), "mdsal-dvr", new SourceCollectionLayoutComp()), new SideMenuBarComp.Entry( AppI18n.observable("settings"), "mdsmz-miscellaneous_services", new PrefsComp(this)), // new SideMenuBarComp.Entry(AppI18n.observable("help"), "mdi2b-book-open-variant", new diff --git a/app/src/main/java/io/xpipe/app/comp/base/MultiStepComp.java b/app/src/main/java/io/xpipe/app/comp/base/MultiStepComp.java index 545d0ac9..a0d06b5f 100644 --- a/app/src/main/java/io/xpipe/app/comp/base/MultiStepComp.java +++ b/app/src/main/java/io/xpipe/app/comp/base/MultiStepComp.java @@ -214,7 +214,7 @@ public abstract class MultiStepComp extends Comp> { buttons.setAlignment(Pos.CENTER_RIGHT); var nextText = Bindings.createStringBinding( () -> isLastPage() ? AppI18n.get("finishStep") : AppI18n.get("nextStep"), currentStep); - var nextButton = new ButtonComp(nextText, null, comp::next).styleClass("next"); + var nextButton = new ButtonComp(nextText, null, comp::next).apply(struc -> struc.get().setDefaultButton(true)).styleClass("next"); var previousButton = new ButtonComp(AppI18n.observable("previousStep"), null, comp::previous) .styleClass("next") diff --git a/app/src/main/java/io/xpipe/app/comp/source/store/DsLocalFileBrowseComp.java b/app/src/main/java/io/xpipe/app/comp/source/store/DsLocalFileBrowseComp.java index d26b5a78..4f3854e4 100644 --- a/app/src/main/java/io/xpipe/app/comp/source/store/DsLocalFileBrowseComp.java +++ b/app/src/main/java/io/xpipe/app/comp/source/store/DsLocalFileBrowseComp.java @@ -1,5 +1,6 @@ package io.xpipe.app.comp.source.store; +import io.xpipe.app.browser.StandaloneFileBrowser; import io.xpipe.app.comp.base.ButtonComp; import io.xpipe.app.core.AppI18n; import io.xpipe.app.ext.DataSourceProvider; @@ -9,34 +10,29 @@ import io.xpipe.app.fxcomps.SimpleCompStructure; import io.xpipe.app.fxcomps.util.PlatformThread; import io.xpipe.app.util.JfxHelper; import io.xpipe.core.impl.FileStore; -import io.xpipe.core.store.DataStore; import javafx.beans.property.Property; import javafx.beans.value.ObservableValue; import javafx.scene.control.Button; import javafx.scene.layout.Region; -import javafx.stage.FileChooser; import lombok.AllArgsConstructor; -import java.io.File; import java.util.concurrent.atomic.AtomicReference; @AllArgsConstructor public class DsLocalFileBrowseComp extends Comp> { private final ObservableValue> provider; - private final Property chosenFile; + private final Property chosenFile; private final DsStreamStoreChoiceComp.Mode mode; @Override public CompStructure