From bcdf8e098b8e27d127abb8ff84c7305f274fda07 Mon Sep 17 00:00:00 2001 From: crschnick Date: Thu, 7 Nov 2024 19:26:59 +0000 Subject: [PATCH] Refactor and cleanup --- .../impl/ConnectionBrowseExchangeImpl.java | 4 +- .../beacon/impl/DaemonOpenExchangeImpl.java | 2 +- .../BrowserAbstractSessionModel.java | 2 +- ...ava => BrowserFileChooserSessionComp.java} | 36 +-- ...va => BrowserFileChooserSessionModel.java} | 24 +- ...nComp.java => BrowserFullSessionComp.java} | 34 +-- ...odel.java => BrowserFullSessionModel.java} | 41 ++-- .../{session => }/BrowserSessionTab.java | 6 +- .../{session => }/BrowserSessionTabsComp.java | 22 +- .../{session => }/BrowserStoreSessionTab.java | 4 +- .../app/browser/action/BrowserAction.java | 28 +-- ...java => BrowserApplicationPathAction.java} | 8 +- ...chAction.java => BrowserBranchAction.java} | 8 +- ...LeafAction.java => BrowserLeafAction.java} | 14 +- .../{ => file}/BrowserBreadcrumbBar.java | 11 +- .../browser/{ => file}/BrowserClipboard.java | 7 +- .../BrowserConnectionListComp.java} | 14 +- .../BrowserConnectionListFilterComp.java} | 10 +- .../app/browser/file/BrowserContextMenu.java | 5 +- .../app/browser/file/BrowserFileListComp.java | 211 +++--------------- .../file/BrowserFileListCompEntry.java | 10 +- .../BrowserFileListFilterComp.java} | 17 +- .../browser/file/BrowserFileListModel.java | 7 +- .../browser/file/BrowserFileListNameCell.java | 174 +++++++++++++++ .../browser/{ => file}/BrowserFileOpener.java | 11 +- .../browser/file/BrowserFileOverviewComp.java | 11 +- .../BrowserFileSelectionListComp.java} | 19 +- .../BrowserFileSystemCache.java} | 8 +- ...lper.java => BrowserFileSystemHelper.java} | 11 +- .../BrowserFileSystemHistory.java} | 4 +- .../BrowserFileSystemSavedState.java} | 34 +-- .../BrowserFileSystemTabComp.java} | 30 +-- .../BrowserFileSystemTabModel.java} | 44 ++-- .../file/BrowserFileTransferOperation.java | 3 +- .../{ => file}/BrowserGreetingComp.java | 6 +- .../BrowserHistorySavedState.java} | 4 +- .../BrowserHistorySavedStateImpl.java} | 28 +-- .../BrowserHistoryTabComp.java} | 32 +-- .../BrowserHistoryTabModel.java} | 18 +- ...ystem.java => BrowserLocalFileSystem.java} | 2 +- .../BrowserNavBarComp.java} | 118 +++++----- .../{ => file}/BrowserOverviewComp.java | 14 +- .../file/BrowserQuickAccessButtonComp.java | 9 +- .../file/BrowserQuickAccessContextMenu.java | 11 +- .../{ => file}/BrowserStatusBarComp.java | 21 +- .../BrowserTerminalDockTabModel.java | 13 +- .../{ => file}/BrowserTransferComp.java | 25 ++- .../{ => file}/BrowserTransferModel.java | 21 +- .../{ => file}/BrowserTransferProgress.java | 2 +- .../icon/BrowserIconDirectoryType.java | 6 +- .../app/browser/icon/BrowserIconFileType.java | 4 +- ...onManager.java => BrowserIconManager.java} | 2 +- ...onVariant.java => BrowserIconVariant.java} | 6 +- .../xpipe/app/browser/icon/BrowserIcons.java | 6 +- .../io/xpipe/app/{fxcomps => comp}/Comp.java | 12 +- .../app/{fxcomps => comp}/CompStructure.java | 2 +- .../io/xpipe/app/comp/DeveloperTabComp.java | 59 ----- .../io/xpipe/app/{fxcomps => comp}/README.md | 0 .../app/{fxcomps => comp}/SimpleComp.java | 2 +- .../SimpleCompStructure.java | 2 +- .../{fxcomps => comp}/augment/Augment.java | 6 +- .../augment/ContextMenuAugment.java | 4 +- .../augment/GrowAugment.java | 4 +- .../impl => comp/base}/AnchorComp.java | 8 +- .../app/comp/{ => base}/AppLayoutComp.java | 11 +- .../app/comp/base/BackgroundImageComp.java | 62 ----- .../io/xpipe/app/comp/base/BigIconButton.java | 66 ------ .../io/xpipe/app/comp/base/ButtonComp.java | 8 +- .../impl => comp/base}/ChoiceComp.java | 10 +- .../impl => comp/base}/ChoicePaneComp.java | 10 +- .../base}/ComboTextFieldComp.java | 10 +- .../ContextualFileReferenceChoiceComp.java | 13 +- .../io/xpipe/app/comp/base/CountComp.java | 8 +- .../io/xpipe/app/comp/base/DialogComp.java | 6 +- .../io/xpipe/app/comp/base/DropdownComp.java | 8 +- .../xpipe/app/comp/base/ErrorOverlayComp.java | 6 +- .../app/comp/base/FileDropOverlayComp.java | 4 +- .../impl => comp/base}/FilterComp.java | 10 +- .../io/xpipe/app/comp/base/FontIconComp.java | 6 +- .../impl => comp/base}/GrowPaneComp.java | 8 +- .../impl => comp/base}/HorizontalComp.java | 8 +- .../impl => comp/base}/IconButtonComp.java | 12 +- .../impl => comp/base}/IntComboFieldComp.java | 10 +- .../impl => comp/base}/IntFieldComp.java | 10 +- .../app/comp/base/IntegratedTextAreaComp.java | 6 +- .../impl => comp/base}/LabelComp.java | 10 +- .../app/comp/base/LazyTextFieldComp.java | 8 +- .../app/comp/base/LeftSplitPaneComp.java | 4 +- .../xpipe/app/comp/base/ListBoxViewComp.java | 10 +- .../xpipe/app/comp/base/ListSelectorComp.java | 2 +- .../app/comp/base/LoadingOverlayComp.java | 8 +- .../io/xpipe/app/comp/base/MarkdownComp.java | 8 +- .../app/comp/base/MarkdownEditorComp.java | 5 +- .../xpipe/app/comp/base/ModalOverlayComp.java | 6 +- .../xpipe/app/comp/base/MultiContentComp.java | 6 +- .../impl => comp/base}/OptionsComp.java | 11 +- .../app/comp/base/PopupMenuButtonComp.java | 4 +- .../impl => comp/base}/PrettyImageComp.java | 6 +- .../impl => comp/base}/PrettyImageHelper.java | 6 +- .../impl => comp/base}/PrettySvgComp.java | 6 +- .../impl => comp/base}/ScrollComp.java | 8 +- .../impl => comp/base}/SecretFieldComp.java | 9 +- .../xpipe/app/comp/base/SideMenuBarComp.java | 11 +- .../app/comp/base/SimpleTitledPaneComp.java | 6 +- .../impl => comp/base}/StackComp.java | 8 +- .../impl => comp/base}/SvgHelper.java | 2 +- .../{fxcomps/impl => comp/base}/SvgView.java | 6 +- .../impl => comp/base}/TextAreaComp.java | 8 +- .../impl => comp/base}/TextFieldComp.java | 10 +- .../xpipe/app/comp/base/TileButtonComp.java | 6 +- .../xpipe/app/comp/base/TitledPaneComp.java | 6 +- .../impl => comp/base}/ToggleGroupComp.java | 10 +- .../xpipe/app/comp/base/ToggleSwitchComp.java | 6 +- .../impl => comp/base}/TooltipAugment.java | 8 +- .../io/xpipe/app/comp/base/VBoxViewComp.java | 8 +- .../impl => comp/base}/VerticalComp.java | 10 +- .../app/comp/store/DenseStoreEntryComp.java | 6 +- .../app/comp/{base => store}/OsLogoComp.java | 11 +- .../comp/store/StandardStoreEntryComp.java | 2 +- .../xpipe/app/comp/store/StoreActiveComp.java | 4 +- .../store}/StoreCategoryComp.java | 19 +- .../store}/StoreCategoryListComp.java | 6 +- .../app/comp/store/StoreCategoryWrapper.java | 2 +- .../store/StoreChoiceComp.java} | 24 +- .../app/comp/store/StoreCreationComp.java | 6 +- .../app/comp/store/StoreCreationMenu.java | 2 +- .../xpipe/app/comp/store/StoreEntryComp.java | 22 +- .../app/comp/store/StoreEntryListComp.java | 4 +- .../store/StoreEntryListOverviewComp.java | 12 +- .../app/comp/store/StoreEntryWrapper.java | 2 +- .../app/comp/store/StoreIconChoiceComp.java | 4 +- .../comp/store/StoreIconChoiceDialogComp.java | 8 +- .../xpipe/app/comp/store/StoreIconComp.java | 6 +- .../xpipe/app/comp/store/StoreIntroComp.java | 4 +- .../xpipe/app/comp/store/StoreLayoutComp.java | 2 +- .../store/StoreListChoiceComp.java} | 17 +- .../app/comp/store/StoreNotFoundComp.java | 2 +- .../xpipe/app/comp/store/StoreNotesComp.java | 8 +- .../comp/store/StoreProviderChoiceComp.java | 6 +- .../store/StoreQuickAccessButtonComp.java | 10 +- .../app/comp/store/StoreScriptsIntroComp.java | 2 +- .../io/xpipe/app/comp/store/StoreSection.java | 6 +- .../app/comp/store/StoreSectionComp.java | 14 +- .../app/comp/store/StoreSectionMiniComp.java | 14 +- .../app/comp/store/StoreSidebarComp.java | 7 +- .../comp/{base => store}/StoreToggleComp.java | 9 +- .../xpipe/app/comp/store/StoreViewState.java | 4 +- .../comp/{base => store}/SystemStateComp.java | 9 +- app/src/main/java/io/xpipe/app/core/App.java | 4 +- .../xpipe/app/core/AppActionLinkDetector.java | 2 +- .../xpipe/app/core/AppDesktopIntegration.java | 2 +- .../java/io/xpipe/app/core/AppGreetings.java | 2 +- .../main/java/io/xpipe/app/core/AppI18n.java | 2 +- .../io/xpipe/app/core/AppLayoutModel.java | 11 +- .../main/java/io/xpipe/app/core/AppLogs.java | 3 +- .../java/io/xpipe/app/core/AppProperties.java | 11 +- .../main/java/io/xpipe/app/core/AppTheme.java | 2 +- .../{ => core}/launcher/LauncherCommand.java | 2 +- .../{ => core}/launcher/LauncherInput.java | 6 +- .../launcher/LauncherModeConverter.java | 2 +- .../java/io/xpipe/app/core/mode/BaseMode.java | 4 +- .../java/io/xpipe/app/core/mode/GuiMode.java | 12 +- .../io/xpipe/app/core/mode/OperationMode.java | 4 +- .../java/io/xpipe/app/core/mode/TrayMode.java | 2 +- .../xpipe/app/core/window/AppMainWindow.java | 2 +- .../app/core/window/AppWindowHelper.java | 2 +- .../xpipe/app/core/window/ModifiedStage.java | 2 +- .../io/xpipe/app/ext/DataStoreProvider.java | 6 +- .../app/ext/EnabledParentStoreProvider.java | 4 +- .../main/java/io/xpipe/app/ext/GuiDialog.java | 2 +- .../java/io/xpipe/app/ext/PrefsHandler.java | 2 +- .../ext/SingletonSessionStoreProvider.java | 8 +- .../augment/DragOverPseudoClassAugment.java | 25 --- .../app/fxcomps/augment/DraggableAugment.java | 47 ---- .../app/fxcomps/impl/CharChoiceComp.java | 46 ---- .../io/xpipe/app/fxcomps/impl/CharComp.java | 35 --- .../xpipe/app/fxcomps/impl/CodeSnippet.java | 126 ----------- .../app/fxcomps/impl/CodeSnippetComp.java | 128 ----------- .../io/xpipe/app/fxcomps/impl/PaneComp.java | 28 --- .../io/xpipe/app/issue/ErrorDetailsComp.java | 4 +- .../io/xpipe/app/issue/ErrorHandlerComp.java | 6 +- .../io/xpipe/app/issue/UserReportComp.java | 4 +- .../io/xpipe/app/prefs/AboutCategory.java | 6 +- .../java/io/xpipe/app/prefs/AppPrefs.java | 8 +- .../io/xpipe/app/prefs/AppPrefsCategory.java | 2 +- .../java/io/xpipe/app/prefs/AppPrefsComp.java | 4 +- .../xpipe/app/prefs/AppPrefsSidebarComp.java | 9 +- .../xpipe/app/prefs/AppearanceCategory.java | 8 +- .../io/xpipe/app/prefs/DeveloperCategory.java | 6 +- .../io/xpipe/app/prefs/EditorCategory.java | 8 +- .../io/xpipe/app/prefs/HttpApiCategory.java | 2 +- .../xpipe/app/prefs/LocalShellCategory.java | 2 +- .../io/xpipe/app/prefs/LockChangeAlert.java | 4 +- .../io/xpipe/app/prefs/LoggingCategory.java | 3 +- .../app/prefs/PasswordManagerCategory.java | 12 +- .../java/io/xpipe/app/prefs/RdpCategory.java | 6 +- .../io/xpipe/app/prefs/SecurityCategory.java | 2 +- .../java/io/xpipe/app/prefs/SshCategory.java | 2 +- .../java/io/xpipe/app/prefs/SyncCategory.java | 7 +- .../io/xpipe/app/prefs/SystemCategory.java | 4 +- .../io/xpipe/app/prefs/TerminalCategory.java | 10 +- .../prefs/ThirdPartyDependencyListComp.java | 6 +- .../xpipe/app/prefs/TroubleshootCategory.java | 2 +- .../io/xpipe/app/prefs/UpdateCheckComp.java | 4 +- .../io/xpipe/app/prefs/VaultCategory.java | 3 +- .../io/xpipe/app/prefs/WorkflowCategory.java | 2 +- .../xpipe/app/prefs/WorkspacesCategory.java | 2 +- .../xpipe/app/terminal/TerminalDockComp.java | 2 +- .../io/xpipe/app/update/HomebrewUpdater.java | 52 ----- .../app/update/XPipeDistributionType.java | 5 +- .../java/io/xpipe/app/util/AskpassAlert.java | 2 +- .../java/io/xpipe/app/util/AsktextAlert.java | 2 +- .../{fxcomps => }/util/BindingsHelper.java | 4 +- .../io/xpipe/app/util/ClipboardHelper.java | 1 - .../io/xpipe/app/util/ContextMenuHelper.java | 2 - .../app/util/DataStoreCategoryChoiceComp.java | 3 +- .../util/DerivedObservableList.java | 2 +- .../xpipe/app/util/DiscreteProgressScope.java | 19 -- .../java/io/xpipe/app/util/JfxHelper.java | 2 +- .../app/{fxcomps => }/util/LabelGraphic.java | 6 +- .../io/xpipe/app/util/LicenseProvider.java | 2 +- .../io/xpipe/app/util/OptionsBuilder.java | 5 +- .../{fxcomps => }/util/PlatformThread.java | 3 +- .../java/io/xpipe/app/util/ProgressScope.java | 2 - .../java/io/xpipe/app/util/ScanDialog.java | 8 +- .../util/SecretRetrievalStrategyHelper.java | 6 +- .../io/xpipe/app/util/ShellStoreFormat.java | 1 - .../java/io/xpipe/app/util/XPipeSession.java | 37 --- app/src/main/java/module-info.java | 8 +- .../ext/base/action/BrowseStoreAction.java | 4 +- .../io/xpipe/ext/base/browser/BackAction.java | 16 +- .../browser/BrowseInNativeManagerAction.java | 12 +- .../xpipe/ext/base/browser/ChgrpAction.java | 24 +- .../xpipe/ext/base/browser/ChmodAction.java | 22 +- .../xpipe/ext/base/browser/ChownAction.java | 24 +- .../io/xpipe/ext/base/browser/CopyAction.java | 14 +- .../ext/base/browser/CopyPathAction.java | 56 ++--- .../xpipe/ext/base/browser/DeleteAction.java | 16 +- .../ext/base/browser/DeleteLinkAction.java | 18 +- .../ext/base/browser/EditFileAction.java | 18 +- .../browser/ExecuteApplicationAction.java | 12 +- .../ext/base/browser/FileTypeAction.java | 6 +- .../ext/base/browser/FollowLinkAction.java | 14 +- .../xpipe/ext/base/browser/ForwardAction.java | 16 +- .../io/xpipe/ext/base/browser/JarAction.java | 8 +- .../io/xpipe/ext/base/browser/JavaAction.java | 4 +- .../xpipe/ext/base/browser/JavapAction.java | 8 +- .../ext/base/browser/MultiExecuteAction.java | 26 +-- .../browser/MultiExecuteSelectionAction.java | 26 +-- .../xpipe/ext/base/browser/NewItemAction.java | 44 ++-- .../ext/base/browser/OpenDirectoryAction.java | 14 +- .../browser/OpenDirectoryInNewTabAction.java | 20 +- .../base/browser/OpenFileDefaultAction.java | 16 +- .../ext/base/browser/OpenFileWithAction.java | 16 +- .../browser/OpenNativeFileDetailsAction.java | 12 +- .../ext/base/browser/OpenTerminalAction.java | 22 +- .../xpipe/ext/base/browser/PasteAction.java | 18 +- .../base/browser/RefreshDirectoryAction.java | 16 +- .../xpipe/ext/base/browser/RenameAction.java | 14 +- .../io/xpipe/ext/base/browser/RunAction.java | 10 +- .../ext/base/browser/ToFileCommandAction.java | 12 +- .../browser/compress/BaseCompressAction.java | 50 ++--- .../browser/compress/BaseUntarAction.java | 16 +- .../browser/compress/BaseUnzipUnixAction.java | 10 +- .../compress/BaseUnzipWindowsAction.java | 16 +- .../DesktopApplicationStoreProvider.java | 10 +- .../desktop/DesktopCommandStoreProvider.java | 10 +- .../DesktopEnvironmentStoreProvider.java | 18 +- .../ext/base/script/RunScriptAction.java | 44 ++-- .../base/script/ScriptGroupStoreProvider.java | 10 +- .../script/SimpleScriptStoreProvider.java | 14 +- .../AbstractServiceGroupStoreProvider.java | 6 +- .../service/AbstractServiceStoreProvider.java | 4 +- .../service/CustomServiceStoreProvider.java | 4 +- .../ext/base/store/ShellStoreProvider.java | 12 +- lang/app/strings/translations_en.properties | 3 +- 276 files changed, 1464 insertions(+), 2256 deletions(-) rename app/src/main/java/io/xpipe/app/browser/{session => }/BrowserAbstractSessionModel.java (97%) rename app/src/main/java/io/xpipe/app/browser/{session/BrowserChooserComp.java => BrowserFileChooserSessionComp.java} (85%) rename app/src/main/java/io/xpipe/app/browser/{session/BrowserFileChooserModel.java => BrowserFileChooserSessionModel.java} (77%) rename app/src/main/java/io/xpipe/app/browser/{session/BrowserSessionComp.java => BrowserFullSessionComp.java} (90%) rename app/src/main/java/io/xpipe/app/browser/{session/BrowserSessionModel.java => BrowserFullSessionModel.java} (82%) rename app/src/main/java/io/xpipe/app/browser/{session => }/BrowserSessionTab.java (86%) rename app/src/main/java/io/xpipe/app/browser/{session => }/BrowserSessionTabsComp.java (96%) rename app/src/main/java/io/xpipe/app/browser/{session => }/BrowserStoreSessionTab.java (93%) rename app/src/main/java/io/xpipe/app/browser/action/{ApplicationPathAction.java => BrowserApplicationPathAction.java} (56%) rename app/src/main/java/io/xpipe/app/browser/action/{BranchAction.java => BrowserBranchAction.java} (76%) rename app/src/main/java/io/xpipe/app/browser/action/{LeafAction.java => BrowserLeafAction.java} (87%) rename app/src/main/java/io/xpipe/app/browser/{ => file}/BrowserBreadcrumbBar.java (91%) rename app/src/main/java/io/xpipe/app/browser/{ => file}/BrowserClipboard.java (94%) rename app/src/main/java/io/xpipe/app/browser/{BrowserBookmarkComp.java => file/BrowserConnectionListComp.java} (92%) rename app/src/main/java/io/xpipe/app/browser/{BrowserBookmarkHeaderComp.java => file/BrowserConnectionListFilterComp.java} (89%) rename app/src/main/java/io/xpipe/app/browser/{BrowserFilterComp.java => file/BrowserFileListFilterComp.java} (89%) create mode 100644 app/src/main/java/io/xpipe/app/browser/file/BrowserFileListNameCell.java rename app/src/main/java/io/xpipe/app/browser/{ => file}/BrowserFileOpener.java (91%) rename app/src/main/java/io/xpipe/app/browser/{BrowserSelectionListComp.java => file/BrowserFileSelectionListComp.java} (83%) rename app/src/main/java/io/xpipe/app/browser/{fs/OpenFileSystemCache.java => file/BrowserFileSystemCache.java} (92%) rename app/src/main/java/io/xpipe/app/browser/file/{FileSystemHelper.java => BrowserFileSystemHelper.java} (89%) rename app/src/main/java/io/xpipe/app/browser/{fs/OpenFileSystemHistory.java => file/BrowserFileSystemHistory.java} (96%) rename app/src/main/java/io/xpipe/app/browser/{fs/OpenFileSystemSavedState.java => file/BrowserFileSystemSavedState.java} (80%) rename app/src/main/java/io/xpipe/app/browser/{fs/OpenFileSystemComp.java => file/BrowserFileSystemTabComp.java} (89%) rename app/src/main/java/io/xpipe/app/browser/{fs/OpenFileSystemModel.java => file/BrowserFileSystemTabModel.java} (91%) rename app/src/main/java/io/xpipe/app/browser/{ => file}/BrowserGreetingComp.java (90%) rename app/src/main/java/io/xpipe/app/browser/{BrowserSavedState.java => file/BrowserHistorySavedState.java} (83%) rename app/src/main/java/io/xpipe/app/browser/{BrowserSavedStateImpl.java => file/BrowserHistorySavedStateImpl.java} (67%) rename app/src/main/java/io/xpipe/app/browser/{BrowserWelcomeComp.java => file/BrowserHistoryTabComp.java} (88%) rename app/src/main/java/io/xpipe/app/browser/{BrowserHomeTabModel.java => file/BrowserHistoryTabModel.java} (51%) rename app/src/main/java/io/xpipe/app/browser/file/{LocalFileSystem.java => BrowserLocalFileSystem.java} (97%) rename app/src/main/java/io/xpipe/app/browser/{BrowserNavBar.java => file/BrowserNavBarComp.java} (90%) rename app/src/main/java/io/xpipe/app/browser/{ => file}/BrowserOverviewComp.java (88%) rename app/src/main/java/io/xpipe/app/browser/{ => file}/BrowserStatusBarComp.java (91%) rename app/src/main/java/io/xpipe/app/browser/{ => file}/BrowserTerminalDockTabModel.java (90%) rename app/src/main/java/io/xpipe/app/browser/{ => file}/BrowserTransferComp.java (90%) rename app/src/main/java/io/xpipe/app/browser/{ => file}/BrowserTransferModel.java (89%) rename app/src/main/java/io/xpipe/app/browser/{ => file}/BrowserTransferProgress.java (96%) rename app/src/main/java/io/xpipe/app/browser/icon/{FileIconManager.java => BrowserIconManager.java} (96%) rename app/src/main/java/io/xpipe/app/browser/icon/{IconVariant.java => BrowserIconVariant.java} (77%) rename app/src/main/java/io/xpipe/app/{fxcomps => comp}/Comp.java (95%) rename app/src/main/java/io/xpipe/app/{fxcomps => comp}/CompStructure.java (77%) delete mode 100644 app/src/main/java/io/xpipe/app/comp/DeveloperTabComp.java rename app/src/main/java/io/xpipe/app/{fxcomps => comp}/README.md (100%) rename app/src/main/java/io/xpipe/app/{fxcomps => comp}/SimpleComp.java (90%) rename app/src/main/java/io/xpipe/app/{fxcomps => comp}/SimpleCompStructure.java (90%) rename app/src/main/java/io/xpipe/app/{fxcomps => comp}/augment/Augment.java (68%) rename app/src/main/java/io/xpipe/app/{fxcomps => comp}/augment/ContextMenuAugment.java (97%) rename app/src/main/java/io/xpipe/app/{fxcomps => comp}/augment/GrowAugment.java (97%) rename app/src/main/java/io/xpipe/app/{fxcomps/impl => comp/base}/AnchorComp.java (77%) rename app/src/main/java/io/xpipe/app/comp/{ => base}/AppLayoutComp.java (90%) delete mode 100644 app/src/main/java/io/xpipe/app/comp/base/BackgroundImageComp.java delete mode 100644 app/src/main/java/io/xpipe/app/comp/base/BigIconButton.java rename app/src/main/java/io/xpipe/app/{fxcomps/impl => comp/base}/ChoiceComp.java (93%) rename app/src/main/java/io/xpipe/app/{fxcomps/impl => comp/base}/ChoicePaneComp.java (93%) rename app/src/main/java/io/xpipe/app/{fxcomps/impl => comp/base}/ComboTextFieldComp.java (90%) rename app/src/main/java/io/xpipe/app/{fxcomps/impl => comp/base}/ContextualFileReferenceChoiceComp.java (95%) rename app/src/main/java/io/xpipe/app/{fxcomps/impl => comp/base}/FilterComp.java (93%) rename app/src/main/java/io/xpipe/app/{fxcomps/impl => comp/base}/GrowPaneComp.java (78%) rename app/src/main/java/io/xpipe/app/{fxcomps/impl => comp/base}/HorizontalComp.java (82%) rename app/src/main/java/io/xpipe/app/{fxcomps/impl => comp/base}/IconButtonComp.java (89%) rename app/src/main/java/io/xpipe/app/{fxcomps/impl => comp/base}/IntComboFieldComp.java (92%) rename app/src/main/java/io/xpipe/app/{fxcomps/impl => comp/base}/IntFieldComp.java (92%) rename app/src/main/java/io/xpipe/app/{fxcomps/impl => comp/base}/LabelComp.java (78%) rename app/src/main/java/io/xpipe/app/{fxcomps/impl => comp/base}/OptionsComp.java (96%) rename app/src/main/java/io/xpipe/app/{fxcomps/impl => comp/base}/PrettyImageComp.java (97%) rename app/src/main/java/io/xpipe/app/{fxcomps/impl => comp/base}/PrettyImageHelper.java (95%) rename app/src/main/java/io/xpipe/app/{fxcomps/impl => comp/base}/PrettySvgComp.java (97%) rename app/src/main/java/io/xpipe/app/{fxcomps/impl => comp/base}/ScrollComp.java (90%) rename app/src/main/java/io/xpipe/app/{fxcomps/impl => comp/base}/SecretFieldComp.java (94%) rename app/src/main/java/io/xpipe/app/{fxcomps/impl => comp/base}/StackComp.java (79%) rename app/src/main/java/io/xpipe/app/{fxcomps/impl => comp/base}/SvgHelper.java (97%) rename app/src/main/java/io/xpipe/app/{fxcomps/impl => comp/base}/SvgView.java (97%) rename app/src/main/java/io/xpipe/app/{fxcomps/impl => comp/base}/TextAreaComp.java (95%) rename app/src/main/java/io/xpipe/app/{fxcomps/impl => comp/base}/TextFieldComp.java (91%) rename app/src/main/java/io/xpipe/app/{fxcomps/impl => comp/base}/ToggleGroupComp.java (92%) rename app/src/main/java/io/xpipe/app/{fxcomps/impl => comp/base}/TooltipAugment.java (91%) rename app/src/main/java/io/xpipe/app/{fxcomps/impl => comp/base}/VerticalComp.java (84%) rename app/src/main/java/io/xpipe/app/comp/{base => store}/OsLogoComp.java (91%) rename app/src/main/java/io/xpipe/app/{fxcomps/impl => comp/store}/StoreCategoryComp.java (95%) rename app/src/main/java/io/xpipe/app/{fxcomps/impl => comp/store}/StoreCategoryListComp.java (88%) rename app/src/main/java/io/xpipe/app/{fxcomps/impl/DataStoreChoiceComp.java => comp/store/StoreChoiceComp.java} (92%) rename app/src/main/java/io/xpipe/app/{fxcomps/impl/DataStoreListChoiceComp.java => comp/store/StoreListChoiceComp.java} (85%) rename app/src/main/java/io/xpipe/app/comp/{base => store}/StoreToggleComp.java (96%) rename app/src/main/java/io/xpipe/app/comp/{base => store}/SystemStateComp.java (93%) rename app/src/main/java/io/xpipe/app/{ => core}/launcher/LauncherCommand.java (99%) rename app/src/main/java/io/xpipe/app/{ => core}/launcher/LauncherInput.java (95%) rename app/src/main/java/io/xpipe/app/{ => core}/launcher/LauncherModeConverter.java (88%) delete mode 100644 app/src/main/java/io/xpipe/app/fxcomps/augment/DragOverPseudoClassAugment.java delete mode 100644 app/src/main/java/io/xpipe/app/fxcomps/augment/DraggableAugment.java delete mode 100644 app/src/main/java/io/xpipe/app/fxcomps/impl/CharChoiceComp.java delete mode 100644 app/src/main/java/io/xpipe/app/fxcomps/impl/CharComp.java delete mode 100644 app/src/main/java/io/xpipe/app/fxcomps/impl/CodeSnippet.java delete mode 100644 app/src/main/java/io/xpipe/app/fxcomps/impl/CodeSnippetComp.java delete mode 100644 app/src/main/java/io/xpipe/app/fxcomps/impl/PaneComp.java delete mode 100644 app/src/main/java/io/xpipe/app/update/HomebrewUpdater.java rename app/src/main/java/io/xpipe/app/{fxcomps => }/util/BindingsHelper.java (96%) rename app/src/main/java/io/xpipe/app/{fxcomps => }/util/DerivedObservableList.java (99%) delete mode 100644 app/src/main/java/io/xpipe/app/util/DiscreteProgressScope.java rename app/src/main/java/io/xpipe/app/{fxcomps => }/util/LabelGraphic.java (92%) rename app/src/main/java/io/xpipe/app/{fxcomps => }/util/PlatformThread.java (99%) delete mode 100644 app/src/main/java/io/xpipe/app/util/XPipeSession.java diff --git a/app/src/main/java/io/xpipe/app/beacon/impl/ConnectionBrowseExchangeImpl.java b/app/src/main/java/io/xpipe/app/beacon/impl/ConnectionBrowseExchangeImpl.java index 35dfe1600..5624122a1 100644 --- a/app/src/main/java/io/xpipe/app/beacon/impl/ConnectionBrowseExchangeImpl.java +++ b/app/src/main/java/io/xpipe/app/beacon/impl/ConnectionBrowseExchangeImpl.java @@ -1,6 +1,6 @@ package io.xpipe.app.beacon.impl; -import io.xpipe.app.browser.session.BrowserSessionModel; +import io.xpipe.app.browser.BrowserFullSessionModel; import io.xpipe.app.core.AppLayoutModel; import io.xpipe.app.storage.DataStorage; import io.xpipe.beacon.BeaconClientException; @@ -19,7 +19,7 @@ public class ConnectionBrowseExchangeImpl extends ConnectionBrowseExchange { if (!(e.getStore() instanceof FileSystemStore)) { throw new BeaconClientException("Not a file system connection"); } - BrowserSessionModel.DEFAULT.openFileSystemSync( + BrowserFullSessionModel.DEFAULT.openFileSystemSync( e.ref(), msg.getDirectory() != null ? ignored -> msg.getDirectory() : null, null, true); AppLayoutModel.get().selectBrowser(); return Response.builder().build(); diff --git a/app/src/main/java/io/xpipe/app/beacon/impl/DaemonOpenExchangeImpl.java b/app/src/main/java/io/xpipe/app/beacon/impl/DaemonOpenExchangeImpl.java index a8bf0df51..b4585264c 100644 --- a/app/src/main/java/io/xpipe/app/beacon/impl/DaemonOpenExchangeImpl.java +++ b/app/src/main/java/io/xpipe/app/beacon/impl/DaemonOpenExchangeImpl.java @@ -1,7 +1,7 @@ package io.xpipe.app.beacon.impl; import io.xpipe.app.core.mode.OperationMode; -import io.xpipe.app.launcher.LauncherInput; +import io.xpipe.app.core.launcher.LauncherInput; import io.xpipe.app.util.PlatformState; import io.xpipe.beacon.BeaconServerException; import io.xpipe.beacon.api.DaemonOpenExchange; diff --git a/app/src/main/java/io/xpipe/app/browser/session/BrowserAbstractSessionModel.java b/app/src/main/java/io/xpipe/app/browser/BrowserAbstractSessionModel.java similarity index 97% rename from app/src/main/java/io/xpipe/app/browser/session/BrowserAbstractSessionModel.java rename to app/src/main/java/io/xpipe/app/browser/BrowserAbstractSessionModel.java index 3414c19fd..86fcb3816 100644 --- a/app/src/main/java/io/xpipe/app/browser/session/BrowserAbstractSessionModel.java +++ b/app/src/main/java/io/xpipe/app/browser/BrowserAbstractSessionModel.java @@ -1,4 +1,4 @@ -package io.xpipe.app.browser.session; +package io.xpipe.app.browser; import io.xpipe.app.util.BooleanScope; import io.xpipe.app.util.ThreadHelper; diff --git a/app/src/main/java/io/xpipe/app/browser/session/BrowserChooserComp.java b/app/src/main/java/io/xpipe/app/browser/BrowserFileChooserSessionComp.java similarity index 85% rename from app/src/main/java/io/xpipe/app/browser/session/BrowserChooserComp.java rename to app/src/main/java/io/xpipe/app/browser/BrowserFileChooserSessionComp.java index 000b9f223..ce419eea3 100644 --- a/app/src/main/java/io/xpipe/app/browser/session/BrowserChooserComp.java +++ b/app/src/main/java/io/xpipe/app/browser/BrowserFileChooserSessionComp.java @@ -1,21 +1,21 @@ -package io.xpipe.app.browser.session; +package io.xpipe.app.browser; -import io.xpipe.app.browser.BrowserBookmarkComp; -import io.xpipe.app.browser.BrowserBookmarkHeaderComp; +import io.xpipe.app.browser.file.BrowserConnectionListComp; +import io.xpipe.app.browser.file.BrowserConnectionListFilterComp; import io.xpipe.app.browser.file.BrowserEntry; -import io.xpipe.app.browser.fs.OpenFileSystemComp; -import io.xpipe.app.browser.fs.OpenFileSystemModel; +import io.xpipe.app.browser.file.BrowserFileSystemTabComp; +import io.xpipe.app.browser.file.BrowserFileSystemTabModel; import io.xpipe.app.comp.base.DialogComp; import io.xpipe.app.comp.base.LeftSplitPaneComp; import io.xpipe.app.comp.store.StoreEntryWrapper; import io.xpipe.app.core.AppFont; import io.xpipe.app.core.AppLayoutModel; import io.xpipe.app.ext.ShellStore; -import io.xpipe.app.fxcomps.Comp; -import io.xpipe.app.fxcomps.impl.StackComp; -import io.xpipe.app.fxcomps.impl.VerticalComp; -import io.xpipe.app.fxcomps.util.BindingsHelper; -import io.xpipe.app.fxcomps.util.PlatformThread; +import io.xpipe.app.comp.Comp; +import io.xpipe.app.comp.base.StackComp; +import io.xpipe.app.comp.base.VerticalComp; +import io.xpipe.app.util.BindingsHelper; +import io.xpipe.app.util.PlatformThread; import io.xpipe.app.storage.DataStoreEntryRef; import io.xpipe.app.util.FileReference; import io.xpipe.app.util.ThreadHelper; @@ -37,12 +37,12 @@ import java.util.function.Consumer; import java.util.function.Predicate; import java.util.function.Supplier; -public class BrowserChooserComp extends DialogComp { +public class BrowserFileChooserSessionComp extends DialogComp { private final Stage stage; - private final BrowserFileChooserModel model; + private final BrowserFileChooserSessionModel model; - public BrowserChooserComp(Stage stage, BrowserFileChooserModel model) { + public BrowserFileChooserSessionComp(Stage stage, BrowserFileChooserSessionModel model) { this.stage = stage; this.model = model; } @@ -50,9 +50,9 @@ public class BrowserChooserComp extends DialogComp { public static void openSingleFile( Supplier> store, Consumer file, boolean save) { PlatformThread.runLaterIfNeeded(() -> { - var model = new BrowserFileChooserModel(OpenFileSystemModel.SelectionMode.SINGLE_FILE); + var model = new BrowserFileChooserSessionModel(BrowserFileSystemTabModel.SelectionMode.SINGLE_FILE); DialogComp.showWindow(save ? "saveFileTitle" : "openFileTitle", stage -> { - var comp = new BrowserChooserComp(stage, model); + var comp = new BrowserFileChooserSessionComp(stage, model); comp.apply(struc -> struc.get().setPrefSize(1200, 700)) .apply(struc -> AppFont.normal(struc.get())) .styleClass("browser") @@ -114,8 +114,8 @@ public class BrowserChooserComp extends DialogComp { }); }; - var bookmarkTopBar = new BrowserBookmarkHeaderComp(); - var bookmarksList = new BrowserBookmarkComp( + var bookmarkTopBar = new BrowserConnectionListFilterComp(); + var bookmarksList = new BrowserConnectionListComp( BindingsHelper.map(model.getSelectedEntry(), v -> v.getEntry().get()), applicable, action, @@ -138,7 +138,7 @@ public class BrowserChooserComp extends DialogComp { model.getSelectedEntry().subscribe(selected -> { PlatformThread.runLaterIfNeeded(() -> { if (selected != null) { - s.getChildren().setAll(new OpenFileSystemComp(selected, false).createRegion()); + s.getChildren().setAll(new BrowserFileSystemTabComp(selected, false).createRegion()); } else { s.getChildren().clear(); } diff --git a/app/src/main/java/io/xpipe/app/browser/session/BrowserFileChooserModel.java b/app/src/main/java/io/xpipe/app/browser/BrowserFileChooserSessionModel.java similarity index 77% rename from app/src/main/java/io/xpipe/app/browser/session/BrowserFileChooserModel.java rename to app/src/main/java/io/xpipe/app/browser/BrowserFileChooserSessionModel.java index 162fe3c6d..d5e49c99e 100644 --- a/app/src/main/java/io/xpipe/app/browser/session/BrowserFileChooserModel.java +++ b/app/src/main/java/io/xpipe/app/browser/BrowserFileChooserSessionModel.java @@ -1,8 +1,8 @@ -package io.xpipe.app.browser.session; +package io.xpipe.app.browser; import io.xpipe.app.browser.file.BrowserEntry; -import io.xpipe.app.browser.fs.OpenFileSystemModel; -import io.xpipe.app.fxcomps.util.DerivedObservableList; +import io.xpipe.app.browser.file.BrowserFileSystemTabModel; +import io.xpipe.app.util.DerivedObservableList; import io.xpipe.app.storage.DataStoreEntryRef; import io.xpipe.app.util.BooleanScope; import io.xpipe.app.util.FileReference; @@ -24,15 +24,15 @@ import java.util.List; import java.util.function.Consumer; @Getter -public class BrowserFileChooserModel extends BrowserAbstractSessionModel { +public class BrowserFileChooserSessionModel extends BrowserAbstractSessionModel { - private final OpenFileSystemModel.SelectionMode selectionMode; + private final BrowserFileSystemTabModel.SelectionMode selectionMode; private final ObservableList fileSelection = FXCollections.observableArrayList(); @Setter private Consumer> onFinish; - public BrowserFileChooserModel(OpenFileSystemModel.SelectionMode selectionMode) { + public BrowserFileChooserSessionModel(BrowserFileSystemTabModel.SelectionMode selectionMode) { this.selectionMode = selectionMode; selectedEntry.addListener((observable, oldValue, newValue) -> { if (newValue == null) { @@ -48,7 +48,7 @@ public class BrowserFileChooserModel extends BrowserAbstractSessionModel(fileSelection); - synchronized (BrowserFileChooserModel.this) { + synchronized (BrowserFileChooserSessionModel.this) { var open = selectedEntry.getValue(); if (open != null) { ThreadHelper.runAsync(() -> { @@ -66,7 +66,7 @@ public class BrowserFileChooserModel extends BrowserAbstractSessionModel { @@ -78,20 +78,20 @@ public class BrowserFileChooserModel extends BrowserAbstractSessionModel store, - FailableFunction path, + FailableFunction path, BooleanProperty externalBusy) { if (store == null) { return; } ThreadHelper.runFailableAsync(() -> { - OpenFileSystemModel model; + BrowserFileSystemTabModel model; try (var b = new BooleanScope(externalBusy != null ? externalBusy : new SimpleBooleanProperty()).start()) { - model = new OpenFileSystemModel(this, store, selectionMode); + model = new BrowserFileSystemTabModel(this, store, selectionMode); model.init(); // Prevent multiple calls from interfering with each other - synchronized (BrowserFileChooserModel.this) { + synchronized (BrowserFileChooserSessionModel.this) { selectedEntry.setValue(model); sessionEntries.add(model); } diff --git a/app/src/main/java/io/xpipe/app/browser/session/BrowserSessionComp.java b/app/src/main/java/io/xpipe/app/browser/BrowserFullSessionComp.java similarity index 90% rename from app/src/main/java/io/xpipe/app/browser/session/BrowserSessionComp.java rename to app/src/main/java/io/xpipe/app/browser/BrowserFullSessionComp.java index e763c075a..13d40a424 100644 --- a/app/src/main/java/io/xpipe/app/browser/session/BrowserSessionComp.java +++ b/app/src/main/java/io/xpipe/app/browser/BrowserFullSessionComp.java @@ -1,21 +1,21 @@ -package io.xpipe.app.browser.session; +package io.xpipe.app.browser; -import io.xpipe.app.browser.BrowserBookmarkComp; -import io.xpipe.app.browser.BrowserBookmarkHeaderComp; -import io.xpipe.app.browser.BrowserTransferComp; +import io.xpipe.app.browser.file.BrowserConnectionListComp; +import io.xpipe.app.browser.file.BrowserConnectionListFilterComp; +import io.xpipe.app.browser.file.BrowserTransferComp; import io.xpipe.app.comp.base.LoadingOverlayComp; import io.xpipe.app.comp.base.LeftSplitPaneComp; import io.xpipe.app.comp.store.StoreEntryWrapper; import io.xpipe.app.core.AppLayoutModel; import io.xpipe.app.ext.ShellStore; -import io.xpipe.app.fxcomps.Comp; -import io.xpipe.app.fxcomps.CompStructure; -import io.xpipe.app.fxcomps.SimpleComp; -import io.xpipe.app.fxcomps.impl.AnchorComp; -import io.xpipe.app.fxcomps.impl.StackComp; -import io.xpipe.app.fxcomps.impl.VerticalComp; -import io.xpipe.app.fxcomps.util.BindingsHelper; -import io.xpipe.app.fxcomps.util.PlatformThread; +import io.xpipe.app.comp.Comp; +import io.xpipe.app.comp.CompStructure; +import io.xpipe.app.comp.SimpleComp; +import io.xpipe.app.comp.base.AnchorComp; +import io.xpipe.app.comp.base.StackComp; +import io.xpipe.app.comp.base.VerticalComp; +import io.xpipe.app.util.BindingsHelper; +import io.xpipe.app.util.PlatformThread; import io.xpipe.app.util.ThreadHelper; import javafx.application.Platform; @@ -33,11 +33,11 @@ import java.util.List; import java.util.function.BiConsumer; import java.util.function.Predicate; -public class BrowserSessionComp extends SimpleComp { +public class BrowserFullSessionComp extends SimpleComp { - private final BrowserSessionModel model; + private final BrowserFullSessionModel model; - public BrowserSessionComp(BrowserSessionModel model) { + public BrowserFullSessionComp(BrowserFullSessionModel model) { this.model = model; } @@ -129,8 +129,8 @@ public class BrowserSessionComp extends SimpleComp { }); }; - var bookmarkTopBar = new BrowserBookmarkHeaderComp(); - var bookmarksList = new BrowserBookmarkComp( + var bookmarkTopBar = new BrowserConnectionListFilterComp(); + var bookmarksList = new BrowserConnectionListComp( BindingsHelper.map( model.getSelectedEntry(), v -> v instanceof BrowserStoreSessionTab st diff --git a/app/src/main/java/io/xpipe/app/browser/session/BrowserSessionModel.java b/app/src/main/java/io/xpipe/app/browser/BrowserFullSessionModel.java similarity index 82% rename from app/src/main/java/io/xpipe/app/browser/session/BrowserSessionModel.java rename to app/src/main/java/io/xpipe/app/browser/BrowserFullSessionModel.java index 3fdb7dc14..ae57fb3c9 100644 --- a/app/src/main/java/io/xpipe/app/browser/session/BrowserSessionModel.java +++ b/app/src/main/java/io/xpipe/app/browser/BrowserFullSessionModel.java @@ -1,11 +1,10 @@ -package io.xpipe.app.browser.session; +package io.xpipe.app.browser; -import io.xpipe.app.browser.BrowserHomeTabModel; -import io.xpipe.app.browser.BrowserSavedState; -import io.xpipe.app.browser.BrowserSavedStateImpl; -import io.xpipe.app.browser.BrowserTransferModel; -import io.xpipe.app.browser.fs.OpenFileSystemModel; -import io.xpipe.app.fxcomps.util.BindingsHelper; +import io.xpipe.app.browser.file.BrowserHistoryTabModel; +import io.xpipe.app.browser.file.BrowserHistorySavedState; +import io.xpipe.app.browser.file.BrowserHistorySavedStateImpl; +import io.xpipe.app.browser.file.BrowserTransferModel; +import io.xpipe.app.browser.file.BrowserFileSystemTabModel; import io.xpipe.app.storage.DataStorage; import io.xpipe.app.storage.DataStoreEntryRef; import io.xpipe.app.util.BooleanScope; @@ -27,12 +26,12 @@ import lombok.Getter; import java.util.*; @Getter -public class BrowserSessionModel extends BrowserAbstractSessionModel { +public class BrowserFullSessionModel extends BrowserAbstractSessionModel { - public static final BrowserSessionModel DEFAULT = new BrowserSessionModel(); + public static final BrowserFullSessionModel DEFAULT = new BrowserFullSessionModel(); static { - DEFAULT.getSessionEntries().add(new BrowserHomeTabModel(DEFAULT)); + DEFAULT.getSessionEntries().add(new BrowserHistoryTabModel(DEFAULT)); } private final BrowserTransferModel localTransfersStage = new BrowserTransferModel(this); @@ -66,7 +65,7 @@ public class BrowserSessionModel extends BrowserAbstractSessionModel) c -> { var v = globalPinnedTab.getValue(); if (v != null && !c.getList().contains(v)) { @@ -125,7 +124,7 @@ public class BrowserSessionModel extends BrowserAbstractSessionModel { var l = new ArrayList<>(state.getEntries()); l.forEach(e -> { @@ -136,7 +135,7 @@ public class BrowserSessionModel extends BrowserAbstractSessionModel { openFileSystemAsync(entry.ref(), model -> e.getPath(), busy); @@ -144,7 +143,7 @@ public class BrowserSessionModel extends BrowserAbstractSessionModel(sessionEntries); for (var o : all) { // Don't close busy connections gracefully @@ -156,7 +155,7 @@ public class BrowserSessionModel extends BrowserAbstractSessionModel store, - FailableFunction path, + FailableFunction path, BooleanProperty externalBusy) { if (store == null) { return; @@ -176,19 +175,19 @@ public class BrowserSessionModel extends BrowserAbstractSessionModel store, - FailableFunction path, + FailableFunction path, BooleanProperty externalBusy, boolean select) throws Exception { - OpenFileSystemModel model; + BrowserFileSystemTabModel model; try (var b = new BooleanScope(externalBusy != null ? externalBusy : new SimpleBooleanProperty()).start()) { try (var sessionBusy = new BooleanScope(busy).exclusive().start()) { - model = new OpenFileSystemModel(this, store, OpenFileSystemModel.SelectionMode.ALL); + model = new BrowserFileSystemTabModel(this, store, BrowserFileSystemTabModel.SelectionMode.ALL); model.init(); // Prevent multiple calls from interfering with each other - synchronized (BrowserSessionModel.this) { + synchronized (BrowserFullSessionModel.this) { sessionEntries.add(model); if (select) { // The tab pane doesn't automatically select new tabs diff --git a/app/src/main/java/io/xpipe/app/browser/session/BrowserSessionTab.java b/app/src/main/java/io/xpipe/app/browser/BrowserSessionTab.java similarity index 86% rename from app/src/main/java/io/xpipe/app/browser/session/BrowserSessionTab.java rename to app/src/main/java/io/xpipe/app/browser/BrowserSessionTab.java index 970229093..13426b34d 100644 --- a/app/src/main/java/io/xpipe/app/browser/session/BrowserSessionTab.java +++ b/app/src/main/java/io/xpipe/app/browser/BrowserSessionTab.java @@ -1,6 +1,6 @@ -package io.xpipe.app.browser.session; +package io.xpipe.app.browser; -import io.xpipe.app.fxcomps.Comp; +import io.xpipe.app.comp.Comp; import io.xpipe.app.storage.DataColor; import javafx.beans.property.BooleanProperty; @@ -8,8 +8,6 @@ import javafx.beans.property.Property; import javafx.beans.property.SimpleBooleanProperty; import javafx.beans.property.SimpleObjectProperty; -import javafx.beans.value.ObservableDoubleValue; -import javafx.beans.value.ObservableValue; import lombok.Getter; @Getter diff --git a/app/src/main/java/io/xpipe/app/browser/session/BrowserSessionTabsComp.java b/app/src/main/java/io/xpipe/app/browser/BrowserSessionTabsComp.java similarity index 96% rename from app/src/main/java/io/xpipe/app/browser/session/BrowserSessionTabsComp.java rename to app/src/main/java/io/xpipe/app/browser/BrowserSessionTabsComp.java index 1482eb3e4..dbb2bf148 100644 --- a/app/src/main/java/io/xpipe/app/browser/session/BrowserSessionTabsComp.java +++ b/app/src/main/java/io/xpipe/app/browser/BrowserSessionTabsComp.java @@ -1,12 +1,11 @@ -package io.xpipe.app.browser.session; +package io.xpipe.app.browser; import io.xpipe.app.core.AppI18n; -import io.xpipe.app.fxcomps.Comp; -import io.xpipe.app.fxcomps.SimpleComp; -import io.xpipe.app.fxcomps.impl.PrettyImageHelper; -import io.xpipe.app.fxcomps.impl.TooltipAugment; -import io.xpipe.app.fxcomps.util.LabelGraphic; -import io.xpipe.app.fxcomps.util.PlatformThread; +import io.xpipe.app.comp.Comp; +import io.xpipe.app.comp.SimpleComp; +import io.xpipe.app.comp.base.PrettyImageHelper; +import io.xpipe.app.util.LabelGraphic; +import io.xpipe.app.util.PlatformThread; import io.xpipe.app.prefs.AppPrefs; import io.xpipe.app.util.BooleanScope; import io.xpipe.app.util.ContextMenuHelper; @@ -16,9 +15,7 @@ import javafx.beans.binding.Bindings; import javafx.beans.property.DoubleProperty; import javafx.beans.property.SimpleBooleanProperty; import javafx.beans.property.SimpleDoubleProperty; -import javafx.beans.property.SimpleStringProperty; import javafx.beans.value.ObservableDoubleValue; -import javafx.beans.value.ObservableValue; import javafx.collections.ListChangeListener; import javafx.css.PseudoClass; import javafx.geometry.Insets; @@ -34,7 +31,6 @@ import atlantafx.base.theme.Styles; import lombok.Getter; import java.util.*; -import java.util.concurrent.atomic.AtomicReference; import static atlantafx.base.theme.Styles.DENSE; import static atlantafx.base.theme.Styles.toggleStyleClass; @@ -42,14 +38,14 @@ import static javafx.scene.control.TabPane.TabClosingPolicy.ALL_TABS; public class BrowserSessionTabsComp extends SimpleComp { - private final BrowserSessionModel model; + private final BrowserFullSessionModel model; private final ObservableDoubleValue leftPadding; private final DoubleProperty rightPadding; @Getter private final DoubleProperty headerHeight; - public BrowserSessionTabsComp(BrowserSessionModel model, ObservableDoubleValue leftPadding, DoubleProperty rightPadding) { + public BrowserSessionTabsComp(BrowserFullSessionModel model, ObservableDoubleValue leftPadding, DoubleProperty rightPadding) { this.model = model; this.leftPadding = leftPadding; this.rightPadding = rightPadding; @@ -398,7 +394,7 @@ public class BrowserSessionTabsComp extends SimpleComp { PlatformThread.sync(tabModel.getBusy()))); } - if (tabModel.getBrowserModel() instanceof BrowserSessionModel sessionModel) { + if (tabModel.getBrowserModel() instanceof BrowserFullSessionModel sessionModel) { var global = PlatformThread.sync(sessionModel.getGlobalPinnedTab()); tab.textProperty().bind(Bindings.createStringBinding(() -> { return tabModel.getName() + (global.getValue() == tabModel ? " (" + AppI18n.get("pinned") + ")" : ""); diff --git a/app/src/main/java/io/xpipe/app/browser/session/BrowserStoreSessionTab.java b/app/src/main/java/io/xpipe/app/browser/BrowserStoreSessionTab.java similarity index 93% rename from app/src/main/java/io/xpipe/app/browser/session/BrowserStoreSessionTab.java rename to app/src/main/java/io/xpipe/app/browser/BrowserStoreSessionTab.java index 286e1ddb7..defa1b213 100644 --- a/app/src/main/java/io/xpipe/app/browser/session/BrowserStoreSessionTab.java +++ b/app/src/main/java/io/xpipe/app/browser/BrowserStoreSessionTab.java @@ -1,6 +1,6 @@ -package io.xpipe.app.browser.session; +package io.xpipe.app.browser; -import io.xpipe.app.fxcomps.Comp; +import io.xpipe.app.comp.Comp; import io.xpipe.app.storage.DataColor; import io.xpipe.app.storage.DataStorage; import io.xpipe.app.storage.DataStoreEntryRef; diff --git a/app/src/main/java/io/xpipe/app/browser/action/BrowserAction.java b/app/src/main/java/io/xpipe/app/browser/action/BrowserAction.java index 839283793..4ab2c2ef0 100644 --- a/app/src/main/java/io/xpipe/app/browser/action/BrowserAction.java +++ b/app/src/main/java/io/xpipe/app/browser/action/BrowserAction.java @@ -1,7 +1,7 @@ package io.xpipe.app.browser.action; import io.xpipe.app.browser.file.BrowserEntry; -import io.xpipe.app.browser.fs.OpenFileSystemModel; +import io.xpipe.app.browser.file.BrowserFileSystemTabModel; import io.xpipe.app.issue.ErrorEvent; import io.xpipe.core.util.ModuleLayerLoader; @@ -18,25 +18,25 @@ public interface BrowserAction { List ALL = new ArrayList<>(); - static List getFlattened(OpenFileSystemModel model, List entries) { + static List getFlattened(BrowserFileSystemTabModel model, List entries) { return ALL.stream() .map(browserAction -> getFlattened(browserAction, model, entries)) .flatMap(List::stream) .toList(); } - static List getFlattened( - BrowserAction browserAction, OpenFileSystemModel model, List entries) { - return browserAction instanceof LeafAction - ? List.of((LeafAction) browserAction) - : ((BranchAction) browserAction) + static List getFlattened( + BrowserAction browserAction, BrowserFileSystemTabModel model, List entries) { + return browserAction instanceof BrowserLeafAction + ? List.of((BrowserLeafAction) browserAction) + : ((BrowserBranchAction) browserAction) .getBranchingActions(model, entries).stream() .map(action -> getFlattened(action, model, entries)) .flatMap(List::stream) .toList(); } - static LeafAction byId(String id, OpenFileSystemModel model, List entries) { + static BrowserLeafAction byId(String id, BrowserFileSystemTabModel model, List entries) { return getFlattened(model, entries).stream() .filter(browserAction -> id.equals(browserAction.getId())) .findAny() @@ -52,15 +52,15 @@ public interface BrowserAction { : selected; } - MenuItem toMenuItem(OpenFileSystemModel model, List selected); + MenuItem toMenuItem(BrowserFileSystemTabModel model, List selected); - default void init(OpenFileSystemModel model) throws Exception {} + default void init(BrowserFileSystemTabModel model) throws Exception {} default String getProFeatureId() { return null; } - default Node getIcon(OpenFileSystemModel model, List entries) { + default Node getIcon(BrowserFileSystemTabModel model, List entries) { return null; } @@ -76,9 +76,9 @@ public interface BrowserAction { return false; } - ObservableValue getName(OpenFileSystemModel model, List entries); + ObservableValue getName(BrowserFileSystemTabModel model, List entries); - default boolean isApplicable(OpenFileSystemModel model, List entries) { + default boolean isApplicable(BrowserFileSystemTabModel model, List entries) { return true; } @@ -86,7 +86,7 @@ public interface BrowserAction { return true; } - default boolean isActive(OpenFileSystemModel model, List entries) { + default boolean isActive(BrowserFileSystemTabModel model, List entries) { return true; } diff --git a/app/src/main/java/io/xpipe/app/browser/action/ApplicationPathAction.java b/app/src/main/java/io/xpipe/app/browser/action/BrowserApplicationPathAction.java similarity index 56% rename from app/src/main/java/io/xpipe/app/browser/action/ApplicationPathAction.java rename to app/src/main/java/io/xpipe/app/browser/action/BrowserApplicationPathAction.java index 45c5f3e20..5a5c9b572 100644 --- a/app/src/main/java/io/xpipe/app/browser/action/ApplicationPathAction.java +++ b/app/src/main/java/io/xpipe/app/browser/action/BrowserApplicationPathAction.java @@ -1,22 +1,22 @@ package io.xpipe.app.browser.action; import io.xpipe.app.browser.file.BrowserEntry; -import io.xpipe.app.browser.fs.OpenFileSystemModel; +import io.xpipe.app.browser.file.BrowserFileSystemTabModel; import java.util.List; -public interface ApplicationPathAction extends BrowserAction { +public interface BrowserApplicationPathAction extends BrowserAction { String getExecutable(); @Override - default void init(OpenFileSystemModel model) { + default void init(BrowserFileSystemTabModel model) { // Cache result for later calls model.getCache().isApplicationInPath(getExecutable()); } @Override - default boolean isActive(OpenFileSystemModel model, List entries) { + default boolean isActive(BrowserFileSystemTabModel model, List entries) { return model.getCache().isApplicationInPath(getExecutable()); } } diff --git a/app/src/main/java/io/xpipe/app/browser/action/BranchAction.java b/app/src/main/java/io/xpipe/app/browser/action/BrowserBranchAction.java similarity index 76% rename from app/src/main/java/io/xpipe/app/browser/action/BranchAction.java rename to app/src/main/java/io/xpipe/app/browser/action/BrowserBranchAction.java index b30222c62..cf2900cd6 100644 --- a/app/src/main/java/io/xpipe/app/browser/action/BranchAction.java +++ b/app/src/main/java/io/xpipe/app/browser/action/BrowserBranchAction.java @@ -1,7 +1,7 @@ package io.xpipe.app.browser.action; import io.xpipe.app.browser.file.BrowserEntry; -import io.xpipe.app.browser.fs.OpenFileSystemModel; +import io.xpipe.app.browser.file.BrowserFileSystemTabModel; import io.xpipe.app.util.LicenseProvider; import javafx.scene.control.Menu; @@ -11,9 +11,9 @@ import org.kordamp.ikonli.javafx.FontIcon; import java.util.List; -public interface BranchAction extends BrowserAction { +public interface BrowserBranchAction extends BrowserAction { - default MenuItem toMenuItem(OpenFileSystemModel model, List selected) { + default MenuItem toMenuItem(BrowserFileSystemTabModel model, List selected) { var m = new Menu(getName(model, selected).getValue() + " ..."); for (var sub : getBranchingActions(model, selected)) { var subselected = resolveFilesIfNeeded(selected); @@ -37,5 +37,5 @@ public interface BranchAction extends BrowserAction { return m; } - List getBranchingActions(OpenFileSystemModel model, List entries); + List getBranchingActions(BrowserFileSystemTabModel model, List entries); } diff --git a/app/src/main/java/io/xpipe/app/browser/action/LeafAction.java b/app/src/main/java/io/xpipe/app/browser/action/BrowserLeafAction.java similarity index 87% rename from app/src/main/java/io/xpipe/app/browser/action/LeafAction.java rename to app/src/main/java/io/xpipe/app/browser/action/BrowserLeafAction.java index cdd107920..75bbdac93 100644 --- a/app/src/main/java/io/xpipe/app/browser/action/LeafAction.java +++ b/app/src/main/java/io/xpipe/app/browser/action/BrowserLeafAction.java @@ -1,9 +1,9 @@ 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.browser.file.BrowserFileSystemTabModel; +import io.xpipe.app.comp.base.TooltipAugment; +import io.xpipe.app.util.BindingsHelper; import io.xpipe.app.util.BooleanScope; import io.xpipe.app.util.LicenseProvider; import io.xpipe.app.util.ThreadHelper; @@ -17,11 +17,11 @@ import org.kordamp.ikonli.javafx.FontIcon; import java.util.List; -public interface LeafAction extends BrowserAction { +public interface BrowserLeafAction extends BrowserAction { - void execute(OpenFileSystemModel model, List entries) throws Exception; + void execute(BrowserFileSystemTabModel model, List entries) throws Exception; - default Button toButton(Region root, OpenFileSystemModel model, List selected) { + default Button toButton(Region root, BrowserFileSystemTabModel model, List selected) { var b = new Button(); b.setOnAction(event -> { ThreadHelper.runFailableAsync(() -> { @@ -66,7 +66,7 @@ public interface LeafAction extends BrowserAction { return b; } - default MenuItem toMenuItem(OpenFileSystemModel model, List selected) { + default MenuItem toMenuItem(BrowserFileSystemTabModel model, List selected) { var name = getName(model, selected); var mi = new MenuItem(); mi.textProperty().bind(BindingsHelper.map(name, s -> { diff --git a/app/src/main/java/io/xpipe/app/browser/BrowserBreadcrumbBar.java b/app/src/main/java/io/xpipe/app/browser/file/BrowserBreadcrumbBar.java similarity index 91% rename from app/src/main/java/io/xpipe/app/browser/BrowserBreadcrumbBar.java rename to app/src/main/java/io/xpipe/app/browser/file/BrowserBreadcrumbBar.java index 6b31779af..f6406a6cf 100644 --- a/app/src/main/java/io/xpipe/app/browser/BrowserBreadcrumbBar.java +++ b/app/src/main/java/io/xpipe/app/browser/file/BrowserBreadcrumbBar.java @@ -1,8 +1,7 @@ -package io.xpipe.app.browser; +package io.xpipe.app.browser.file; -import io.xpipe.app.browser.fs.OpenFileSystemModel; -import io.xpipe.app.fxcomps.SimpleComp; -import io.xpipe.app.fxcomps.util.PlatformThread; +import io.xpipe.app.comp.SimpleComp; +import io.xpipe.app.util.PlatformThread; import io.xpipe.core.store.FileNames; import javafx.scene.Node; @@ -18,9 +17,9 @@ import java.util.ArrayList; public class BrowserBreadcrumbBar extends SimpleComp { - private final OpenFileSystemModel model; + private final BrowserFileSystemTabModel model; - public BrowserBreadcrumbBar(OpenFileSystemModel model) { + public BrowserBreadcrumbBar(BrowserFileSystemTabModel model) { this.model = model; } diff --git a/app/src/main/java/io/xpipe/app/browser/BrowserClipboard.java b/app/src/main/java/io/xpipe/app/browser/file/BrowserClipboard.java similarity index 94% rename from app/src/main/java/io/xpipe/app/browser/BrowserClipboard.java rename to app/src/main/java/io/xpipe/app/browser/file/BrowserClipboard.java index c07dfc0e6..ff1b380d4 100644 --- a/app/src/main/java/io/xpipe/app/browser/BrowserClipboard.java +++ b/app/src/main/java/io/xpipe/app/browser/file/BrowserClipboard.java @@ -1,8 +1,5 @@ -package io.xpipe.app.browser; +package io.xpipe.app.browser.file; -import io.xpipe.app.browser.file.BrowserEntry; -import io.xpipe.app.browser.file.BrowserFileTransferMode; -import io.xpipe.app.browser.file.LocalFileSystem; import io.xpipe.app.ext.ProcessControlProvider; import io.xpipe.app.issue.ErrorEvent; import io.xpipe.app.util.ThreadHelper; @@ -55,7 +52,7 @@ public class BrowserClipboard { var entries = new ArrayList(); for (Path file : files) { - entries.add(LocalFileSystem.getLocalBrowserEntry(file)); + entries.add(BrowserLocalFileSystem.getLocalBrowserEntry(file)); } currentCopyClipboard.setValue( diff --git a/app/src/main/java/io/xpipe/app/browser/BrowserBookmarkComp.java b/app/src/main/java/io/xpipe/app/browser/file/BrowserConnectionListComp.java similarity index 92% rename from app/src/main/java/io/xpipe/app/browser/BrowserBookmarkComp.java rename to app/src/main/java/io/xpipe/app/browser/file/BrowserConnectionListComp.java index 446438b16..58f705a9e 100644 --- a/app/src/main/java/io/xpipe/app/browser/BrowserBookmarkComp.java +++ b/app/src/main/java/io/xpipe/app/browser/file/BrowserConnectionListComp.java @@ -1,10 +1,10 @@ -package io.xpipe.app.browser; +package io.xpipe.app.browser.file; import io.xpipe.app.comp.store.*; -import io.xpipe.app.fxcomps.Comp; -import io.xpipe.app.fxcomps.CompStructure; -import io.xpipe.app.fxcomps.SimpleComp; -import io.xpipe.app.fxcomps.util.PlatformThread; +import io.xpipe.app.comp.Comp; +import io.xpipe.app.comp.CompStructure; +import io.xpipe.app.comp.SimpleComp; +import io.xpipe.app.util.PlatformThread; import io.xpipe.app.storage.DataStoreEntry; import javafx.beans.binding.Bindings; @@ -19,7 +19,7 @@ import java.util.HashSet; import java.util.function.BiConsumer; import java.util.function.Predicate; -public final class BrowserBookmarkComp extends SimpleComp { +public final class BrowserConnectionListComp extends SimpleComp { private static final PseudoClass SELECTED = PseudoClass.getPseudoClass("selected"); private final ObservableValue selected; @@ -28,7 +28,7 @@ public final class BrowserBookmarkComp extends SimpleComp { private final Property category; private final Property filter; - public BrowserBookmarkComp( + public BrowserConnectionListComp( ObservableValue selected, Predicate applicable, BiConsumer action, diff --git a/app/src/main/java/io/xpipe/app/browser/BrowserBookmarkHeaderComp.java b/app/src/main/java/io/xpipe/app/browser/file/BrowserConnectionListFilterComp.java similarity index 89% rename from app/src/main/java/io/xpipe/app/browser/BrowserBookmarkHeaderComp.java rename to app/src/main/java/io/xpipe/app/browser/file/BrowserConnectionListFilterComp.java index 6e67c0a84..128b10ae1 100644 --- a/app/src/main/java/io/xpipe/app/browser/BrowserBookmarkHeaderComp.java +++ b/app/src/main/java/io/xpipe/app/browser/file/BrowserConnectionListFilterComp.java @@ -1,11 +1,11 @@ -package io.xpipe.app.browser; +package io.xpipe.app.browser.file; import io.xpipe.app.comp.store.StoreCategoryWrapper; import io.xpipe.app.comp.store.StoreViewState; import io.xpipe.app.core.AppFont; -import io.xpipe.app.fxcomps.SimpleComp; -import io.xpipe.app.fxcomps.impl.FilterComp; -import io.xpipe.app.fxcomps.impl.HorizontalComp; +import io.xpipe.app.comp.SimpleComp; +import io.xpipe.app.comp.base.FilterComp; +import io.xpipe.app.comp.base.HorizontalComp; import io.xpipe.app.util.DataStoreCategoryChoiceComp; import javafx.beans.property.Property; @@ -19,7 +19,7 @@ import lombok.Getter; import java.util.List; @Getter -public final class BrowserBookmarkHeaderComp extends SimpleComp { +public final class BrowserConnectionListFilterComp extends SimpleComp { private final Property category = new SimpleObjectProperty<>(StoreViewState.get().getActiveCategory().getValue()); diff --git a/app/src/main/java/io/xpipe/app/browser/file/BrowserContextMenu.java b/app/src/main/java/io/xpipe/app/browser/file/BrowserContextMenu.java index 4fb3cc424..ce70027b0 100644 --- a/app/src/main/java/io/xpipe/app/browser/file/BrowserContextMenu.java +++ b/app/src/main/java/io/xpipe/app/browser/file/BrowserContextMenu.java @@ -1,7 +1,6 @@ package io.xpipe.app.browser.file; import io.xpipe.app.browser.action.BrowserAction; -import io.xpipe.app.browser.fs.OpenFileSystemModel; import io.xpipe.app.core.AppFont; import io.xpipe.app.util.InputHelper; @@ -13,11 +12,11 @@ import java.util.List; public final class BrowserContextMenu extends ContextMenu { - private final OpenFileSystemModel model; + private final BrowserFileSystemTabModel model; private final BrowserEntry source; private final boolean quickAccess; - public BrowserContextMenu(OpenFileSystemModel model, BrowserEntry source, boolean quickAccess) { + public BrowserContextMenu(BrowserFileSystemTabModel model, BrowserEntry source, boolean quickAccess) { this.model = model; this.source = source; this.quickAccess = quickAccess; diff --git a/app/src/main/java/io/xpipe/app/browser/file/BrowserFileListComp.java b/app/src/main/java/io/xpipe/app/browser/file/BrowserFileListComp.java index 0a7173a47..ab171d37e 100644 --- a/app/src/main/java/io/xpipe/app/browser/file/BrowserFileListComp.java +++ b/app/src/main/java/io/xpipe/app/browser/file/BrowserFileListComp.java @@ -1,11 +1,9 @@ package io.xpipe.app.browser.file; import io.xpipe.app.browser.action.BrowserAction; -import io.xpipe.app.comp.base.LazyTextFieldComp; import io.xpipe.app.core.AppI18n; -import io.xpipe.app.fxcomps.SimpleComp; -import io.xpipe.app.fxcomps.impl.PrettyImageHelper; -import io.xpipe.app.fxcomps.util.PlatformThread; +import io.xpipe.app.comp.SimpleComp; +import io.xpipe.app.util.PlatformThread; import io.xpipe.app.util.*; import io.xpipe.core.process.OsType; import io.xpipe.core.store.FileEntry; @@ -16,24 +14,16 @@ import io.xpipe.core.store.FileNames; import javafx.application.Platform; import javafx.beans.binding.Bindings; import javafx.beans.property.*; -import javafx.beans.value.ChangeListener; import javafx.collections.FXCollections; import javafx.collections.ListChangeListener; import javafx.css.PseudoClass; import javafx.geometry.Bounds; -import javafx.geometry.Pos; -import javafx.geometry.Side; -import javafx.scene.AccessibleRole; -import javafx.scene.Node; import javafx.scene.control.*; import javafx.scene.control.skin.TableViewSkin; import javafx.scene.control.skin.VirtualFlow; import javafx.scene.input.*; -import javafx.scene.layout.HBox; -import javafx.scene.layout.Priority; import javafx.scene.layout.Region; -import atlantafx.base.controls.Spacer; import atlantafx.base.theme.Styles; import java.time.Duration; @@ -82,7 +72,7 @@ public final class BrowserFileListComp extends SimpleComp { : null)); filenameCol.setComparator(Comparator.comparing(String::toLowerCase)); filenameCol.setSortType(ASCENDING); - filenameCol.setCellFactory(col -> new FilenameCell(fileList.getEditing(), col.getTableView())); + filenameCol.setCellFactory(col -> new BrowserFileListNameCell(fileList, typedSelection, fileList.getEditing(), col.getTableView())); filenameCol.setReorderable(false); filenameCol.setResizable(false); @@ -139,6 +129,31 @@ public final class BrowserFileListComp extends SimpleComp { return true; }); table.setFixedCellSize(32.0); + + prepareColumnVisibility(table, ownerCol, filenameCol); + prepareTableScrollFix(table); + prepareTableSelectionModel(table); + prepareTableShortcuts(table); + prepareTableEntries(table); + prepareTableChanges(table, filenameCol, mtimeCol, modeCol, ownerCol); + prepareTypedSelectionModel(table); + + return table; + } + + private static void prepareTableScrollFix(TableView table) { + table.lookupAll(".scroll-bar").stream() + .filter(node -> node.getPseudoClassStates().contains(PseudoClass.getPseudoClass("horizontal"))) + .findFirst() + .ifPresent(node -> { + Region region = (Region) node; + region.setMinHeight(0); + region.setPrefHeight(0); + region.setMaxHeight(0); + }); + } + + private void prepareColumnVisibility(TableView table, TableColumn ownerCol, TableColumn filenameCol) { var os = fileList.getFileSystemModel() .getFileSystem() .getShell() @@ -151,24 +166,6 @@ public final class BrowserFileListComp extends SimpleComp { var width = getFilenameWidth(table); filenameCol.setPrefWidth(width); }); - - table.lookupAll(".scroll-bar").stream() - .filter(node -> node.getPseudoClassStates().contains(PseudoClass.getPseudoClass("horizontal"))) - .findFirst() - .ifPresent(node -> { - Region region = (Region) node; - region.setMinHeight(0); - region.setPrefHeight(0); - region.setMaxHeight(0); - }); - - prepareTableSelectionModel(table); - prepareTableShortcuts(table); - prepareTableEntries(table); - prepareTableChanges(table, filenameCol, mtimeCol, modeCol, ownerCol); - prepareTypedSelectionModel(table); - - return table; } private double getFilenameWidth(TableView tableView) { @@ -632,156 +629,4 @@ public final class BrowserFileListComp extends SimpleComp { } } - private class FilenameCell extends TableCell { - - private final StringProperty img = new SimpleStringProperty(); - private final StringProperty text = new SimpleStringProperty(); - - private final BooleanProperty updating = new SimpleBooleanProperty(); - - public FilenameCell(Property editing, TableView tableView) { - accessibleTextProperty() - .bind(Bindings.createStringBinding( - () -> { - return getItem() != null ? getItem() : null; - }, - itemProperty())); - setAccessibleRole(AccessibleRole.TEXT); - - var textField = new LazyTextFieldComp(text) - .minWidth(USE_PREF_SIZE) - .createStructure() - .get(); - var quickAccess = new BrowserQuickAccessButtonComp( - () -> getTableRow().getItem(), fileList.getFileSystemModel()) - .hide(Bindings.createBooleanBinding( - () -> { - if (getTableRow() == null) { - return true; - } - - var item = getTableRow().getItem(); - var notDir = item.getRawFileEntry().resolved().getKind() != FileKind.DIRECTORY; - var isParentLink = item.getRawFileEntry() - .equals(fileList.getFileSystemModel().getCurrentParentDirectory()); - return notDir || isParentLink; - }, - itemProperty())) - .focusTraversable(false) - .createRegion(); - - editing.addListener((observable, oldValue, newValue) -> { - if (getTableRow().getItem() != null && getTableRow().getItem().equals(newValue)) { - PlatformThread.runLaterIfNeeded(() -> { - textField.setDisable(false); - textField.requestFocus(); - }); - } - }); - - ChangeListener listener = (observable, oldValue, newValue) -> { - if (updating.get()) { - return; - } - - getTableRow().requestFocus(); - var it = getTableRow().getItem(); - editing.setValue(null); - ThreadHelper.runAsync(() -> { - if (it == null) { - return; - } - - var r = fileList.rename(it, newValue); - Platform.runLater(() -> { - updateItem(getItem(), isEmpty()); - fileList.getSelection().setAll(r); - getTableView().scrollTo(r); - }); - }); - }; - text.addListener(listener); - - Node imageView = PrettyImageHelper.ofFixedSize(img, 24, 24).createRegion(); - HBox graphic = new HBox(imageView, new Spacer(5), quickAccess, new Spacer(1), textField); - quickAccess.prefHeightProperty().bind(graphic.heightProperty()); - graphic.setAlignment(Pos.CENTER_LEFT); - graphic.setPrefHeight(34); - HBox.setHgrow(textField, Priority.ALWAYS); - graphic.setAlignment(Pos.CENTER_LEFT); - setGraphic(graphic); - - InputHelper.onExactKeyCode(tableView, KeyCode.RIGHT, false, event -> { - var selected = fileList.getSelection(); - if (selected.size() == 1 && selected.getFirst() == getTableRow().getItem()) { - ((ButtonBase) quickAccess).fire(); - event.consume(); - } - }); - InputHelper.onExactKeyCode(tableView, KeyCode.SPACE, true, event -> { - var selection = typedSelection.get() + " "; - var found = fileList.getShown().getValue().stream() - .filter(browserEntry -> - browserEntry.getFileName().toLowerCase().startsWith(selection)) - .findFirst(); - // Ugly fix to prevent space from showing the menu when there is a file matching - // Due to the table view input map, these events always get sent and consumed, not allowing us to - // differentiate between these cases - if (found.isPresent()) { - return; - } - - var selected = fileList.getSelection(); - // Only show one menu across all selected entries - if (selected.size() > 0 && selected.getLast() == getTableRow().getItem()) { - var cm = new BrowserContextMenu( - fileList.getFileSystemModel(), getTableRow().getItem(), false); - ContextMenuHelper.toggleShow(cm, this, Side.RIGHT); - event.consume(); - } - }); - } - - @Override - protected void updateItem(String newName, boolean empty) { - if (updating.get()) { - super.updateItem(newName, empty); - return; - } - - try (var ignored = new BooleanScope(updating).start()) { - super.updateItem(newName, empty); - if (empty || newName == null || getTableRow().getItem() == null) { - // Don't set image as that would trigger image comp update - // and cells are emptied on each change, leading to unnecessary changes - // img.set(null); - - // Visibility seems to be bugged, so use opacity - setOpacity(0.0); - } else { - img.set(getTableRow().getItem().getIcon()); - - var isDirectory = getTableRow().getItem().getRawFileEntry().getKind() == FileKind.DIRECTORY; - pseudoClassStateChanged(FOLDER, isDirectory); - - var normalName = getTableRow().getItem().getRawFileEntry().getKind() == FileKind.LINK - ? getTableRow().getItem().getFileName() + " -> " - + getTableRow() - .getItem() - .getRawFileEntry() - .resolved() - .getPath() - : getTableRow().getItem().getFileName(); - var fileName = normalName; - var hidden = - getTableRow().getItem().getRawFileEntry().getInfo().explicitlyHidden() - || fileName.startsWith("."); - getTableRow().pseudoClassStateChanged(HIDDEN, hidden); - text.set(fileName); - // Visibility seems to be bugged, so use opacity - setOpacity(1.0); - } - } - } - } } diff --git a/app/src/main/java/io/xpipe/app/browser/file/BrowserFileListCompEntry.java b/app/src/main/java/io/xpipe/app/browser/file/BrowserFileListCompEntry.java index 7bc1e3485..ba70bf7c4 100644 --- a/app/src/main/java/io/xpipe/app/browser/file/BrowserFileListCompEntry.java +++ b/app/src/main/java/io/xpipe/app/browser/file/BrowserFileListCompEntry.java @@ -1,8 +1,6 @@ package io.xpipe.app.browser.file; -import io.xpipe.app.browser.BrowserClipboard; -import io.xpipe.app.browser.BrowserSelectionListComp; -import io.xpipe.app.browser.session.BrowserSessionModel; +import io.xpipe.app.browser.BrowserFullSessionModel; import io.xpipe.core.store.FileKind; import javafx.geometry.Point2D; @@ -219,7 +217,7 @@ public class BrowserFileListCompEntry { return; } - if (model.getFileSystemModel().getBrowserModel() instanceof BrowserSessionModel sessionModel) { + if (model.getFileSystemModel().getBrowserModel() instanceof BrowserFullSessionModel sessionModel) { sessionModel.getDraggingFiles().setValue(true); } var selected = model.getSelection(); @@ -229,7 +227,7 @@ public class BrowserFileListCompEntry { selected, event.isAltDown() ? BrowserFileTransferMode.MOVE : BrowserFileTransferMode.NORMAL)); - Image image = BrowserSelectionListComp.snapshot(selected); + Image image = BrowserFileSelectionListComp.snapshot(selected); db.setDragView(image, -20, 15); event.setDragDetect(true); @@ -237,7 +235,7 @@ public class BrowserFileListCompEntry { } public void onDragDone(DragEvent event) { - if (model.getFileSystemModel().getBrowserModel() instanceof BrowserSessionModel sessionModel) { + if (model.getFileSystemModel().getBrowserModel() instanceof BrowserFullSessionModel sessionModel) { sessionModel.getDraggingFiles().setValue(false); event.consume(); } diff --git a/app/src/main/java/io/xpipe/app/browser/BrowserFilterComp.java b/app/src/main/java/io/xpipe/app/browser/file/BrowserFileListFilterComp.java similarity index 89% rename from app/src/main/java/io/xpipe/app/browser/BrowserFilterComp.java rename to app/src/main/java/io/xpipe/app/browser/file/BrowserFileListFilterComp.java index 2aeb38bd5..00cb13b49 100644 --- a/app/src/main/java/io/xpipe/app/browser/BrowserFilterComp.java +++ b/app/src/main/java/io/xpipe/app/browser/file/BrowserFileListFilterComp.java @@ -1,10 +1,9 @@ -package io.xpipe.app.browser; +package io.xpipe.app.browser.file; -import io.xpipe.app.browser.fs.OpenFileSystemModel; -import io.xpipe.app.fxcomps.Comp; -import io.xpipe.app.fxcomps.CompStructure; -import io.xpipe.app.fxcomps.impl.TextFieldComp; -import io.xpipe.app.fxcomps.impl.TooltipAugment; +import io.xpipe.app.comp.Comp; +import io.xpipe.app.comp.CompStructure; +import io.xpipe.app.comp.base.TextFieldComp; +import io.xpipe.app.comp.base.TooltipAugment; import io.xpipe.app.util.InputHelper; import javafx.beans.property.Property; @@ -20,12 +19,12 @@ import javafx.scene.layout.HBox; import atlantafx.base.theme.Styles; import org.kordamp.ikonli.javafx.FontIcon; -public class BrowserFilterComp extends Comp { +public class BrowserFileListFilterComp extends Comp { - private final OpenFileSystemModel model; + private final BrowserFileSystemTabModel model; private final Property filterString; - public BrowserFilterComp(OpenFileSystemModel model, Property filterString) { + public BrowserFileListFilterComp(BrowserFileSystemTabModel model, Property filterString) { this.model = model; this.filterString = filterString; } diff --git a/app/src/main/java/io/xpipe/app/browser/file/BrowserFileListModel.java b/app/src/main/java/io/xpipe/app/browser/file/BrowserFileListModel.java index c4cb612c1..3187c9ba6 100644 --- a/app/src/main/java/io/xpipe/app/browser/file/BrowserFileListModel.java +++ b/app/src/main/java/io/xpipe/app/browser/file/BrowserFileListModel.java @@ -1,6 +1,5 @@ package io.xpipe.app.browser.file; -import io.xpipe.app.browser.fs.OpenFileSystemModel; import io.xpipe.app.issue.ErrorEvent; import io.xpipe.core.process.OsType; import io.xpipe.core.store.FileEntry; @@ -27,9 +26,9 @@ public final class BrowserFileListModel { static final Comparator FILE_TYPE_COMPARATOR = Comparator.comparing(path -> path.getRawFileEntry().resolved().getKind() != FileKind.DIRECTORY); - private final OpenFileSystemModel.SelectionMode selectionMode; + private final BrowserFileSystemTabModel.SelectionMode selectionMode; - private final OpenFileSystemModel fileSystemModel; + private final BrowserFileSystemTabModel fileSystemModel; private final Property> comparatorProperty = new SimpleObjectProperty<>(FILE_TYPE_COMPARATOR); private final Property> all = new SimpleObjectProperty<>(new ArrayList<>()); @@ -40,7 +39,7 @@ public final class BrowserFileListModel { private final Property draggedOverEmpty = new SimpleBooleanProperty(); private final Property editing = new SimpleObjectProperty<>(); - public BrowserFileListModel(OpenFileSystemModel.SelectionMode selectionMode, OpenFileSystemModel fileSystemModel) { + public BrowserFileListModel(BrowserFileSystemTabModel.SelectionMode selectionMode, BrowserFileSystemTabModel fileSystemModel) { this.selectionMode = selectionMode; this.fileSystemModel = fileSystemModel; diff --git a/app/src/main/java/io/xpipe/app/browser/file/BrowserFileListNameCell.java b/app/src/main/java/io/xpipe/app/browser/file/BrowserFileListNameCell.java new file mode 100644 index 000000000..b4858aa0a --- /dev/null +++ b/app/src/main/java/io/xpipe/app/browser/file/BrowserFileListNameCell.java @@ -0,0 +1,174 @@ +package io.xpipe.app.browser.file; + +import atlantafx.base.controls.Spacer; +import io.xpipe.app.comp.base.LazyTextFieldComp; +import io.xpipe.app.comp.base.PrettyImageHelper; +import io.xpipe.app.util.PlatformThread; +import io.xpipe.app.util.BooleanScope; +import io.xpipe.app.util.ContextMenuHelper; +import io.xpipe.app.util.InputHelper; +import io.xpipe.app.util.ThreadHelper; +import io.xpipe.core.store.FileKind; +import javafx.application.Platform; +import javafx.beans.binding.Bindings; +import javafx.beans.property.*; +import javafx.beans.value.ChangeListener; +import javafx.beans.value.ObservableStringValue; +import javafx.css.PseudoClass; +import javafx.geometry.Pos; +import javafx.geometry.Side; +import javafx.scene.AccessibleRole; +import javafx.scene.Node; +import javafx.scene.control.ButtonBase; +import javafx.scene.control.TableCell; +import javafx.scene.control.TableView; +import javafx.scene.control.TextField; +import javafx.scene.input.KeyCode; +import javafx.scene.layout.HBox; +import javafx.scene.layout.Priority; +import javafx.scene.layout.Region; + +class BrowserFileListNameCell extends TableCell { + + private final BrowserFileListModel fileList; + private final ObservableStringValue typedSelection; + private final StringProperty img = new SimpleStringProperty(); + private final StringProperty text = new SimpleStringProperty(); + + private final BooleanProperty updating = new SimpleBooleanProperty(); + + public BrowserFileListNameCell(BrowserFileListModel fileList, ObservableStringValue typedSelection, Property editing, TableView tableView) { + this.fileList = fileList; + this.typedSelection = typedSelection; + + accessibleTextProperty().bind(Bindings.createStringBinding(() -> { + return getItem() != null ? getItem() : null; + }, itemProperty())); + setAccessibleRole(AccessibleRole.TEXT); + + var textField = new LazyTextFieldComp(text).minWidth(USE_PREF_SIZE).createStructure().get(); + var quickAccess = createQuickAccessButton(); + setupShortcuts(tableView, (ButtonBase) quickAccess); + setupRename(fileList, textField, editing); + + Node imageView = PrettyImageHelper.ofFixedSize(img, 24, 24).createRegion(); + HBox graphic = new HBox(imageView, new Spacer(5), quickAccess, new Spacer(1), textField); + quickAccess.prefHeightProperty().bind(graphic.heightProperty()); + graphic.setAlignment(Pos.CENTER_LEFT); + graphic.setPrefHeight(34); + HBox.setHgrow(textField, Priority.ALWAYS); + graphic.setAlignment(Pos.CENTER_LEFT); + setGraphic(graphic); + } + + private Region createQuickAccessButton() { + var quickAccess = new BrowserQuickAccessButtonComp(() -> getTableRow().getItem(), fileList.getFileSystemModel()).hide(Bindings.createBooleanBinding(() -> { + if (getTableRow() == null) { + return true; + } + + var item = getTableRow().getItem(); + var notDir = item.getRawFileEntry().resolved().getKind() != FileKind.DIRECTORY; + var isParentLink = item.getRawFileEntry().equals(fileList.getFileSystemModel().getCurrentParentDirectory()); + return notDir || isParentLink; + }, itemProperty())).focusTraversable(false).createRegion(); + return quickAccess; + } + + private void setupShortcuts(TableView tableView, ButtonBase quickAccess) { + InputHelper.onExactKeyCode(tableView, KeyCode.RIGHT, false, event -> { + var selected = fileList.getSelection(); + if (selected.size() == 1 && selected.getFirst() == getTableRow().getItem()) { + quickAccess.fire(); + event.consume(); + } + }); + InputHelper.onExactKeyCode(tableView, KeyCode.SPACE, true, event -> { + var selection = typedSelection.get() + " "; + var found = fileList.getShown().getValue().stream().filter(browserEntry -> browserEntry.getFileName().toLowerCase().startsWith(selection)).findFirst(); + // Ugly fix to prevent space from showing the menu when there is a file matching + // Due to the table view input map, these events always get sent and consumed, not allowing us to + // differentiate between these cases + if (found.isPresent()) { + return; + } + + var selected = fileList.getSelection(); + // Only show one menu across all selected entries + if (selected.size() > 0 && selected.getLast() == getTableRow().getItem()) { + var cm = new BrowserContextMenu(fileList.getFileSystemModel(), getTableRow().getItem(), false); + ContextMenuHelper.toggleShow(cm, this, Side.RIGHT); + event.consume(); + } + }); + } + + private void setupRename(BrowserFileListModel fileList, TextField textField, Property editing) { + ChangeListener listener = (observable, oldValue, newValue) -> { + if (updating.get()) { + return; + } + + getTableRow().requestFocus(); + var it = getTableRow().getItem(); + editing.setValue(null); + ThreadHelper.runAsync(() -> { + if (it == null) { + return; + } + + var r = fileList.rename(it, newValue); + Platform.runLater(() -> { + updateItem(getItem(), isEmpty()); + fileList.getSelection().setAll(r); + getTableView().scrollTo(r); + }); + }); + }; + text.addListener(listener); + + editing.addListener((observable, oldValue, newValue) -> { + if (getTableRow().getItem() != null && getTableRow().getItem().equals(newValue)) { + PlatformThread.runLaterIfNeeded(() -> { + textField.setDisable(false); + textField.requestFocus(); + }); + } + }); + } + + @Override + protected void updateItem(String newName, boolean empty) { + if (updating.get()) { + super.updateItem(newName, empty); + return; + } + + try (var ignored = new BooleanScope(updating).start()) { + super.updateItem(newName, empty); + if (empty || newName == null || getTableRow().getItem() == null) { + // Don't set image as that would trigger image comp update + // and cells are emptied on each change, leading to unnecessary changes + // img.set(null); + + // Visibility seems to be bugged, so use opacity + setOpacity(0.0); + } else { + img.set(getTableRow().getItem().getIcon()); + + var isDirectory = getTableRow().getItem().getRawFileEntry().getKind() == FileKind.DIRECTORY; + pseudoClassStateChanged(PseudoClass.getPseudoClass("folder"), isDirectory); + + var normalName = getTableRow().getItem().getRawFileEntry().getKind() == FileKind.LINK ? + getTableRow().getItem().getFileName() + " -> " + getTableRow().getItem().getRawFileEntry().resolved().getPath() : + getTableRow().getItem().getFileName(); + var fileName = normalName; + var hidden = getTableRow().getItem().getRawFileEntry().getInfo().explicitlyHidden() || fileName.startsWith("."); + getTableRow().pseudoClassStateChanged(PseudoClass.getPseudoClass("hidden"), hidden); + text.set(fileName); + // Visibility seems to be bugged, so use opacity + setOpacity(1.0); + } + } + } +} diff --git a/app/src/main/java/io/xpipe/app/browser/BrowserFileOpener.java b/app/src/main/java/io/xpipe/app/browser/file/BrowserFileOpener.java similarity index 91% rename from app/src/main/java/io/xpipe/app/browser/BrowserFileOpener.java rename to app/src/main/java/io/xpipe/app/browser/file/BrowserFileOpener.java index c66cc2ff3..80a31116a 100644 --- a/app/src/main/java/io/xpipe/app/browser/BrowserFileOpener.java +++ b/app/src/main/java/io/xpipe/app/browser/file/BrowserFileOpener.java @@ -1,6 +1,5 @@ -package io.xpipe.app.browser; +package io.xpipe.app.browser.file; -import io.xpipe.app.browser.fs.OpenFileSystemModel; import io.xpipe.app.core.window.AppWindowHelper; import io.xpipe.app.prefs.AppPrefs; import io.xpipe.app.util.BooleanScope; @@ -20,7 +19,7 @@ import java.util.Objects; public class BrowserFileOpener { - private static OutputStream openFileOutput(OpenFileSystemModel model, FileEntry file, long totalBytes) + private static OutputStream openFileOutput(BrowserFileSystemTabModel model, FileEntry file, long totalBytes) throws Exception { var fileSystem = model.getFileSystem(); if (model.isClosed() || fileSystem.getShell().isEmpty()) { @@ -68,7 +67,7 @@ public class BrowserFileOpener { return Objects.hash(entry.getPath(), entry.getFileSystem(), entry.getKind(), entry.getInfo()); } - public static void openWithAnyApplication(OpenFileSystemModel model, FileEntry entry) { + public static void openWithAnyApplication(BrowserFileSystemTabModel model, FileEntry entry) { var file = entry.getPath(); var key = calculateKey(entry); FileBridge.get() @@ -89,7 +88,7 @@ public class BrowserFileOpener { s -> FileOpener.openWithAnyApplication(s)); } - public static void openInDefaultApplication(OpenFileSystemModel model, FileEntry entry) { + public static void openInDefaultApplication(BrowserFileSystemTabModel model, FileEntry entry) { var file = entry.getPath(); var key = calculateKey(entry); FileBridge.get() @@ -110,7 +109,7 @@ public class BrowserFileOpener { s -> FileOpener.openInDefaultApplication(s)); } - public static void openInTextEditor(OpenFileSystemModel model, FileEntry entry) { + public static void openInTextEditor(BrowserFileSystemTabModel model, FileEntry entry) { var editor = AppPrefs.get().externalEditor().getValue(); if (editor == null) { return; diff --git a/app/src/main/java/io/xpipe/app/browser/file/BrowserFileOverviewComp.java b/app/src/main/java/io/xpipe/app/browser/file/BrowserFileOverviewComp.java index 5fa28b999..7540d2320 100644 --- a/app/src/main/java/io/xpipe/app/browser/file/BrowserFileOverviewComp.java +++ b/app/src/main/java/io/xpipe/app/browser/file/BrowserFileOverviewComp.java @@ -1,13 +1,12 @@ package io.xpipe.app.browser.file; -import io.xpipe.app.browser.fs.OpenFileSystemModel; import io.xpipe.app.browser.icon.BrowserIcons; import io.xpipe.app.comp.base.ListBoxViewComp; import io.xpipe.app.comp.base.VBoxViewComp; -import io.xpipe.app.fxcomps.Comp; -import io.xpipe.app.fxcomps.SimpleComp; -import io.xpipe.app.fxcomps.augment.GrowAugment; -import io.xpipe.app.fxcomps.impl.HorizontalComp; +import io.xpipe.app.comp.Comp; +import io.xpipe.app.comp.SimpleComp; +import io.xpipe.app.comp.augment.GrowAugment; +import io.xpipe.app.comp.base.HorizontalComp; import io.xpipe.core.store.FileEntry; import javafx.collections.ObservableList; @@ -25,7 +24,7 @@ import java.util.function.Function; @EqualsAndHashCode(callSuper = true) public class BrowserFileOverviewComp extends SimpleComp { - OpenFileSystemModel model; + BrowserFileSystemTabModel model; ObservableList list; boolean grow; diff --git a/app/src/main/java/io/xpipe/app/browser/BrowserSelectionListComp.java b/app/src/main/java/io/xpipe/app/browser/file/BrowserFileSelectionListComp.java similarity index 83% rename from app/src/main/java/io/xpipe/app/browser/BrowserSelectionListComp.java rename to app/src/main/java/io/xpipe/app/browser/file/BrowserFileSelectionListComp.java index 624d9f618..154279167 100644 --- a/app/src/main/java/io/xpipe/app/browser/BrowserSelectionListComp.java +++ b/app/src/main/java/io/xpipe/app/browser/file/BrowserFileSelectionListComp.java @@ -1,14 +1,13 @@ -package io.xpipe.app.browser; +package io.xpipe.app.browser.file; -import io.xpipe.app.browser.file.BrowserEntry; import io.xpipe.app.comp.base.ListBoxViewComp; import io.xpipe.app.core.AppStyle; import io.xpipe.app.core.window.AppWindowHelper; -import io.xpipe.app.fxcomps.Comp; -import io.xpipe.app.fxcomps.SimpleComp; -import io.xpipe.app.fxcomps.impl.PrettyImageHelper; -import io.xpipe.app.fxcomps.util.BindingsHelper; -import io.xpipe.app.fxcomps.util.PlatformThread; +import io.xpipe.app.comp.Comp; +import io.xpipe.app.comp.SimpleComp; +import io.xpipe.app.comp.base.PrettyImageHelper; +import io.xpipe.app.util.BindingsHelper; +import io.xpipe.app.util.PlatformThread; import javafx.beans.binding.Bindings; import javafx.beans.property.SimpleStringProperty; @@ -31,17 +30,17 @@ import java.util.function.Function; @Value @EqualsAndHashCode(callSuper = true) @AllArgsConstructor -public class BrowserSelectionListComp extends SimpleComp { +public class BrowserFileSelectionListComp extends SimpleComp { ObservableList list; Function> nameTransformation; - public BrowserSelectionListComp(ObservableList list) { + public BrowserFileSelectionListComp(ObservableList list) { this(list, entry -> new SimpleStringProperty(entry.getFileName())); } public static Image snapshot(ObservableList list) { - var r = new BrowserSelectionListComp(list).styleClass("drag").createRegion(); + var r = new BrowserFileSelectionListComp(list).styleClass("drag").createRegion(); var scene = new Scene(r); AppWindowHelper.setupStylesheets(scene); AppStyle.addStylesheets(scene); diff --git a/app/src/main/java/io/xpipe/app/browser/fs/OpenFileSystemCache.java b/app/src/main/java/io/xpipe/app/browser/file/BrowserFileSystemCache.java similarity index 92% rename from app/src/main/java/io/xpipe/app/browser/fs/OpenFileSystemCache.java rename to app/src/main/java/io/xpipe/app/browser/file/BrowserFileSystemCache.java index 9d9037af9..746f588c0 100644 --- a/app/src/main/java/io/xpipe/app/browser/fs/OpenFileSystemCache.java +++ b/app/src/main/java/io/xpipe/app/browser/file/BrowserFileSystemCache.java @@ -1,4 +1,4 @@ -package io.xpipe.app.browser.fs; +package io.xpipe.app.browser.file; import io.xpipe.app.util.ShellControlCache; import io.xpipe.core.process.CommandBuilder; @@ -12,14 +12,14 @@ import java.util.LinkedHashMap; import java.util.Map; @Getter -public class OpenFileSystemCache extends ShellControlCache { +public class BrowserFileSystemCache extends ShellControlCache { - private final OpenFileSystemModel model; + private final BrowserFileSystemTabModel model; private final String username; private final Map users = new LinkedHashMap<>(); private final Map groups = new LinkedHashMap<>(); - public OpenFileSystemCache(OpenFileSystemModel model) throws Exception { + public BrowserFileSystemCache(BrowserFileSystemTabModel model) throws Exception { super(model.getFileSystem().getShell().orElseThrow()); this.model = model; diff --git a/app/src/main/java/io/xpipe/app/browser/file/FileSystemHelper.java b/app/src/main/java/io/xpipe/app/browser/file/BrowserFileSystemHelper.java similarity index 89% rename from app/src/main/java/io/xpipe/app/browser/file/FileSystemHelper.java rename to app/src/main/java/io/xpipe/app/browser/file/BrowserFileSystemHelper.java index 8359799e3..9f289e7e2 100644 --- a/app/src/main/java/io/xpipe/app/browser/file/FileSystemHelper.java +++ b/app/src/main/java/io/xpipe/app/browser/file/BrowserFileSystemHelper.java @@ -1,6 +1,5 @@ package io.xpipe.app.browser.file; -import io.xpipe.app.browser.fs.OpenFileSystemModel; import io.xpipe.app.issue.ErrorEvent; import io.xpipe.core.process.OsType; import io.xpipe.core.store.FileEntry; @@ -11,9 +10,9 @@ import io.xpipe.core.store.FileSystem; import java.time.Instant; import java.util.List; -public class FileSystemHelper { +public class BrowserFileSystemHelper { - public static String adjustPath(OpenFileSystemModel model, String path) { + public static String adjustPath(BrowserFileSystemTabModel model, String path) { if (path == null) { return null; } @@ -46,7 +45,7 @@ public class FileSystemHelper { return path; } - public static String evaluatePath(OpenFileSystemModel model, String path) throws Exception { + public static String evaluatePath(BrowserFileSystemTabModel model, String path) throws Exception { if (path == null) { return null; } @@ -67,7 +66,7 @@ public class FileSystemHelper { } } - public static String resolveDirectoryPath(OpenFileSystemModel model, String path, boolean allowRewrite) + public static String resolveDirectoryPath(BrowserFileSystemTabModel model, String path, boolean allowRewrite) throws Exception { if (path == null) { return null; @@ -98,7 +97,7 @@ public class FileSystemHelper { return FileNames.toDirectory(resolved); } - public static void validateDirectoryPath(OpenFileSystemModel model, String path, boolean verifyExists) + public static void validateDirectoryPath(BrowserFileSystemTabModel model, String path, boolean verifyExists) throws Exception { if (path == null) { return; diff --git a/app/src/main/java/io/xpipe/app/browser/fs/OpenFileSystemHistory.java b/app/src/main/java/io/xpipe/app/browser/file/BrowserFileSystemHistory.java similarity index 96% rename from app/src/main/java/io/xpipe/app/browser/fs/OpenFileSystemHistory.java rename to app/src/main/java/io/xpipe/app/browser/file/BrowserFileSystemHistory.java index ede908c1b..7cf61f6b2 100644 --- a/app/src/main/java/io/xpipe/app/browser/fs/OpenFileSystemHistory.java +++ b/app/src/main/java/io/xpipe/app/browser/file/BrowserFileSystemHistory.java @@ -1,4 +1,4 @@ -package io.xpipe.app.browser.fs; +package io.xpipe.app.browser.file; import javafx.beans.binding.Bindings; import javafx.beans.binding.BooleanBinding; @@ -9,7 +9,7 @@ import java.util.ArrayList; import java.util.List; import java.util.Objects; -public final class OpenFileSystemHistory { +public final class BrowserFileSystemHistory { private final IntegerProperty cursor = new SimpleIntegerProperty(-1); private final List history = new ArrayList<>(); diff --git a/app/src/main/java/io/xpipe/app/browser/fs/OpenFileSystemSavedState.java b/app/src/main/java/io/xpipe/app/browser/file/BrowserFileSystemSavedState.java similarity index 80% rename from app/src/main/java/io/xpipe/app/browser/fs/OpenFileSystemSavedState.java rename to app/src/main/java/io/xpipe/app/browser/file/BrowserFileSystemSavedState.java index 44243f237..9040040c0 100644 --- a/app/src/main/java/io/xpipe/app/browser/fs/OpenFileSystemSavedState.java +++ b/app/src/main/java/io/xpipe/app/browser/file/BrowserFileSystemSavedState.java @@ -1,4 +1,4 @@ -package io.xpipe.app.browser.fs; +package io.xpipe.app.browser.file; import io.xpipe.app.core.AppCache; import io.xpipe.core.store.FileNames; @@ -31,35 +31,35 @@ import java.util.stream.Collectors; @AllArgsConstructor @Getter -@JsonSerialize(using = OpenFileSystemSavedState.Serializer.class) -@JsonDeserialize(using = OpenFileSystemSavedState.Deserializer.class) -public class OpenFileSystemSavedState { +@JsonSerialize(using = BrowserFileSystemSavedState.Serializer.class) +@JsonDeserialize(using = BrowserFileSystemSavedState.Deserializer.class) +public class BrowserFileSystemSavedState { private static final Timer TIMEOUT_TIMER = new Timer(true); private static final int STORED = 15; @Setter - private OpenFileSystemModel model; + private BrowserFileSystemTabModel model; private String lastDirectory; @NonNull private ObservableList recentDirectories; - public OpenFileSystemSavedState(String lastDirectory, @NonNull ObservableList recentDirectories) { + public BrowserFileSystemSavedState(String lastDirectory, @NonNull ObservableList recentDirectories) { this.lastDirectory = lastDirectory; this.recentDirectories = recentDirectories; } - public OpenFileSystemSavedState() { + public BrowserFileSystemSavedState() { lastDirectory = null; recentDirectories = FXCollections.observableList(new ArrayList<>(STORED)); } - static OpenFileSystemSavedState loadForStore(OpenFileSystemModel model) { + static BrowserFileSystemSavedState loadForStore(BrowserFileSystemTabModel model) { var state = AppCache.getNonNull( - "fs-state-" + model.getEntry().get().getUuid(), OpenFileSystemSavedState.class, () -> { - return new OpenFileSystemSavedState(); + "fs-state-" + model.getEntry().get().getUuid(), BrowserFileSystemSavedState.class, () -> { + return new BrowserFileSystemSavedState(); }); state.setModel(model); return state; @@ -122,14 +122,14 @@ public class OpenFileSystemSavedState { } } - public static class Serializer extends StdSerializer { + public static class Serializer extends StdSerializer { protected Serializer() { - super(OpenFileSystemSavedState.class); + super(BrowserFileSystemSavedState.class); } @Override - public void serialize(OpenFileSystemSavedState value, JsonGenerator gen, SerializerProvider provider) + public void serialize(BrowserFileSystemSavedState value, JsonGenerator gen, SerializerProvider provider) throws IOException { var node = JsonNodeFactory.instance.objectNode(); node.set("recentDirectories", JacksonMapper.getDefault().valueToTree(value.getRecentDirectories())); @@ -137,10 +137,10 @@ public class OpenFileSystemSavedState { } } - public static class Deserializer extends StdDeserializer { + public static class Deserializer extends StdDeserializer { protected Deserializer() { - super(OpenFileSystemSavedState.class); + super(BrowserFileSystemSavedState.class); } private static Predicate distinctBy(Function f) { @@ -150,7 +150,7 @@ public class OpenFileSystemSavedState { @Override @SneakyThrows - public OpenFileSystemSavedState deserialize(JsonParser p, DeserializationContext ctxt) { + public BrowserFileSystemSavedState deserialize(JsonParser p, DeserializationContext ctxt) { var tree = (ObjectNode) JacksonMapper.getDefault().readTree(p); JavaType javaType = JacksonMapper.getDefault() .getTypeFactory() @@ -164,7 +164,7 @@ public class OpenFileSystemSavedState { .map(recentEntry -> new RecentEntry(FileNames.toDirectory(recentEntry.directory), recentEntry.time)) .filter(distinctBy(recentEntry -> recentEntry.getDirectory())) .collect(Collectors.toCollection(ArrayList::new)); - return new OpenFileSystemSavedState(null, FXCollections.observableList(cleaned)); + return new BrowserFileSystemSavedState(null, FXCollections.observableList(cleaned)); } } diff --git a/app/src/main/java/io/xpipe/app/browser/fs/OpenFileSystemComp.java b/app/src/main/java/io/xpipe/app/browser/file/BrowserFileSystemTabComp.java similarity index 89% rename from app/src/main/java/io/xpipe/app/browser/fs/OpenFileSystemComp.java rename to app/src/main/java/io/xpipe/app/browser/file/BrowserFileSystemTabComp.java index 2a3abfbab..8993a10c8 100644 --- a/app/src/main/java/io/xpipe/app/browser/fs/OpenFileSystemComp.java +++ b/app/src/main/java/io/xpipe/app/browser/file/BrowserFileSystemTabComp.java @@ -1,21 +1,15 @@ -package io.xpipe.app.browser.fs; +package io.xpipe.app.browser.file; -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.core.AppFont; -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.TooltipAugment; -import io.xpipe.app.fxcomps.impl.VerticalComp; +import io.xpipe.app.comp.Comp; +import io.xpipe.app.comp.SimpleComp; +import io.xpipe.app.comp.SimpleCompStructure; +import io.xpipe.app.comp.augment.ContextMenuAugment; +import io.xpipe.app.comp.base.TooltipAugment; +import io.xpipe.app.comp.base.VerticalComp; import io.xpipe.app.util.InputHelper; import javafx.geometry.Pos; @@ -37,12 +31,12 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; -public class OpenFileSystemComp extends SimpleComp { +public class BrowserFileSystemTabComp extends SimpleComp { - private final OpenFileSystemModel model; + private final BrowserFileSystemTabModel model; private final boolean showStatusBar; - public OpenFileSystemComp(OpenFileSystemModel model, boolean showStatusBar) { + public BrowserFileSystemTabComp(BrowserFileSystemTabModel model, boolean showStatusBar) { this.model = model; this.showStatusBar = showStatusBar; } @@ -82,12 +76,12 @@ public class OpenFileSystemComp extends SimpleComp { menuButton.disableProperty().bind(model.getInOverview()); menuButton.setAccessibleText("Directory options"); - var filter = new BrowserFilterComp(model, model.getFilter()).createStructure(); + var filter = new BrowserFileListFilterComp(model, model.getFilter()).createStructure(); var topBar = new HBox(); topBar.setAlignment(Pos.CENTER); topBar.getStyleClass().add("top-bar"); - var navBar = new BrowserNavBar(model).createStructure(); + var navBar = new BrowserNavBarComp(model).createStructure(); filter.textField().prefHeightProperty().bind(navBar.get().heightProperty()); AppFont.medium(navBar.get()); topBar.getChildren() diff --git a/app/src/main/java/io/xpipe/app/browser/fs/OpenFileSystemModel.java b/app/src/main/java/io/xpipe/app/browser/file/BrowserFileSystemTabModel.java similarity index 91% rename from app/src/main/java/io/xpipe/app/browser/fs/OpenFileSystemModel.java rename to app/src/main/java/io/xpipe/app/browser/file/BrowserFileSystemTabModel.java index e06f13239..d0d0b46fa 100644 --- a/app/src/main/java/io/xpipe/app/browser/fs/OpenFileSystemModel.java +++ b/app/src/main/java/io/xpipe/app/browser/file/BrowserFileSystemTabModel.java @@ -1,19 +1,12 @@ -package io.xpipe.app.browser.fs; +package io.xpipe.app.browser.file; -import io.xpipe.app.browser.BrowserSavedState; -import io.xpipe.app.browser.BrowserSavedStateImpl; -import io.xpipe.app.browser.BrowserTransferProgress; import io.xpipe.app.browser.action.BrowserAction; -import io.xpipe.app.browser.file.BrowserFileListModel; -import io.xpipe.app.browser.file.BrowserFileTransferMode; -import io.xpipe.app.browser.file.BrowserFileTransferOperation; -import io.xpipe.app.browser.file.FileSystemHelper; -import io.xpipe.app.browser.session.BrowserAbstractSessionModel; -import io.xpipe.app.browser.session.BrowserStoreSessionTab; +import io.xpipe.app.browser.BrowserAbstractSessionModel; +import io.xpipe.app.browser.BrowserStoreSessionTab; import io.xpipe.app.comp.base.ModalOverlayComp; import io.xpipe.app.ext.ProcessControlProvider; import io.xpipe.app.ext.ShellStore; -import io.xpipe.app.fxcomps.Comp; +import io.xpipe.app.comp.Comp; import io.xpipe.app.issue.ErrorEvent; import io.xpipe.app.storage.DataStorage; import io.xpipe.app.storage.DataStoreEntryRef; @@ -28,7 +21,6 @@ import io.xpipe.core.store.*; import io.xpipe.core.util.FailableConsumer; import io.xpipe.core.util.FailableRunnable; -import javafx.beans.Observable; import javafx.beans.binding.Bindings; import javafx.beans.property.*; @@ -46,21 +38,21 @@ import java.util.UUID; import java.util.stream.Stream; @Getter -public final class OpenFileSystemModel extends BrowserStoreSessionTab { +public final class BrowserFileSystemTabModel extends BrowserStoreSessionTab { private final Property filter = new SimpleStringProperty(); private final BrowserFileListModel fileList; private final ReadOnlyObjectWrapper currentPath = new ReadOnlyObjectWrapper<>(); - private final OpenFileSystemHistory history = new OpenFileSystemHistory(); + private final BrowserFileSystemHistory history = new BrowserFileSystemHistory(); private final Property overlay = new SimpleObjectProperty<>(); private final BooleanProperty inOverview = new SimpleBooleanProperty(); private final Property progress = new SimpleObjectProperty<>(); private final ObservableList terminalRequests = FXCollections.observableArrayList(); private FileSystem fileSystem; - private OpenFileSystemSavedState savedState; - private OpenFileSystemCache cache; + private BrowserFileSystemSavedState savedState; + private BrowserFileSystemCache cache; - public OpenFileSystemModel( + public BrowserFileSystemTabModel( BrowserAbstractSessionModel model, DataStoreEntryRef entry, SelectionMode selectionMode) { @@ -75,7 +67,7 @@ public final class OpenFileSystemModel extends BrowserStoreSessionTab comp() { - return new OpenFileSystemComp(this, true); + return new BrowserFileSystemTabComp(this, true); } @Override @@ -105,12 +97,12 @@ public final class OpenFileSystemModel extends BrowserStoreSessionTab lastSystems; - public BrowserSavedStateImpl(List lastSystems) { + public BrowserHistorySavedStateImpl(List lastSystems) { this.lastSystems = FXCollections.observableArrayList(lastSystems); } - private static BrowserSavedStateImpl INSTANCE; + private static BrowserHistorySavedStateImpl INSTANCE; - public static BrowserSavedState get() { + public static BrowserHistorySavedState get() { if (INSTANCE == null) { INSTANCE = load(); } return INSTANCE; } - private static BrowserSavedStateImpl load() { - return AppCache.getNonNull("browser-state", BrowserSavedStateImpl.class, () -> { - return new BrowserSavedStateImpl(FXCollections.observableArrayList()); + private static BrowserHistorySavedStateImpl load() { + return AppCache.getNonNull("browser-state", BrowserHistorySavedStateImpl.class, () -> { + return new BrowserHistorySavedStateImpl(FXCollections.observableArrayList()); }); } @Override - public synchronized void add(BrowserSavedState.Entry entry) { + public synchronized void add(BrowserHistorySavedState.Entry entry) { lastSystems.removeIf(s -> s.getUuid().equals(entry.getUuid())); lastSystems.addFirst(entry); if (lastSystems.size() > 15) { @@ -63,15 +63,15 @@ public class BrowserSavedStateImpl implements BrowserSavedState { return lastSystems; } - public static class Deserializer extends StdDeserializer { + public static class Deserializer extends StdDeserializer { protected Deserializer() { - super(BrowserSavedStateImpl.class); + super(BrowserHistorySavedStateImpl.class); } @Override @SneakyThrows - public BrowserSavedStateImpl deserialize(JsonParser p, DeserializationContext ctxt) { + public BrowserHistorySavedStateImpl deserialize(JsonParser p, DeserializationContext ctxt) { var tree = (ObjectNode) JacksonMapper.getDefault().readTree(p); JavaType javaType = JacksonMapper.getDefault().getTypeFactory().constructCollectionLikeType(List.class, Entry.class); @@ -79,7 +79,7 @@ public class BrowserSavedStateImpl implements BrowserSavedState { if (ls == null) { ls = List.of(); } - return new BrowserSavedStateImpl(ls); + return new BrowserHistorySavedStateImpl(ls); } } } diff --git a/app/src/main/java/io/xpipe/app/browser/BrowserWelcomeComp.java b/app/src/main/java/io/xpipe/app/browser/file/BrowserHistoryTabComp.java similarity index 88% rename from app/src/main/java/io/xpipe/app/browser/BrowserWelcomeComp.java rename to app/src/main/java/io/xpipe/app/browser/file/BrowserHistoryTabComp.java index 9c9f51340..bdd2adb68 100644 --- a/app/src/main/java/io/xpipe/app/browser/BrowserWelcomeComp.java +++ b/app/src/main/java/io/xpipe/app/browser/file/BrowserHistoryTabComp.java @@ -1,19 +1,19 @@ -package io.xpipe.app.browser; +package io.xpipe.app.browser.file; -import io.xpipe.app.browser.session.BrowserSessionModel; +import io.xpipe.app.browser.BrowserFullSessionModel; import io.xpipe.app.comp.base.ButtonComp; import io.xpipe.app.comp.base.ListBoxViewComp; import io.xpipe.app.comp.base.TileButtonComp; import io.xpipe.app.core.AppFont; import io.xpipe.app.core.AppI18n; -import io.xpipe.app.fxcomps.Comp; -import io.xpipe.app.fxcomps.SimpleComp; -import io.xpipe.app.fxcomps.impl.HorizontalComp; -import io.xpipe.app.fxcomps.impl.LabelComp; -import io.xpipe.app.fxcomps.impl.PrettyImageHelper; -import io.xpipe.app.fxcomps.impl.PrettySvgComp; -import io.xpipe.app.fxcomps.util.BindingsHelper; -import io.xpipe.app.fxcomps.util.DerivedObservableList; +import io.xpipe.app.comp.Comp; +import io.xpipe.app.comp.SimpleComp; +import io.xpipe.app.comp.base.HorizontalComp; +import io.xpipe.app.comp.base.LabelComp; +import io.xpipe.app.comp.base.PrettyImageHelper; +import io.xpipe.app.comp.base.PrettySvgComp; +import io.xpipe.app.util.BindingsHelper; +import io.xpipe.app.util.DerivedObservableList; import io.xpipe.app.storage.DataStorage; import io.xpipe.app.util.ThreadHelper; @@ -35,17 +35,17 @@ import atlantafx.base.theme.Styles; import java.util.List; -public class BrowserWelcomeComp extends SimpleComp { +public class BrowserHistoryTabComp extends SimpleComp { - private final BrowserSessionModel model; + private final BrowserFullSessionModel model; - public BrowserWelcomeComp(BrowserSessionModel model) { + public BrowserHistoryTabComp(BrowserFullSessionModel model) { this.model = model; } @Override protected Region createSimple() { - var state = BrowserSavedStateImpl.get(); + var state = BrowserHistorySavedStateImpl.get(); var welcome = new BrowserGreetingComp().createSimple(); @@ -144,7 +144,7 @@ public class BrowserWelcomeComp extends SimpleComp { return layout; } - private Comp entryButton(BrowserSavedState.Entry e, BooleanProperty disable) { + private Comp entryButton(BrowserHistorySavedState.Entry e, BooleanProperty disable) { var entry = DataStorage.get().getStoreEntryIfPresent(e.getUuid()); var graphic = entry.get().getEffectiveIconFile(); var view = PrettyImageHelper.ofFixedSize(graphic, 22, 16); @@ -167,7 +167,7 @@ public class BrowserWelcomeComp extends SimpleComp { .apply(struc -> struc.get().setAlignment(Pos.CENTER_LEFT)); } - private Comp dirButton(BrowserSavedState.Entry e, BooleanProperty disable) { + private Comp dirButton(BrowserHistorySavedState.Entry e, BooleanProperty disable) { return new ButtonComp(new SimpleStringProperty(e.getPath()), null, () -> { ThreadHelper.runAsync(() -> { model.restoreStateAsync(e, disable); diff --git a/app/src/main/java/io/xpipe/app/browser/BrowserHomeTabModel.java b/app/src/main/java/io/xpipe/app/browser/file/BrowserHistoryTabModel.java similarity index 51% rename from app/src/main/java/io/xpipe/app/browser/BrowserHomeTabModel.java rename to app/src/main/java/io/xpipe/app/browser/file/BrowserHistoryTabModel.java index cd144a8d6..3f9df43d9 100644 --- a/app/src/main/java/io/xpipe/app/browser/BrowserHomeTabModel.java +++ b/app/src/main/java/io/xpipe/app/browser/file/BrowserHistoryTabModel.java @@ -1,21 +1,21 @@ -package io.xpipe.app.browser; +package io.xpipe.app.browser.file; -import io.xpipe.app.browser.session.BrowserAbstractSessionModel; -import io.xpipe.app.browser.session.BrowserSessionModel; -import io.xpipe.app.browser.session.BrowserSessionTab; +import io.xpipe.app.browser.BrowserAbstractSessionModel; +import io.xpipe.app.browser.BrowserFullSessionModel; +import io.xpipe.app.browser.BrowserSessionTab; import io.xpipe.app.core.AppI18n; -import io.xpipe.app.fxcomps.Comp; +import io.xpipe.app.comp.Comp; import io.xpipe.app.storage.DataColor; -public final class BrowserHomeTabModel extends BrowserSessionTab { +public final class BrowserHistoryTabModel extends BrowserSessionTab { - public BrowserHomeTabModel(BrowserAbstractSessionModel browserModel) { - super(browserModel, AppI18n.get("overview")); + public BrowserHistoryTabModel(BrowserAbstractSessionModel browserModel) { + super(browserModel, AppI18n.get("history")); } @Override public Comp comp() { - return new BrowserWelcomeComp((BrowserSessionModel) browserModel); + return new BrowserHistoryTabComp((BrowserFullSessionModel) browserModel); } @Override diff --git a/app/src/main/java/io/xpipe/app/browser/file/LocalFileSystem.java b/app/src/main/java/io/xpipe/app/browser/file/BrowserLocalFileSystem.java similarity index 97% rename from app/src/main/java/io/xpipe/app/browser/file/LocalFileSystem.java rename to app/src/main/java/io/xpipe/app/browser/file/BrowserLocalFileSystem.java index 48b74d368..be37b6c40 100644 --- a/app/src/main/java/io/xpipe/app/browser/file/LocalFileSystem.java +++ b/app/src/main/java/io/xpipe/app/browser/file/BrowserLocalFileSystem.java @@ -8,7 +8,7 @@ import io.xpipe.core.store.FileSystem; import java.nio.file.Files; import java.nio.file.Path; -public class LocalFileSystem { +public class BrowserLocalFileSystem { private static FileSystem localFileSystem; diff --git a/app/src/main/java/io/xpipe/app/browser/BrowserNavBar.java b/app/src/main/java/io/xpipe/app/browser/file/BrowserNavBarComp.java similarity index 90% rename from app/src/main/java/io/xpipe/app/browser/BrowserNavBar.java rename to app/src/main/java/io/xpipe/app/browser/file/BrowserNavBarComp.java index 06fb8cd32..8c9c77cf1 100644 --- a/app/src/main/java/io/xpipe/app/browser/BrowserNavBar.java +++ b/app/src/main/java/io/xpipe/app/browser/file/BrowserNavBarComp.java @@ -1,15 +1,13 @@ -package io.xpipe.app.browser; +package io.xpipe.app.browser.file; -import io.xpipe.app.browser.file.BrowserContextMenu; -import io.xpipe.app.browser.fs.OpenFileSystemModel; -import io.xpipe.app.browser.icon.FileIconManager; -import io.xpipe.app.fxcomps.Comp; -import io.xpipe.app.fxcomps.CompStructure; -import io.xpipe.app.fxcomps.SimpleCompStructure; -import io.xpipe.app.fxcomps.augment.ContextMenuAugment; -import io.xpipe.app.fxcomps.impl.PrettyImageHelper; -import io.xpipe.app.fxcomps.impl.TextFieldComp; -import io.xpipe.app.fxcomps.impl.TooltipAugment; +import io.xpipe.app.browser.icon.BrowserIconManager; +import io.xpipe.app.comp.Comp; +import io.xpipe.app.comp.CompStructure; +import io.xpipe.app.comp.SimpleCompStructure; +import io.xpipe.app.comp.augment.ContextMenuAugment; +import io.xpipe.app.comp.base.PrettyImageHelper; +import io.xpipe.app.comp.base.TextFieldComp; +import io.xpipe.app.comp.base.TooltipAugment; import io.xpipe.app.util.BooleanScope; import io.xpipe.app.util.ThreadHelper; @@ -33,58 +31,16 @@ import javafx.scene.shape.Rectangle; import atlantafx.base.theme.Styles; import org.kordamp.ikonli.javafx.FontIcon; -public class BrowserNavBar extends Comp { +public class BrowserNavBarComp extends Comp { @Override public Structure createBase() { - var path = new SimpleStringProperty(model.getCurrentPath().get()); - model.getCurrentPath().subscribe((newValue) -> { - path.set(newValue); - }); - path.addListener((observable, oldValue, newValue) -> { - ThreadHelper.runFailableAsync(() -> { - BooleanScope.executeExclusive(model.getBusy(), () -> { - var changed = model.cdSyncOrRetry(newValue, true); - changed.ifPresent(s -> Platform.runLater(() -> path.set(s))); - }); - }); - }); - - var pathBar = new TextFieldComp(path, true) - .styleClass(Styles.CENTER_PILL) - .styleClass("path-text") - .apply(struc -> { - struc.get().focusedProperty().subscribe(val -> { - struc.get() - .pseudoClassStateChanged( - INVISIBLE, - !val && !model.getInOverview().get()); - - if (val) { - Platform.runLater(() -> { - struc.get().end(); - }); - } - }); - - model.getInOverview().subscribe(val -> { - // Pseudo classes do not apply if set instantly before shown - // If we start a new tab with a directory set, we have to set the pseudo class one pulse later - Platform.runLater(() -> { - struc.get() - .pseudoClassStateChanged( - INVISIBLE, !val && !struc.get().isFocused()); - }); - }); - - struc.get().setPromptText("Overview of " + model.getName()); - }) - .accessibleText("Current path"); + var pathBar = createPathBar(); var graphic = Bindings.createStringBinding( () -> { return model.getCurrentDirectory() != null - ? FileIconManager.getFileIcon(model.getCurrentDirectory()) + ? BrowserIconManager.getFileIcon(model.getCurrentDirectory()) : null; }, model.getCurrentPath()); @@ -154,6 +110,52 @@ public class BrowserNavBar extends Comp { return new Structure(topBox, pathRegion, historyButton); } + private Comp> createPathBar() { + var path = new SimpleStringProperty(model.getCurrentPath().get()); + model.getCurrentPath().subscribe((newValue) -> { + path.set(newValue); + }); + path.addListener((observable, oldValue, newValue) -> { + ThreadHelper.runFailableAsync(() -> { + BooleanScope.executeExclusive(model.getBusy(), () -> { + var changed = model.cdSyncOrRetry(newValue, true); + changed.ifPresent(s -> Platform.runLater(() -> path.set(s))); + }); + }); + }); + var pathBar = new TextFieldComp(path, true) + .styleClass(Styles.CENTER_PILL) + .styleClass("path-text"); + pathBar.apply(struc -> { + struc.get().focusedProperty().subscribe(val -> { + struc.get() + .pseudoClassStateChanged( + INVISIBLE, + !val && !model.getInOverview().get()); + + if (val) { + Platform.runLater(() -> { + struc.get().end(); + }); + } + }); + + model.getInOverview().subscribe(val -> { + // Pseudo classes do not apply if set instantly before shown + // If we start a new tab with a directory set, we have to set the pseudo class one pulse later + Platform.runLater(() -> { + struc.get() + .pseudoClassStateChanged( + INVISIBLE, !val && !struc.get().isFocused()); + }); + }); + + struc.get().setPromptText("Overview of " + model.getName()); + }) + .accessibleText("Current path"); + return pathBar; + } + public record Structure(HBox box, TextField textField, Button historyButton) implements CompStructure { @Override @@ -164,9 +166,9 @@ public class BrowserNavBar extends Comp { private static final PseudoClass INVISIBLE = PseudoClass.getPseudoClass("invisible"); - private final OpenFileSystemModel model; + private final BrowserFileSystemTabModel model; - public BrowserNavBar(OpenFileSystemModel model) { + public BrowserNavBarComp(BrowserFileSystemTabModel model) { this.model = model; } diff --git a/app/src/main/java/io/xpipe/app/browser/BrowserOverviewComp.java b/app/src/main/java/io/xpipe/app/browser/file/BrowserOverviewComp.java similarity index 88% rename from app/src/main/java/io/xpipe/app/browser/BrowserOverviewComp.java rename to app/src/main/java/io/xpipe/app/browser/file/BrowserOverviewComp.java index 76ed1d007..328e2cf74 100644 --- a/app/src/main/java/io/xpipe/app/browser/BrowserOverviewComp.java +++ b/app/src/main/java/io/xpipe/app/browser/file/BrowserOverviewComp.java @@ -1,13 +1,11 @@ -package io.xpipe.app.browser; +package io.xpipe.app.browser.file; -import io.xpipe.app.browser.file.BrowserFileOverviewComp; -import io.xpipe.app.browser.fs.OpenFileSystemModel; import io.xpipe.app.comp.base.SimpleTitledPaneComp; import io.xpipe.app.core.AppFont; import io.xpipe.app.core.AppI18n; -import io.xpipe.app.fxcomps.SimpleComp; -import io.xpipe.app.fxcomps.impl.VerticalComp; -import io.xpipe.app.fxcomps.util.DerivedObservableList; +import io.xpipe.app.comp.SimpleComp; +import io.xpipe.app.comp.base.VerticalComp; +import io.xpipe.app.util.DerivedObservableList; import io.xpipe.app.issue.ErrorEvent; import io.xpipe.app.util.ThreadHelper; import io.xpipe.core.process.ShellControl; @@ -25,9 +23,9 @@ import java.util.List; public class BrowserOverviewComp extends SimpleComp { - private final OpenFileSystemModel model; + private final BrowserFileSystemTabModel model; - public BrowserOverviewComp(OpenFileSystemModel model) { + public BrowserOverviewComp(BrowserFileSystemTabModel model) { this.model = model; } diff --git a/app/src/main/java/io/xpipe/app/browser/file/BrowserQuickAccessButtonComp.java b/app/src/main/java/io/xpipe/app/browser/file/BrowserQuickAccessButtonComp.java index 77b756e1e..d8382b5aa 100644 --- a/app/src/main/java/io/xpipe/app/browser/file/BrowserQuickAccessButtonComp.java +++ b/app/src/main/java/io/xpipe/app/browser/file/BrowserQuickAccessButtonComp.java @@ -1,8 +1,7 @@ package io.xpipe.app.browser.file; -import io.xpipe.app.browser.fs.OpenFileSystemModel; -import io.xpipe.app.fxcomps.SimpleComp; -import io.xpipe.app.fxcomps.impl.IconButtonComp; +import io.xpipe.app.comp.SimpleComp; +import io.xpipe.app.comp.base.IconButtonComp; import io.xpipe.app.util.InputHelper; import javafx.scene.layout.Region; @@ -12,9 +11,9 @@ import java.util.function.Supplier; public class BrowserQuickAccessButtonComp extends SimpleComp { private final Supplier base; - private final OpenFileSystemModel model; + private final BrowserFileSystemTabModel model; - public BrowserQuickAccessButtonComp(Supplier base, OpenFileSystemModel model) { + public BrowserQuickAccessButtonComp(Supplier base, BrowserFileSystemTabModel model) { this.base = base; this.model = model; } diff --git a/app/src/main/java/io/xpipe/app/browser/file/BrowserQuickAccessContextMenu.java b/app/src/main/java/io/xpipe/app/browser/file/BrowserQuickAccessContextMenu.java index 6f5735534..08f234aec 100644 --- a/app/src/main/java/io/xpipe/app/browser/file/BrowserQuickAccessContextMenu.java +++ b/app/src/main/java/io/xpipe/app/browser/file/BrowserQuickAccessContextMenu.java @@ -1,8 +1,7 @@ package io.xpipe.app.browser.file; -import io.xpipe.app.browser.fs.OpenFileSystemModel; -import io.xpipe.app.browser.icon.FileIconManager; -import io.xpipe.app.fxcomps.impl.PrettyImageHelper; +import io.xpipe.app.browser.icon.BrowserIconManager; +import io.xpipe.app.comp.base.PrettyImageHelper; import io.xpipe.app.util.BooleanAnimationTimer; import io.xpipe.app.util.InputHelper; import io.xpipe.app.util.ThreadHelper; @@ -32,13 +31,13 @@ import java.util.stream.Collectors; public class BrowserQuickAccessContextMenu extends ContextMenu { private final Supplier base; - private final OpenFileSystemModel model; + private final BrowserFileSystemTabModel model; private ContextMenu shownBrowserActionsMenu; private boolean expandBrowserActionMenuKey; private boolean keyBasedNavigation; private boolean closeBrowserActionMenuKey; - public BrowserQuickAccessContextMenu(Supplier base, OpenFileSystemModel model) { + public BrowserQuickAccessContextMenu(Supplier base, BrowserFileSystemTabModel model) { this.base = base; this.model = model; @@ -142,7 +141,7 @@ public class BrowserQuickAccessContextMenu extends ContextMenu { this.menu = new Menu( // Use original name, not the link target browserEntry.getRawFileEntry().getName(), - PrettyImageHelper.ofFixedSize(FileIconManager.getFileIcon(browserEntry.getRawFileEntry()), 24, 24) + PrettyImageHelper.ofFixedSize(BrowserIconManager.getFileIcon(browserEntry.getRawFileEntry()), 24, 24) .createRegion()); createMenu(); addInputListeners(); diff --git a/app/src/main/java/io/xpipe/app/browser/BrowserStatusBarComp.java b/app/src/main/java/io/xpipe/app/browser/file/BrowserStatusBarComp.java similarity index 91% rename from app/src/main/java/io/xpipe/app/browser/BrowserStatusBarComp.java rename to app/src/main/java/io/xpipe/app/browser/file/BrowserStatusBarComp.java index 43edfb8e3..7789d3b7d 100644 --- a/app/src/main/java/io/xpipe/app/browser/BrowserStatusBarComp.java +++ b/app/src/main/java/io/xpipe/app/browser/file/BrowserStatusBarComp.java @@ -1,16 +1,13 @@ -package io.xpipe.app.browser; +package io.xpipe.app.browser.file; -import io.xpipe.app.browser.file.BrowserContextMenu; -import io.xpipe.app.browser.file.BrowserFileListCompEntry; -import io.xpipe.app.browser.fs.OpenFileSystemModel; import io.xpipe.app.core.AppFont; -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.HorizontalComp; -import io.xpipe.app.fxcomps.impl.LabelComp; -import io.xpipe.app.fxcomps.util.BindingsHelper; +import io.xpipe.app.comp.Comp; +import io.xpipe.app.comp.SimpleComp; +import io.xpipe.app.comp.SimpleCompStructure; +import io.xpipe.app.comp.augment.ContextMenuAugment; +import io.xpipe.app.comp.base.HorizontalComp; +import io.xpipe.app.comp.base.LabelComp; +import io.xpipe.app.util.BindingsHelper; import io.xpipe.app.util.HumanReadableFormat; import javafx.beans.binding.Bindings; @@ -29,7 +26,7 @@ import java.util.List; @EqualsAndHashCode(callSuper = true) public class BrowserStatusBarComp extends SimpleComp { - OpenFileSystemModel model; + BrowserFileSystemTabModel model; @Override protected Region createSimple() { diff --git a/app/src/main/java/io/xpipe/app/browser/BrowserTerminalDockTabModel.java b/app/src/main/java/io/xpipe/app/browser/file/BrowserTerminalDockTabModel.java similarity index 90% rename from app/src/main/java/io/xpipe/app/browser/BrowserTerminalDockTabModel.java rename to app/src/main/java/io/xpipe/app/browser/file/BrowserTerminalDockTabModel.java index bd456a59f..82c681445 100644 --- a/app/src/main/java/io/xpipe/app/browser/BrowserTerminalDockTabModel.java +++ b/app/src/main/java/io/xpipe/app/browser/file/BrowserTerminalDockTabModel.java @@ -1,11 +1,11 @@ -package io.xpipe.app.browser; +package io.xpipe.app.browser.file; -import io.xpipe.app.browser.session.BrowserAbstractSessionModel; -import io.xpipe.app.browser.session.BrowserSessionModel; -import io.xpipe.app.browser.session.BrowserSessionTab; +import io.xpipe.app.browser.BrowserAbstractSessionModel; +import io.xpipe.app.browser.BrowserFullSessionModel; +import io.xpipe.app.browser.BrowserSessionTab; import io.xpipe.app.core.AppI18n; import io.xpipe.app.core.AppLayoutModel; -import io.xpipe.app.fxcomps.Comp; +import io.xpipe.app.comp.Comp; import io.xpipe.app.storage.DataColor; import io.xpipe.app.terminal.TerminalDockComp; import io.xpipe.app.terminal.TerminalDockModel; @@ -14,7 +14,6 @@ import io.xpipe.app.terminal.TerminalViewInstance; import javafx.application.Platform; import javafx.beans.binding.Bindings; import javafx.beans.value.ObservableBooleanValue; -import javafx.collections.FXCollections; import javafx.collections.ObservableList; import java.util.ArrayList; @@ -83,7 +82,7 @@ public final class BrowserTerminalDockTabModel extends BrowserSessionTab { public void onTerminalClosed(TerminalViewInstance instance) { terminals.remove(instance); if (terminals.isEmpty()) { - ((BrowserSessionModel) browserModel).unsplitTab(BrowserTerminalDockTabModel.this); + ((BrowserFullSessionModel) browserModel).unsplitTab(BrowserTerminalDockTabModel.this); } } }; diff --git a/app/src/main/java/io/xpipe/app/browser/BrowserTransferComp.java b/app/src/main/java/io/xpipe/app/browser/file/BrowserTransferComp.java similarity index 90% rename from app/src/main/java/io/xpipe/app/browser/BrowserTransferComp.java rename to app/src/main/java/io/xpipe/app/browser/file/BrowserTransferComp.java index dc722c250..79c274fc6 100644 --- a/app/src/main/java/io/xpipe/app/browser/BrowserTransferComp.java +++ b/app/src/main/java/io/xpipe/app/browser/file/BrowserTransferComp.java @@ -1,13 +1,11 @@ -package io.xpipe.app.browser; +package io.xpipe.app.browser.file; -import io.xpipe.app.browser.fs.OpenFileSystemModel; +import io.xpipe.app.comp.base.*; import io.xpipe.app.core.AppFont; import io.xpipe.app.core.AppI18n; -import io.xpipe.app.fxcomps.Comp; -import io.xpipe.app.fxcomps.SimpleComp; -import io.xpipe.app.fxcomps.augment.DragOverPseudoClassAugment; -import io.xpipe.app.fxcomps.impl.*; -import io.xpipe.app.fxcomps.util.DerivedObservableList; +import io.xpipe.app.comp.Comp; +import io.xpipe.app.comp.SimpleComp; +import io.xpipe.app.util.DerivedObservableList; import io.xpipe.app.util.ThreadHelper; import javafx.beans.binding.Bindings; @@ -17,6 +15,7 @@ import javafx.css.PseudoClass; import javafx.geometry.Insets; import javafx.scene.image.Image; import javafx.scene.input.ClipboardContent; +import javafx.scene.input.DragEvent; import javafx.scene.input.Dragboard; import javafx.scene.input.TransferMode; import javafx.scene.layout.Region; @@ -52,7 +51,7 @@ public class BrowserTransferComp extends SimpleComp { var binding = new DerivedObservableList<>(model.getItems(), true) .mapped(item -> item.getBrowserEntry()) .getList(); - var list = new BrowserSelectionListComp(binding, entry -> { + var list = new BrowserFileSelectionListComp(binding, entry -> { var sourceItem = model.getCurrentItems().stream() .filter(item -> item.getBrowserEntry() == entry) .findAny(); @@ -106,8 +105,12 @@ public class BrowserTransferComp extends SimpleComp { .apply(struc -> struc.get().setMinHeight(200)) .apply(struc -> struc.get().setMaxHeight(200)); var stack = new StackComp(List.of(backgroundStack, listBox)) - .apply(DragOverPseudoClassAugment.create()) .apply(struc -> { + struc.get().addEventFilter(DragEvent.DRAG_ENTERED, event -> { + struc.get().pseudoClassStateChanged(PseudoClass.getPseudoClass("drag-over"), true); + }); + struc.get().addEventFilter(DragEvent.DRAG_EXITED, event -> struc.get() + .pseudoClassStateChanged(PseudoClass.getPseudoClass("drag-over"), false)); struc.get().setOnDragOver(event -> { // Accept drops from inside the app window if (event.getGestureSource() != null && event.getGestureSource() != struc.get()) { @@ -126,7 +129,7 @@ public class BrowserTransferComp extends SimpleComp { if (!(model.getBrowserSessionModel() .getSelectedEntry() .getValue() - instanceof OpenFileSystemModel fileSystemModel)) { + instanceof BrowserFileSystemTabModel fileSystemModel)) { return; } @@ -166,7 +169,7 @@ public class BrowserTransferComp extends SimpleComp { Dragboard db = struc.get().startDragAndDrop(TransferMode.COPY); db.setContent(cc); - Image image = BrowserSelectionListComp.snapshot(FXCollections.observableList(selected)); + Image image = BrowserFileSelectionListComp.snapshot(FXCollections.observableList(selected)); db.setDragView(image, -20, 15); event.setDragDetect(true); diff --git a/app/src/main/java/io/xpipe/app/browser/BrowserTransferModel.java b/app/src/main/java/io/xpipe/app/browser/file/BrowserTransferModel.java similarity index 89% rename from app/src/main/java/io/xpipe/app/browser/BrowserTransferModel.java rename to app/src/main/java/io/xpipe/app/browser/file/BrowserTransferModel.java index 7e568ba7f..9d1d0e37c 100644 --- a/app/src/main/java/io/xpipe/app/browser/BrowserTransferModel.java +++ b/app/src/main/java/io/xpipe/app/browser/file/BrowserTransferModel.java @@ -1,11 +1,6 @@ -package io.xpipe.app.browser; +package io.xpipe.app.browser.file; -import io.xpipe.app.browser.file.BrowserEntry; -import io.xpipe.app.browser.file.BrowserFileTransferMode; -import io.xpipe.app.browser.file.BrowserFileTransferOperation; -import io.xpipe.app.browser.file.LocalFileSystem; -import io.xpipe.app.browser.fs.OpenFileSystemModel; -import io.xpipe.app.browser.session.BrowserSessionModel; +import io.xpipe.app.browser.BrowserFullSessionModel; import io.xpipe.app.issue.ErrorEvent; import io.xpipe.app.util.DesktopHelper; import io.xpipe.app.util.ShellTemp; @@ -34,11 +29,11 @@ public class BrowserTransferModel { private static final Path TEMP = ShellTemp.getLocalTempDataDirectory("download"); - BrowserSessionModel browserSessionModel; + BrowserFullSessionModel browserSessionModel; ObservableList items = FXCollections.observableArrayList(); ObservableBooleanValue empty = Bindings.createBooleanBinding(() -> items.isEmpty(), items); - public BrowserTransferModel(BrowserSessionModel browserSessionModel) { + public BrowserTransferModel(BrowserFullSessionModel browserSessionModel) { this.browserSessionModel = browserSessionModel; var thread = ThreadHelper.createPlatformThread("file downloader", true, () -> { while (true) { @@ -96,7 +91,7 @@ public class BrowserTransferModel { } } - public void drop(OpenFileSystemModel model, List entries) { + public void drop(BrowserFileSystemTabModel model, List entries) { synchronized (items) { entries.forEach(entry -> { var name = entry.getFileName(); @@ -130,7 +125,7 @@ public class BrowserTransferModel { try { var op = new BrowserFileTransferOperation( - LocalFileSystem.getLocalFileEntry(TEMP), + BrowserLocalFileSystem.getLocalFileEntry(TEMP), List.of(item.getBrowserEntry().getRawFileEntry()), BrowserFileTransferMode.COPY, false, @@ -190,13 +185,13 @@ public class BrowserTransferModel { @Value public static class Item { - OpenFileSystemModel openFileSystemModel; + BrowserFileSystemTabModel openFileSystemModel; String name; BrowserEntry browserEntry; Path localFile; Property progress; - public Item(OpenFileSystemModel openFileSystemModel, String name, BrowserEntry browserEntry, Path localFile) { + public Item(BrowserFileSystemTabModel openFileSystemModel, String name, BrowserEntry browserEntry, Path localFile) { this.openFileSystemModel = openFileSystemModel; this.name = name; this.browserEntry = browserEntry; diff --git a/app/src/main/java/io/xpipe/app/browser/BrowserTransferProgress.java b/app/src/main/java/io/xpipe/app/browser/file/BrowserTransferProgress.java similarity index 96% rename from app/src/main/java/io/xpipe/app/browser/BrowserTransferProgress.java rename to app/src/main/java/io/xpipe/app/browser/file/BrowserTransferProgress.java index 7486afdb6..99b7e291d 100644 --- a/app/src/main/java/io/xpipe/app/browser/BrowserTransferProgress.java +++ b/app/src/main/java/io/xpipe/app/browser/file/BrowserTransferProgress.java @@ -1,4 +1,4 @@ -package io.xpipe.app.browser; +package io.xpipe.app.browser.file; import lombok.Value; diff --git a/app/src/main/java/io/xpipe/app/browser/icon/BrowserIconDirectoryType.java b/app/src/main/java/io/xpipe/app/browser/icon/BrowserIconDirectoryType.java index b417c92d1..9a89cd3a2 100644 --- a/app/src/main/java/io/xpipe/app/browser/icon/BrowserIconDirectoryType.java +++ b/app/src/main/java/io/xpipe/app/browser/icon/BrowserIconDirectoryType.java @@ -63,7 +63,7 @@ public abstract class BrowserIconDirectoryType { var closedIcon = "browser/" + split[2].trim(); var lightClosedIcon = split.length > 4 ? "browser/" + split[4].trim() : closedIcon; - ALL.add(new Simple(id, new IconVariant(lightClosedIcon, closedIcon), filter)); + ALL.add(new Simple(id, new BrowserIconVariant(lightClosedIcon, closedIcon), filter)); } } }); @@ -84,10 +84,10 @@ public abstract class BrowserIconDirectoryType { @Getter private final String id; - private final IconVariant closed; + private final BrowserIconVariant closed; private final Set names; - public Simple(String id, IconVariant closed, Set names) { + public Simple(String id, BrowserIconVariant closed, Set names) { this.id = id; this.closed = closed; this.names = names; diff --git a/app/src/main/java/io/xpipe/app/browser/icon/BrowserIconFileType.java b/app/src/main/java/io/xpipe/app/browser/icon/BrowserIconFileType.java index 4293aa2b6..0c8306405 100644 --- a/app/src/main/java/io/xpipe/app/browser/icon/BrowserIconFileType.java +++ b/app/src/main/java/io/xpipe/app/browser/icon/BrowserIconFileType.java @@ -69,11 +69,11 @@ public abstract class BrowserIconFileType { public static class Simple extends BrowserIconFileType { private final String id; - private final IconVariant icon; + private final BrowserIconVariant icon; private final Set endings; public Simple(String id, String lightIcon, String darkIcon, Set endings) { - this.icon = new IconVariant(lightIcon, darkIcon); + this.icon = new BrowserIconVariant(lightIcon, darkIcon); this.id = id; this.endings = endings; } diff --git a/app/src/main/java/io/xpipe/app/browser/icon/FileIconManager.java b/app/src/main/java/io/xpipe/app/browser/icon/BrowserIconManager.java similarity index 96% rename from app/src/main/java/io/xpipe/app/browser/icon/FileIconManager.java rename to app/src/main/java/io/xpipe/app/browser/icon/BrowserIconManager.java index 1b28618df..6e7a4ebb9 100644 --- a/app/src/main/java/io/xpipe/app/browser/icon/FileIconManager.java +++ b/app/src/main/java/io/xpipe/app/browser/icon/BrowserIconManager.java @@ -3,7 +3,7 @@ package io.xpipe.app.browser.icon; import io.xpipe.core.store.FileEntry; import io.xpipe.core.store.FileKind; -public class FileIconManager { +public class BrowserIconManager { private static boolean loaded; diff --git a/app/src/main/java/io/xpipe/app/browser/icon/IconVariant.java b/app/src/main/java/io/xpipe/app/browser/icon/BrowserIconVariant.java similarity index 77% rename from app/src/main/java/io/xpipe/app/browser/icon/IconVariant.java rename to app/src/main/java/io/xpipe/app/browser/icon/BrowserIconVariant.java index 96eef3fa2..820ed2f1e 100644 --- a/app/src/main/java/io/xpipe/app/browser/icon/IconVariant.java +++ b/app/src/main/java/io/xpipe/app/browser/icon/BrowserIconVariant.java @@ -2,16 +2,16 @@ package io.xpipe.app.browser.icon; import io.xpipe.app.prefs.AppPrefs; -public class IconVariant { +public class BrowserIconVariant { private final String lightIcon; private final String darkIcon; - public IconVariant(String icon) { + public BrowserIconVariant(String icon) { this(icon, icon); } - public IconVariant(String lightIcon, String darkIcon) { + public BrowserIconVariant(String lightIcon, String darkIcon) { this.lightIcon = lightIcon; this.darkIcon = darkIcon; } diff --git a/app/src/main/java/io/xpipe/app/browser/icon/BrowserIcons.java b/app/src/main/java/io/xpipe/app/browser/icon/BrowserIcons.java index 18fc39bde..1d771981d 100644 --- a/app/src/main/java/io/xpipe/app/browser/icon/BrowserIcons.java +++ b/app/src/main/java/io/xpipe/app/browser/icon/BrowserIcons.java @@ -1,7 +1,7 @@ package io.xpipe.app.browser.icon; -import io.xpipe.app.fxcomps.Comp; -import io.xpipe.app.fxcomps.impl.PrettyImageHelper; +import io.xpipe.app.comp.Comp; +import io.xpipe.app.comp.base.PrettyImageHelper; import io.xpipe.core.store.FileEntry; public class BrowserIcons { @@ -19,6 +19,6 @@ public class BrowserIcons { } public static Comp createIcon(FileEntry entry) { - return PrettyImageHelper.ofFixedSizeSquare(FileIconManager.getFileIcon(entry), 24); + return PrettyImageHelper.ofFixedSizeSquare(BrowserIconManager.getFileIcon(entry), 24); } } diff --git a/app/src/main/java/io/xpipe/app/fxcomps/Comp.java b/app/src/main/java/io/xpipe/app/comp/Comp.java similarity index 95% rename from app/src/main/java/io/xpipe/app/fxcomps/Comp.java rename to app/src/main/java/io/xpipe/app/comp/Comp.java index 9cd68e6f1..c574c492c 100644 --- a/app/src/main/java/io/xpipe/app/fxcomps/Comp.java +++ b/app/src/main/java/io/xpipe/app/comp/Comp.java @@ -1,11 +1,11 @@ -package io.xpipe.app.fxcomps; +package io.xpipe.app.comp; import io.xpipe.app.core.AppI18n; -import io.xpipe.app.fxcomps.augment.Augment; -import io.xpipe.app.fxcomps.augment.GrowAugment; -import io.xpipe.app.fxcomps.impl.TooltipAugment; -import io.xpipe.app.fxcomps.util.BindingsHelper; -import io.xpipe.app.fxcomps.util.PlatformThread; +import io.xpipe.app.comp.augment.Augment; +import io.xpipe.app.comp.augment.GrowAugment; +import io.xpipe.app.comp.base.TooltipAugment; +import io.xpipe.app.util.BindingsHelper; +import io.xpipe.app.util.PlatformThread; import javafx.application.Platform; import javafx.beans.value.ObservableValue; diff --git a/app/src/main/java/io/xpipe/app/fxcomps/CompStructure.java b/app/src/main/java/io/xpipe/app/comp/CompStructure.java similarity index 77% rename from app/src/main/java/io/xpipe/app/fxcomps/CompStructure.java rename to app/src/main/java/io/xpipe/app/comp/CompStructure.java index 0b625f479..bd4b29feb 100644 --- a/app/src/main/java/io/xpipe/app/fxcomps/CompStructure.java +++ b/app/src/main/java/io/xpipe/app/comp/CompStructure.java @@ -1,4 +1,4 @@ -package io.xpipe.app.fxcomps; +package io.xpipe.app.comp; import javafx.scene.layout.Region; diff --git a/app/src/main/java/io/xpipe/app/comp/DeveloperTabComp.java b/app/src/main/java/io/xpipe/app/comp/DeveloperTabComp.java deleted file mode 100644 index a6d4d12e5..000000000 --- a/app/src/main/java/io/xpipe/app/comp/DeveloperTabComp.java +++ /dev/null @@ -1,59 +0,0 @@ -package io.xpipe.app.comp; - -import io.xpipe.app.comp.base.ButtonComp; -import io.xpipe.app.core.AppI18n; -import io.xpipe.app.core.mode.OperationMode; -import io.xpipe.app.fxcomps.SimpleComp; -import io.xpipe.app.issue.ErrorEvent; - -import javafx.scene.layout.HBox; -import javafx.scene.layout.Region; - -import java.nio.file.Path; - -public class DeveloperTabComp extends SimpleComp { - - @Override - protected Region createSimple() { - var button = new ButtonComp(AppI18n.observable("Throw exception"), null, () -> { - throw new IllegalStateException(); - }); - - var button2 = new ButtonComp(AppI18n.observable("Throw exception with file"), null, () -> { - try { - throw new IllegalStateException(); - } catch (Exception ex) { - ErrorEvent.fromThrowable(ex) - .attachment(Path.of("extensions.txt")) - .build() - .handle(); - } - }); - - var button3 = new ButtonComp(AppI18n.observable("Exit"), null, () -> { - System.exit(0); - }); - - var button6 = new ButtonComp(AppI18n.observable("Restart"), null, () -> { - OperationMode.restart(); - }); - - var button4 = new ButtonComp(AppI18n.observable("Throw terminal exception"), null, () -> { - try { - throw new IllegalStateException(); - } catch (Exception ex) { - ErrorEvent.fromThrowable(ex).terminal(true).build().handle(); - } - }); - - var button5 = new ButtonComp(AppI18n.observable("Operation mode null"), null, OperationMode::close); - - return new HBox( - button.createRegion(), - button2.createRegion(), - button3.createRegion(), - button4.createRegion(), - button5.createRegion(), - button6.createRegion()); - } -} diff --git a/app/src/main/java/io/xpipe/app/fxcomps/README.md b/app/src/main/java/io/xpipe/app/comp/README.md similarity index 100% rename from app/src/main/java/io/xpipe/app/fxcomps/README.md rename to app/src/main/java/io/xpipe/app/comp/README.md diff --git a/app/src/main/java/io/xpipe/app/fxcomps/SimpleComp.java b/app/src/main/java/io/xpipe/app/comp/SimpleComp.java similarity index 90% rename from app/src/main/java/io/xpipe/app/fxcomps/SimpleComp.java rename to app/src/main/java/io/xpipe/app/comp/SimpleComp.java index 9a3b41371..63eb8a85e 100644 --- a/app/src/main/java/io/xpipe/app/fxcomps/SimpleComp.java +++ b/app/src/main/java/io/xpipe/app/comp/SimpleComp.java @@ -1,4 +1,4 @@ -package io.xpipe.app.fxcomps; +package io.xpipe.app.comp; import javafx.scene.layout.Region; diff --git a/app/src/main/java/io/xpipe/app/fxcomps/SimpleCompStructure.java b/app/src/main/java/io/xpipe/app/comp/SimpleCompStructure.java similarity index 90% rename from app/src/main/java/io/xpipe/app/fxcomps/SimpleCompStructure.java rename to app/src/main/java/io/xpipe/app/comp/SimpleCompStructure.java index 460d6625a..2315e5588 100644 --- a/app/src/main/java/io/xpipe/app/fxcomps/SimpleCompStructure.java +++ b/app/src/main/java/io/xpipe/app/comp/SimpleCompStructure.java @@ -1,4 +1,4 @@ -package io.xpipe.app.fxcomps; +package io.xpipe.app.comp; import javafx.scene.layout.Region; diff --git a/app/src/main/java/io/xpipe/app/fxcomps/augment/Augment.java b/app/src/main/java/io/xpipe/app/comp/augment/Augment.java similarity index 68% rename from app/src/main/java/io/xpipe/app/fxcomps/augment/Augment.java rename to app/src/main/java/io/xpipe/app/comp/augment/Augment.java index 82e39b0a8..93426827a 100644 --- a/app/src/main/java/io/xpipe/app/fxcomps/augment/Augment.java +++ b/app/src/main/java/io/xpipe/app/comp/augment/Augment.java @@ -1,7 +1,7 @@ -package io.xpipe.app.fxcomps.augment; +package io.xpipe.app.comp.augment; -import io.xpipe.app.fxcomps.CompStructure; -import io.xpipe.app.fxcomps.SimpleCompStructure; +import io.xpipe.app.comp.CompStructure; +import io.xpipe.app.comp.SimpleCompStructure; import javafx.scene.Node; import javafx.scene.layout.Region; diff --git a/app/src/main/java/io/xpipe/app/fxcomps/augment/ContextMenuAugment.java b/app/src/main/java/io/xpipe/app/comp/augment/ContextMenuAugment.java similarity index 97% rename from app/src/main/java/io/xpipe/app/fxcomps/augment/ContextMenuAugment.java rename to app/src/main/java/io/xpipe/app/comp/augment/ContextMenuAugment.java index 87b86d4e2..c2e0f3bce 100644 --- a/app/src/main/java/io/xpipe/app/fxcomps/augment/ContextMenuAugment.java +++ b/app/src/main/java/io/xpipe/app/comp/augment/ContextMenuAugment.java @@ -1,6 +1,6 @@ -package io.xpipe.app.fxcomps.augment; +package io.xpipe.app.comp.augment; -import io.xpipe.app.fxcomps.CompStructure; +import io.xpipe.app.comp.CompStructure; import javafx.event.ActionEvent; import javafx.geometry.Side; diff --git a/app/src/main/java/io/xpipe/app/fxcomps/augment/GrowAugment.java b/app/src/main/java/io/xpipe/app/comp/augment/GrowAugment.java similarity index 97% rename from app/src/main/java/io/xpipe/app/fxcomps/augment/GrowAugment.java rename to app/src/main/java/io/xpipe/app/comp/augment/GrowAugment.java index 7dbac0fa5..cafdb5349 100644 --- a/app/src/main/java/io/xpipe/app/fxcomps/augment/GrowAugment.java +++ b/app/src/main/java/io/xpipe/app/comp/augment/GrowAugment.java @@ -1,6 +1,6 @@ -package io.xpipe.app.fxcomps.augment; +package io.xpipe.app.comp.augment; -import io.xpipe.app.fxcomps.CompStructure; +import io.xpipe.app.comp.CompStructure; import javafx.beans.binding.Bindings; import javafx.scene.Node; diff --git a/app/src/main/java/io/xpipe/app/fxcomps/impl/AnchorComp.java b/app/src/main/java/io/xpipe/app/comp/base/AnchorComp.java similarity index 77% rename from app/src/main/java/io/xpipe/app/fxcomps/impl/AnchorComp.java rename to app/src/main/java/io/xpipe/app/comp/base/AnchorComp.java index 393d30935..7959d47ec 100644 --- a/app/src/main/java/io/xpipe/app/fxcomps/impl/AnchorComp.java +++ b/app/src/main/java/io/xpipe/app/comp/base/AnchorComp.java @@ -1,8 +1,8 @@ -package io.xpipe.app.fxcomps.impl; +package io.xpipe.app.comp.base; -import io.xpipe.app.fxcomps.Comp; -import io.xpipe.app.fxcomps.CompStructure; -import io.xpipe.app.fxcomps.SimpleCompStructure; +import io.xpipe.app.comp.Comp; +import io.xpipe.app.comp.CompStructure; +import io.xpipe.app.comp.SimpleCompStructure; import javafx.scene.layout.AnchorPane; diff --git a/app/src/main/java/io/xpipe/app/comp/AppLayoutComp.java b/app/src/main/java/io/xpipe/app/comp/base/AppLayoutComp.java similarity index 90% rename from app/src/main/java/io/xpipe/app/comp/AppLayoutComp.java rename to app/src/main/java/io/xpipe/app/comp/base/AppLayoutComp.java index 20c2164b8..626bfce50 100644 --- a/app/src/main/java/io/xpipe/app/comp/AppLayoutComp.java +++ b/app/src/main/java/io/xpipe/app/comp/base/AppLayoutComp.java @@ -1,17 +1,14 @@ -package io.xpipe.app.comp; +package io.xpipe.app.comp.base; -import io.xpipe.app.comp.base.MultiContentComp; -import io.xpipe.app.comp.base.SideMenuBarComp; +import io.xpipe.app.comp.Comp; +import io.xpipe.app.comp.CompStructure; +import io.xpipe.app.comp.SimpleCompStructure; import io.xpipe.app.comp.store.StoreViewState; import io.xpipe.app.core.AppFont; import io.xpipe.app.core.AppLayoutModel; -import io.xpipe.app.fxcomps.Comp; -import io.xpipe.app.fxcomps.CompStructure; -import io.xpipe.app.fxcomps.SimpleCompStructure; import io.xpipe.app.prefs.AppPrefs; import io.xpipe.app.storage.DataStorage; -import io.xpipe.app.terminal.TerminalView; import javafx.beans.binding.Bindings; import javafx.beans.value.ObservableValue; import javafx.scene.Parent; diff --git a/app/src/main/java/io/xpipe/app/comp/base/BackgroundImageComp.java b/app/src/main/java/io/xpipe/app/comp/base/BackgroundImageComp.java deleted file mode 100644 index 571a4f376..000000000 --- a/app/src/main/java/io/xpipe/app/comp/base/BackgroundImageComp.java +++ /dev/null @@ -1,62 +0,0 @@ -package io.xpipe.app.comp.base; - -import io.xpipe.app.fxcomps.Comp; -import io.xpipe.app.fxcomps.CompStructure; -import io.xpipe.app.fxcomps.SimpleCompStructure; - -import javafx.beans.value.ChangeListener; -import javafx.geometry.Rectangle2D; -import javafx.scene.image.Image; -import javafx.scene.image.ImageView; -import javafx.scene.layout.Pane; - -public class BackgroundImageComp extends Comp> { - - private final Image image; - - public BackgroundImageComp(Image image) { - this.image = image; - } - - @Override - public CompStructure createBase() { - ImageView v = new ImageView(image); - Pane pane = new Pane(v); - v.fitWidthProperty().bind(pane.widthProperty()); - v.fitHeightProperty().bind(pane.heightProperty()); - if (image == null) { - return new SimpleCompStructure<>(pane); - } - - double imageAspect = image.getWidth() / image.getHeight(); - ChangeListener cl = (c, o, n) -> { - double paneAspect = pane.getWidth() / pane.getHeight(); - - double relViewportWidth; - double relViewportHeight; - - // Pane width too big for image - if (paneAspect > imageAspect) { - relViewportWidth = 1; - double newImageHeight = pane.getWidth() / imageAspect; - relViewportHeight = Math.min(1, pane.getHeight() / newImageHeight); - } - - // Height too big - else { - relViewportHeight = 1; - double newImageWidth = pane.getHeight() * imageAspect; - relViewportWidth = Math.min(1, pane.getWidth() / newImageWidth); - } - - v.setViewport(new Rectangle2D( - ((1 - relViewportWidth) / 2.0) * image.getWidth(), - ((1 - relViewportHeight) / 2.0) * image.getHeight(), - image.getWidth() * relViewportWidth, - image.getHeight() * relViewportHeight)); - }; - pane.widthProperty().addListener(cl); - pane.heightProperty().addListener(cl); - return new SimpleCompStructure<>(pane); - } -} diff --git a/app/src/main/java/io/xpipe/app/comp/base/BigIconButton.java b/app/src/main/java/io/xpipe/app/comp/base/BigIconButton.java deleted file mode 100644 index ded5b634b..000000000 --- a/app/src/main/java/io/xpipe/app/comp/base/BigIconButton.java +++ /dev/null @@ -1,66 +0,0 @@ -package io.xpipe.app.comp.base; - -import io.xpipe.app.fxcomps.CompStructure; - -import javafx.beans.value.ObservableValue; -import javafx.geometry.Pos; -import javafx.scene.Node; -import javafx.scene.control.Button; -import javafx.scene.control.Label; -import javafx.scene.layout.StackPane; -import javafx.scene.layout.VBox; - -import lombok.Builder; -import lombok.Value; - -public class BigIconButton extends ButtonComp { - - public BigIconButton(ObservableValue name, Node graphic, Runnable listener) { - super(name, graphic, listener); - } - - @Override - public Structure createBase() { - var vbox = new VBox(); - vbox.getStyleClass().add("vbox"); - vbox.setAlignment(Pos.CENTER); - - var icon = new StackPane(getGraphic()); - icon.setAlignment(Pos.CENTER); - icon.getStyleClass().add("icon"); - vbox.getChildren().add(icon); - - var label = new Label(); - label.textProperty().bind(getName()); - label.getStyleClass().add("name"); - vbox.getChildren().add(label); - - var b = new Button(null); - b.accessibleTextProperty().bind(getName()); - b.setGraphic(vbox); - b.setOnAction(e -> getListener().run()); - b.getStyleClass().add("big-icon-button-comp"); - return Structure.builder() - .stack(vbox) - .graphic(getGraphic()) - .graphicPane(icon) - .text(label) - .button(b) - .build(); - } - - @Value - @Builder - public static class Structure implements CompStructure