flea-qml 0.0.0-stage → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +22 -0
- package/README.md +511 -2
- package/THIRD-PARTY-NOTICES.md +29 -0
- package/demos/App.java +5 -0
- package/demos/Dockerfile +4 -0
- package/demos/Main.kt +3 -0
- package/demos/Program.cs +1 -0
- package/demos/README.md +12 -0
- package/demos/app.dart +3 -0
- package/demos/app.deb +0 -0
- package/demos/app.js +1 -0
- package/demos/backup.tar +0 -0
- package/demos/budget.xlsx +0 -0
- package/demos/build.sh +2 -0
- package/demos/bundle.zip +0 -0
- package/demos/clip.mp4 +0 -0
- package/demos/data.sqlite +0 -0
- package/demos/disk.iso +0 -0
- package/demos/engine.cpp +5 -0
- package/demos/firmware.bin +0 -0
- package/demos/flake.nix +4 -0
- package/demos/folder/inside.txt +1 -0
- package/demos/font.ttf +0 -0
- package/demos/index.html +5 -0
- package/demos/index.php +2 -0
- package/demos/init.lua +1 -0
- package/demos/letter.docx +0 -0
- package/demos/lib.rs +3 -0
- package/demos/main.c +6 -0
- package/demos/main.h +3 -0
- package/demos/math-and-diagrams.md +200 -0
- package/demos/notes.tar.gz +0 -0
- package/demos/notes.txt +3 -0
- package/demos/photo.png +0 -0
- package/demos/program +2 -0
- package/demos/report.pdf +32 -0
- package/demos/script.py +1 -0
- package/demos/server.go +7 -0
- package/demos/settings.json +4 -0
- package/demos/slides.pptx +0 -0
- package/demos/song.mp3 +0 -0
- package/demos/style.css +4 -0
- package/demos/tool.rb +1 -0
- package/demos/types.ts +2 -0
- package/docs/pele.md +23 -0
- package/docs/protocol.md +3420 -0
- package/docs/temml.md +63 -0
- package/index.js +107 -0
- package/package.json +34 -4
- package/src/archive.js +407 -0
- package/src/archiveops.js +728 -0
- package/src/backend.js +369 -0
- package/src/bulkrename.js +95 -0
- package/src/clip-host.js +76 -0
- package/src/clip.js +462 -0
- package/src/code.js +168 -0
- package/src/compare.js +74 -0
- package/src/create.js +128 -0
- package/src/dirsize.js +147 -0
- package/src/figure-svg.js +530 -0
- package/src/figure-thread.js +23 -0
- package/src/figure.js +132 -0
- package/src/find.js +55 -0
- package/src/flea.js +39 -0
- package/src/fsinfo.js +39 -0
- package/src/highlight.js +141 -0
- package/src/html.js +52 -0
- package/src/kinds.js +89 -0
- package/src/listing.js +130 -0
- package/src/markdown-html.js +317 -0
- package/src/mathml.js +186 -0
- package/src/menu.js +180 -0
- package/src/meta.js +135 -0
- package/src/office.js +810 -0
- package/src/order.js +100 -0
- package/src/peek.js +49 -0
- package/src/pele-wrapper.js +695 -0
- package/src/permissions.js +180 -0
- package/src/places.js +313 -0
- package/src/preview-language.js +10 -0
- package/src/terminal-server.js +95 -0
- package/src/terminal-shell.js +26 -0
- package/src/transfer.js +669 -0
- package/src/trash-record.js +41 -0
- package/src/trash.js +210 -0
- package/src/trashbrowse.js +327 -0
- package/src/uistate.js +393 -0
- package/src/uistore.js +168 -0
- package/src/vendor/LICENSES/Apache-2.0.txt +202 -0
- package/src/vendor/LICENSES/MIT-katex-2015.txt +27 -0
- package/src/vendor/LICENSES/MIT-katex.txt +21 -0
- package/src/vendor/LICENSES/MIT-mermaid.txt +21 -0
- package/src/vendor/LICENSES/MIT-pele.txt +40 -0
- package/src/vendor/LICENSES/MIT-perseus.txt +18 -0
- package/src/vendor/LICENSES/MIT-temml.txt +21 -0
- package/src/vendor/pele.js +145 -0
- package/src/vendor/temml.mjs +14708 -0
- package/src/watch.js +98 -0
- package/src/wayland/client.js +109 -0
- package/src/wayland/protocol.js +55 -0
- package/src/wayland/protocols/ext-data-control-v1.xml +276 -0
- package/src/wayland/protocols/wayland.xml +3248 -0
- package/src/wayland/protocols/wlr-data-control-unstable-v1.xml +278 -0
- package/src/wayland/resource-io.js +6 -0
- package/src/wayland/socket-discovery.js +26 -0
- package/src/wayland/transport-posix.js +120 -0
- package/src/wayland/transport-win32.js +11 -0
- package/src/wayland/transport.js +3 -0
- package/src/wayland/win32-resources.js +80 -0
- package/src/wayland/win32-wire.js +62 -0
- package/test/archive.test.js +80 -0
- package/test/bench-markdown-scroll.mjs +190 -0
- package/test/clip-host.test.js +113 -0
- package/test/code-preview.test.js +35 -0
- package/test/compare-ui-paths.test.js +24 -0
- package/test/compare.test.js +54 -0
- package/test/delete-trash.test.js +67 -0
- package/test/dirsize.test.js +138 -0
- package/test/file-ops.test.js +307 -0
- package/test/file-url.test.js +24 -0
- package/test/find-contents.test.js +161 -0
- package/test/find-input.test.js +66 -0
- package/test/fixtures/pele-parity.json +1006 -0
- package/test/highlight-launcher.test.js +35 -0
- package/test/html-preview.test.js +22 -0
- package/test/input.test.js +15 -0
- package/test/keymap.test.js +26 -0
- package/test/language-icons.test.js +36 -0
- package/test/launcher.test.js +51 -0
- package/test/manual-archive-here-ui.mjs +47 -0
- package/test/manual-code-scroll.mjs +28 -0
- package/test/manual-column-scroll.mjs +24 -0
- package/test/manual-compare-ui.mjs +20 -0
- package/test/manual-find-status.mjs +37 -0
- package/test/manual-folder-focus.mjs +63 -0
- package/test/manual-html-security.mjs +23 -0
- package/test/manual-html-ui.mjs +30 -0
- package/test/manual-syntax-preview.mjs +26 -0
- package/test/manual-terminal-lifecycle.mjs +42 -0
- package/test/manual-terminal-navigation.mjs +48 -0
- package/test/manual-terminal-ui.mjs +47 -0
- package/test/manual-trash-ui.mjs +86 -0
- package/test/markdown-diagrams.test.js +93 -0
- package/test/markdown-html.test.js +105 -0
- package/test/mathml.test.js +92 -0
- package/test/menu-transfer.test.js +57 -0
- package/test/office-preview.test.js +154 -0
- package/test/pele-parity.test.js +28 -0
- package/test/places.test.js +134 -0
- package/test/preview-keys.test.js +60 -0
- package/test/preview-language.test.js +22 -0
- package/test/status-filename.test.js +20 -0
- package/test/transfer-replace-merge.test.js +187 -0
- package/test/trash-address.test.js +23 -0
- package/test/trash-view.test.js +37 -0
- package/test/trashbrowse.test.js +135 -0
- package/ui/AboutFacts.qml +78 -0
- package/ui/ArchiveCards.qml +95 -0
- package/ui/ArchiveCompressDialog.qml +378 -0
- package/ui/ArchiveHereConfirm.qml +127 -0
- package/ui/ArchivePasswordDialog.qml +257 -0
- package/ui/Backend.qml +775 -0
- package/ui/BulkOldNames.qml +47 -0
- package/ui/BulkRenameDialog.qml +380 -0
- package/ui/CardFrame.qml +67 -0
- package/ui/CardScroll.qml +79 -0
- package/ui/CheckBox.qml +73 -0
- package/ui/ChromeBar.qml +360 -0
- package/ui/ChromeButton.qml +131 -0
- package/ui/ChromeModes.qml +43 -0
- package/ui/CodeLines.qml +256 -0
- package/ui/CodeRefusal.qml +52 -0
- package/ui/CollideConfirm.qml +147 -0
- package/ui/CollideHost.qml +167 -0
- package/ui/ColumnPane.qml +525 -0
- package/ui/ColumnRow.qml +380 -0
- package/ui/ColumnsArea.qml +594 -0
- package/ui/ColumnsLanding.qml +147 -0
- package/ui/CompareView.qml +321 -0
- package/ui/ContextMenu.qml +743 -0
- package/ui/ConvertDialog.qml +456 -0
- package/ui/CountedWorker.qml +7 -0
- package/ui/Crumb.qml +64 -0
- package/ui/CrumbDrop.qml +25 -0
- package/ui/CsvTable.qml +394 -0
- package/ui/CursorMark.qml +41 -0
- package/ui/DefaultClaim.qml +130 -0
- package/ui/DeviceLock.qml +47 -0
- package/ui/DeviceMounts.qml +540 -0
- package/ui/DialogButton.qml +150 -0
- package/ui/DialogField.qml +147 -0
- package/ui/DialogHeader.qml +31 -0
- package/ui/DialogScrim.qml +20 -0
- package/ui/DialogTitle.qml +37 -0
- package/ui/Divider.qml +9 -0
- package/ui/DropInto.qml +126 -0
- package/ui/DropTarget.qml +35 -0
- package/ui/DropboxMark.qml +60 -0
- package/ui/EmptyState.qml +150 -0
- package/ui/EscapeHint.qml +11 -0
- package/ui/FactsTable.qml +54 -0
- package/ui/FastScrollHandler.qml +476 -0
- package/ui/FatNamesConfirm.qml +157 -0
- package/ui/Favourites.qml +143 -0
- package/ui/FigureService.qml +120 -0
- package/ui/FileDrag.qml +267 -0
- package/ui/FilterStrip.qml +133 -0
- package/ui/FitMetrics.qml +22 -0
- package/ui/FlashDriveRows.qml +137 -0
- package/ui/FlashHost.qml +72 -0
- package/ui/FlashImageRow.qml +104 -0
- package/ui/FlashRunner.qml +119 -0
- package/ui/FlashStepRow.qml +172 -0
- package/ui/FlashStrip.qml +38 -0
- package/ui/FlashView.qml +397 -0
- package/ui/FleaMark.qml +88 -0
- package/ui/FlyoutFade.qml +23 -0
- package/ui/FontPane.qml +170 -0
- package/ui/Glass.qml +114 -0
- package/ui/GlassTagger.qml +59 -0
- package/ui/Glyph.qml +64 -0
- package/ui/GlyphSolid.qml +22 -0
- package/ui/GridArea.qml +664 -0
- package/ui/GridTile.qml +325 -0
- package/ui/GvfsBridge.qml +164 -0
- package/ui/Header.qml +433 -0
- package/ui/HoverTimers.qml +39 -0
- package/ui/HtmlClip.qml +30 -0
- package/ui/HtmlPane.qml +63 -0
- package/ui/HyprlandMark.qml +45 -0
- package/ui/Ipc.qml +1005 -0
- package/ui/IpcControls.qml +7 -0
- package/ui/IpcMenuState.qml +48 -0
- package/ui/IpcPreviewState.qml +185 -0
- package/ui/JumpPath.qml +51 -0
- package/ui/KeymapSheet.qml +561 -0
- package/ui/KeymapSheetResult.qml +89 -0
- package/ui/KindStack.qml +40 -0
- package/ui/LangMark.qml +51 -0
- package/ui/LangMarkLoader.qml +26 -0
- package/ui/List.qml +480 -0
- package/ui/LoadingState.qml +54 -0
- package/ui/LocalSend.qml +56 -0
- package/ui/LocalSendMark.qml +73 -0
- package/ui/MarkdownBlockView.qml +311 -0
- package/ui/MarkdownBlocks.qml +35 -0
- package/ui/MarkdownFigure.qml +254 -0
- package/ui/MarkdownImages.qml +72 -0
- package/ui/MarkdownList.qml +81 -0
- package/ui/MarkdownMathsText.qml +97 -0
- package/ui/MarkdownPane.qml +83 -0
- package/ui/MarkdownPictures.qml +41 -0
- package/ui/MarkdownQuote.qml +52 -0
- package/ui/MarkdownRemote.qml +82 -0
- package/ui/MarkdownSource.qml +155 -0
- package/ui/MarkdownTable.qml +222 -0
- package/ui/MarkdownTableScroll.qml +64 -0
- package/ui/MarkdownTableWheel.qml +126 -0
- package/ui/MarkdownText.qml +87 -0
- package/ui/MarkdownWorker.js +132 -0
- package/ui/MatchText.qml +99 -0
- package/ui/MediaSession.qml +38 -0
- package/ui/MediaSound.qml +26 -0
- package/ui/MediaStrip.qml +191 -0
- package/ui/MediaTrack.qml +36 -0
- package/ui/MediaVolume.qml +54 -0
- package/ui/MenuActionDialog.qml +396 -0
- package/ui/MenuEdgeFade.qml +24 -0
- package/ui/MenuHost.qml +227 -0
- package/ui/MenuRow.qml +351 -0
- package/ui/MountListing.qml +100 -0
- package/ui/NetworkDialog.qml +435 -0
- package/ui/NetworkForm.qml +426 -0
- package/ui/NetworkMounts.qml +913 -0
- package/ui/NetworkPlaces.qml +127 -0
- package/ui/OpenWithDialog.qml +613 -0
- package/ui/Opener.qml +95 -0
- package/ui/Pane.qml +1320 -0
- package/ui/PaneMenuActions.qml +527 -0
- package/ui/PanePath.qml +90 -0
- package/ui/PaneRail.qml +268 -0
- package/ui/PaneStates.qml +88 -0
- package/ui/PaneSwap.qml +339 -0
- package/ui/PaneWire.qml +601 -0
- package/ui/ParkedWait.qml +9 -0
- package/ui/PathEntry.qml +186 -0
- package/ui/PathJump.qml +400 -0
- package/ui/PdfViewer.qml +297 -0
- package/ui/PermissionsDialog.qml +658 -0
- package/ui/PermissionsHeadings.qml +31 -0
- package/ui/PhoneMounts.qml +67 -0
- package/ui/PickerAnswers.qml +75 -0
- package/ui/PickerBox.qml +26 -0
- package/ui/PickerChrome.qml +295 -0
- package/ui/PickerFilter.qml +97 -0
- package/ui/PickerGrid.qml +308 -0
- package/ui/PickerHeader.qml +28 -0
- package/ui/PickerLifecycle.qml +27 -0
- package/ui/PickerList.qml +218 -0
- package/ui/PickerListing.qml +149 -0
- package/ui/PickerPathBar.qml +127 -0
- package/ui/PickerPlaces.qml +189 -0
- package/ui/PickerRecent.qml +92 -0
- package/ui/PickerSave.qml +101 -0
- package/ui/PickerSelection.qml +155 -0
- package/ui/PickerWindow.qml +846 -0
- package/ui/PowerSectorsReader.qml +10 -0
- package/ui/PrebuildDriver.qml +146 -0
- package/ui/Preview.qml +1005 -0
- package/ui/PreviewAnimation.qml +24 -0
- package/ui/PreviewArchive.qml +91 -0
- package/ui/PreviewColumn.qml +553 -0
- package/ui/PreviewEdge.qml +63 -0
- package/ui/PreviewFacts.qml +30 -0
- package/ui/PreviewFactsLine.qml +34 -0
- package/ui/PreviewHtml.qml +233 -0
- package/ui/PreviewImage.qml +253 -0
- package/ui/PreviewImagePan.qml +13 -0
- package/ui/PreviewImageSharp.qml +32 -0
- package/ui/PreviewLines.qml +106 -0
- package/ui/PreviewMarkdown.qml +706 -0
- package/ui/PreviewMedia.qml +250 -0
- package/ui/PreviewPdf.qml +482 -0
- package/ui/PreviewScroll.qml +201 -0
- package/ui/PreviewSwap.qml +335 -0
- package/ui/PreviewText.qml +149 -0
- package/ui/ProtocolChip.qml +18 -0
- package/ui/QuickLookArchive.qml +41 -0
- package/ui/QuickLookBar.qml +103 -0
- package/ui/QuickLookPrepare.qml +355 -0
- package/ui/QuickLookSwap.qml +10 -0
- package/ui/QuickLookWarm.qml +65 -0
- package/ui/RailDrop.qml +155 -0
- package/ui/RailHeading.qml +19 -0
- package/ui/RailPlaces.qml +38 -0
- package/ui/RailTrashRow.qml +67 -0
- package/ui/RenameField.qml +353 -0
- package/ui/RendererRetry.qml +11 -0
- package/ui/ResizeHandle.qml +52 -0
- package/ui/Reveal.qml +54 -0
- package/ui/Row.qml +476 -0
- package/ui/RowDrag.qml +213 -0
- package/ui/RowDropTarget.qml +27 -0
- package/ui/RunCard.qml +286 -0
- package/ui/Scripts.qml +65 -0
- package/ui/SearchStrip.qml +232 -0
- package/ui/SelectionBand.qml +140 -0
- package/ui/SelectionPreview.qml +370 -0
- package/ui/SettingsFavourite.qml +122 -0
- package/ui/SettingsGroup.qml +96 -0
- package/ui/SettingsHint.qml +12 -0
- package/ui/SettingsMetrics.qml +29 -0
- package/ui/SettingsPane.qml +178 -0
- package/ui/SettingsPanel.qml +547 -0
- package/ui/SettingsRail.qml +128 -0
- package/ui/SettingsRow.qml +409 -0
- package/ui/SettingsRuler.qml +85 -0
- package/ui/SettingsSegment.qml +85 -0
- package/ui/ShareBrowser.qml +113 -0
- package/ui/ShareLink.qml +67 -0
- package/ui/ShelfPins.qml +101 -0
- package/ui/Sidebar.qml +728 -0
- package/ui/SidebarRow.qml +358 -0
- package/ui/Spinner.qml +60 -0
- package/ui/StableModel.qml +89 -0
- package/ui/StateMessage.qml +84 -0
- package/ui/StatusBar.qml +512 -0
- package/ui/StatusFileName.qml +27 -0
- package/ui/TabBar.qml +673 -0
- package/ui/TabDragGeometry.qml +60 -0
- package/ui/TagMenuMark.qml +52 -0
- package/ui/TagRailSection.qml +53 -0
- package/ui/TagSlot.qml +40 -0
- package/ui/TagState.qml +150 -0
- package/ui/TagSwatch.qml +28 -0
- package/ui/Taildrop.qml +86 -0
- package/ui/TailscaleMark.qml +50 -0
- package/ui/TerminalService.qml +69 -0
- package/ui/TerminalTab.qml +48 -0
- package/ui/TerminalTabs.qml +27 -0
- package/ui/Theme.qml +460 -0
- package/ui/ThemeColors.qml +43 -0
- package/ui/TransferCard.qml +239 -0
- package/ui/TrashConfirm.qml +129 -0
- package/ui/TrashDropHandler.qml +11 -0
- package/ui/TrashHost.qml +202 -0
- package/ui/TrashMonitor.qml +30 -0
- package/ui/TrashToolbar.qml +19 -0
- package/ui/TrashView.qml +492 -0
- package/ui/UnlockDialog.qml +450 -0
- package/ui/UnlockHost.qml +206 -0
- package/ui/UpdateCheck.qml +97 -0
- package/ui/UserDirs.qml +25 -0
- package/ui/ViewState.qml +565 -0
- package/ui/ViewportScrollBar.qml +195 -0
- package/ui/ViewportScrollBars.qml +25 -0
- package/ui/WebPreview.qml +33 -0
- package/ui/WebPreviewView.qml +26 -0
- package/ui/WindowBody.qml +829 -0
- package/ui/WindowDrag.qml +35 -0
- package/ui/boot/Commons/AudioNodes.qml +50 -0
- package/ui/boot/Commons/AudioNodesModel.js +96 -0
- package/ui/boot/Commons/Border.qml +243 -0
- package/ui/boot/Commons/BorderGeometry.js +373 -0
- package/ui/boot/Commons/Color.qml +258 -0
- package/ui/boot/Commons/I18n.qml +118 -0
- package/ui/boot/Commons/InputDevices.qml +112 -0
- package/ui/boot/Commons/InputMethodState.qml +38 -0
- package/ui/boot/Commons/IpcRegistry.qml +77 -0
- package/ui/boot/Commons/Numbers.js +19 -0
- package/ui/boot/Commons/Plural.js +91 -0
- package/ui/boot/Commons/ShellIpc.qml +12 -0
- package/ui/boot/Commons/Style.qml +561 -0
- package/ui/boot/Commons/Translations.qml +100 -0
- package/ui/boot/Commons/UntypedInput.qml +152 -0
- package/ui/boot/Commons/Util.qml +188 -0
- package/ui/boot/Commons/qmldir +13 -0
- package/ui/boot/LICENSE-omarchy +20 -0
- package/ui/boot/Ui/BackgroundMedia.qml +49 -0
- package/ui/boot/Ui/BarIconButton.qml +106 -0
- package/ui/boot/Ui/BarIconContent.qml +38 -0
- package/ui/boot/Ui/BarIndicator.qml +53 -0
- package/ui/boot/Ui/BarWidget.qml +50 -0
- package/ui/boot/Ui/BorderOverlay.qml +54 -0
- package/ui/boot/Ui/BorderSurface.qml +40 -0
- package/ui/boot/Ui/Button.qml +224 -0
- package/ui/boot/Ui/ButtonGroup.qml +131 -0
- package/ui/boot/Ui/ConfirmDialog.qml +134 -0
- package/ui/boot/Ui/CursorSurface.qml +42 -0
- package/ui/boot/Ui/Dropdown.qml +245 -0
- package/ui/boot/Ui/FilterInput.qml +26 -0
- package/ui/boot/Ui/IconContentBounds.qml +141 -0
- package/ui/boot/Ui/KeyboardPanel.qml +453 -0
- package/ui/boot/Ui/MultiSelect.qml +624 -0
- package/ui/boot/Ui/NumberField.qml +86 -0
- package/ui/boot/Ui/OpticalGlyph.qml +68 -0
- package/ui/boot/Ui/OverlayWindow.qml +102 -0
- package/ui/boot/Ui/Panel.qml +60 -0
- package/ui/boot/Ui/PanelActionButton.qml +105 -0
- package/ui/boot/Ui/PanelController.qml +16 -0
- package/ui/boot/Ui/PanelHero.qml +112 -0
- package/ui/boot/Ui/PanelKeyCatcher.qml +100 -0
- package/ui/boot/Ui/PanelSectionHeader.qml +31 -0
- package/ui/boot/Ui/PanelSeparator.qml +19 -0
- package/ui/boot/Ui/PanelSlider.qml +156 -0
- package/ui/boot/Ui/PanelToolTip.qml +50 -0
- package/ui/boot/Ui/PluginBarApi.qml +89 -0
- package/ui/boot/Ui/PointerMoveGate.qml +54 -0
- package/ui/boot/Ui/PopupCard.qml +181 -0
- package/ui/boot/Ui/ScreenMoveRemap.qml +43 -0
- package/ui/boot/Ui/SearchableDropdown.qml +354 -0
- package/ui/boot/Ui/SizedImage.qml +125 -0
- package/ui/boot/Ui/SpeedTestOverlay.qml +412 -0
- package/ui/boot/Ui/TextField.qml +58 -0
- package/ui/boot/Ui/Toggle.qml +118 -0
- package/ui/boot/Ui/ToggleSwitch.qml +115 -0
- package/ui/boot/Ui/WidgetButton.qml +172 -0
- package/ui/boot/Ui/qmldir +41 -0
- package/ui/boot/fleatab.qml +50 -0
- package/ui/boot/picker.qml +39 -0
- package/ui/boot/shell.qml +131 -0
- package/ui/boot/tabtearoff.qml +51 -0
- package/ui/js/Anchor.js +379 -0
- package/ui/js/AnchorHold.js +162 -0
- package/ui/js/Archive.js +157 -0
- package/ui/js/ArchiveCard.js +44 -0
- package/ui/js/ArchiveOps.js +44 -0
- package/ui/js/BackReturn.js +118 -0
- package/ui/js/BulkRename.js +100 -0
- package/ui/js/Buttons.js +54 -0
- package/ui/js/ChromeKeys.js +116 -0
- package/ui/js/ClipMarks.js +73 -0
- package/ui/js/ClipSelection.js +67 -0
- package/ui/js/Clipboard.js +179 -0
- package/ui/js/Cloud.js +97 -0
- package/ui/js/CodeRuns.js +72 -0
- package/ui/js/Collide.js +212 -0
- package/ui/js/ColumnFit.js +28 -0
- package/ui/js/ColumnMenu.js +111 -0
- package/ui/js/Columns.js +298 -0
- package/ui/js/ColumnsCarry.js +103 -0
- package/ui/js/Compare.js +74 -0
- package/ui/js/Contrast.js +157 -0
- package/ui/js/ControlReader.js +42 -0
- package/ui/js/Convert.js +52 -0
- package/ui/js/CopyAs.js +52 -0
- package/ui/js/Crumbs.js +178 -0
- package/ui/js/Csv.js +231 -0
- package/ui/js/Density.js +44 -0
- package/ui/js/Devices.js +440 -0
- package/ui/js/DirSizes.js +180 -0
- package/ui/js/Drag.js +360 -0
- package/ui/js/DragOut.js +166 -0
- package/ui/js/DropDev.js +52 -0
- package/ui/js/Dropbox.js +41 -0
- package/ui/js/Eject.js +217 -0
- package/ui/js/Errors.js +188 -0
- package/ui/js/ExtThumbs.js +115 -0
- package/ui/js/Facts.js +402 -0
- package/ui/js/FigureDate.js +14 -0
- package/ui/js/Filter.js +285 -0
- package/ui/js/Find.js +46 -0
- package/ui/js/Flash.js +184 -0
- package/ui/js/FlashCard.js +79 -0
- package/ui/js/FlashEndings.js +125 -0
- package/ui/js/FlashPane.js +116 -0
- package/ui/js/FleaBin.js +12 -0
- package/ui/js/Focus.js +504 -0
- package/ui/js/FolderSorts.js +108 -0
- package/ui/js/FolderViews.js +44 -0
- package/ui/js/Format.js +314 -0
- package/ui/js/Fuzzy.js +141 -0
- package/ui/js/GlassTag.js +72 -0
- package/ui/js/Grid.js +33 -0
- package/ui/js/GridGeometry.js +90 -0
- package/ui/js/GridNames.js +153 -0
- package/ui/js/GvfsBridge.js +200 -0
- package/ui/js/HostClipboard.js +29 -0
- package/ui/js/Icons.js +218 -0
- package/ui/js/Input.js +50 -0
- package/ui/js/Jump.js +200 -0
- package/ui/js/KeyName.js +64 -0
- package/ui/js/Keymap.js +401 -0
- package/ui/js/Kinds.js +164 -0
- package/ui/js/LICENSES/ISC-lucide.txt +43 -0
- package/ui/js/LangMarkPaths.js +47 -0
- package/ui/js/LangMarks.js +120 -0
- package/ui/js/Lists.js +11 -0
- package/ui/js/LocalSend.js +39 -0
- package/ui/js/LockedMenu.js +63 -0
- package/ui/js/MakeDefault.js +186 -0
- package/ui/js/MarkBox.js +7 -0
- package/ui/js/Markdown.js +119 -0
- package/ui/js/MarkdownLists.js +86 -0
- package/ui/js/MarkdownMaths.js +58 -0
- package/ui/js/MarkdownPictures.js +32 -0
- package/ui/js/MarkdownPrepared.js +139 -0
- package/ui/js/MarkdownTableFit.js +34 -0
- package/ui/js/Marks.js +148 -0
- package/ui/js/Marquee.js +96 -0
- package/ui/js/Match.js +93 -0
- package/ui/js/Material.js +109 -0
- package/ui/js/MdBlocks.js +437 -0
- package/ui/js/MdBreak.js +71 -0
- package/ui/js/MdChunks.js +70 -0
- package/ui/js/MdContainer.js +137 -0
- package/ui/js/MdDocument.js +337 -0
- package/ui/js/MdEmph.js +97 -0
- package/ui/js/MdEntity.js +108 -0
- package/ui/js/MdEntityTable.js +223 -0
- package/ui/js/MdEscape.js +59 -0
- package/ui/js/MdFront.js +37 -0
- package/ui/js/MdHold.js +32 -0
- package/ui/js/MdHtml.js +307 -0
- package/ui/js/MdHtmlBlock.js +290 -0
- package/ui/js/MdHtmlHeading.js +53 -0
- package/ui/js/MdHtmlImage.js +179 -0
- package/ui/js/MdInline.js +154 -0
- package/ui/js/MdItems.js +212 -0
- package/ui/js/MdLeaf.js +309 -0
- package/ui/js/MdLink.js +196 -0
- package/ui/js/MdMath.js +67 -0
- package/ui/js/MdParagraphs.js +138 -0
- package/ui/js/MdRefs.js +232 -0
- package/ui/js/MdResolve.js +226 -0
- package/ui/js/MdRun.js +300 -0
- package/ui/js/MdUrl.js +226 -0
- package/ui/js/Menu.js +514 -0
- package/ui/js/MenuContext.js +85 -0
- package/ui/js/MenuFit.js +13 -0
- package/ui/js/MenuRefresh.js +74 -0
- package/ui/js/MenuWheel.js +35 -0
- package/ui/js/Messages.js +186 -0
- package/ui/js/Motion.js +16 -0
- package/ui/js/Mounts.js +320 -0
- package/ui/js/MouseNav.js +13 -0
- package/ui/js/Nav.js +329 -0
- package/ui/js/NetFs.js +26 -0
- package/ui/js/OpenWith.js +83 -0
- package/ui/js/Ops.js +585 -0
- package/ui/js/Palette.js +33 -0
- package/ui/js/PathBar.js +260 -0
- package/ui/js/Permissions.js +179 -0
- package/ui/js/Phones.js +112 -0
- package/ui/js/Picker.js +353 -0
- package/ui/js/PlaceMenu.js +96 -0
- package/ui/js/Places.js +265 -0
- package/ui/js/PreviewAsk.js +21 -0
- package/ui/js/PreviewKeys.js +155 -0
- package/ui/js/PreviewSettle.js +29 -0
- package/ui/js/PreviewSwap.js +101 -0
- package/ui/js/PropertyFacts.js +144 -0
- package/ui/js/Protocols.js +296 -0
- package/ui/js/QuickLookKinds.js +27 -0
- package/ui/js/QuickLookRect.js +24 -0
- package/ui/js/RailDrop.js +51 -0
- package/ui/js/RailKeys.js +87 -0
- package/ui/js/RailMenu.js +133 -0
- package/ui/js/Recent.js +135 -0
- package/ui/js/RecentMode.js +156 -0
- package/ui/js/Reload.js +60 -0
- package/ui/js/Renderer.js +9 -0
- package/ui/js/RunFile.js +143 -0
- package/ui/js/Scripts.js +28 -0
- package/ui/js/Scroll.js +304 -0
- package/ui/js/ScrollOff.js +69 -0
- package/ui/js/Search.js +478 -0
- package/ui/js/Selection.js +97 -0
- package/ui/js/Settings.js +476 -0
- package/ui/js/SettingsAbout.js +97 -0
- package/ui/js/SettingsShelf.js +52 -0
- package/ui/js/SheetKeys.js +42 -0
- package/ui/js/SheetQuery.js +281 -0
- package/ui/js/ShelfPile.js +27 -0
- package/ui/js/SlowClick.js +53 -0
- package/ui/js/SlowOp.js +6 -0
- package/ui/js/Sort.js +134 -0
- package/ui/js/Startup.js +63 -0
- package/ui/js/StateWords.js +17 -0
- package/ui/js/Status.js +238 -0
- package/ui/js/Swap.js +166 -0
- package/ui/js/TabMove.js +39 -0
- package/ui/js/Tabs.js +751 -0
- package/ui/js/Tags.js +134 -0
- package/ui/js/Taildrop.js +128 -0
- package/ui/js/Tap.js +180 -0
- package/ui/js/TextSize.js +107 -0
- package/ui/js/Thumbs.js +158 -0
- package/ui/js/Transfer.js +172 -0
- package/ui/js/Trash.js +84 -0
- package/ui/js/TrashDates.js +47 -0
- package/ui/js/TrashDrop.js +64 -0
- package/ui/js/UiState.js +438 -0
- package/ui/js/Unlock.js +152 -0
- package/ui/js/Update.js +130 -0
- package/ui/js/UserDirs.js +56 -0
- package/ui/qmldir +230 -0
package/ui/js/Status.js
ADDED
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
.pragma library
|
|
2
|
+
|
|
3
|
+
.import "DirSizes.js" as DirSizes
|
|
4
|
+
.import "Format.js" as Format
|
|
5
|
+
.import "Keymap.js" as Keymap
|
|
6
|
+
.import "Match.js" as Match
|
|
7
|
+
|
|
8
|
+
// A finished operation names its own reversal and the clipboard names the key that spends it. The
|
|
9
|
+
// strip draws either in its secondary, so no sentence it shows ends in advice of its own.
|
|
10
|
+
// The key comes from the running preset, so the default preset draws " · z undoes" and " · p pastes" and another preset draws its own.
|
|
11
|
+
var HINTS = {
|
|
12
|
+
undo: " · %1 undoes",
|
|
13
|
+
paste: " · %1 pastes",
|
|
14
|
+
deletes: " · %1 deletes",
|
|
15
|
+
note: " · %1",
|
|
16
|
+
noteUndo: " · %1 · %2 undoes"
|
|
17
|
+
}
|
|
18
|
+
function undoHint() {
|
|
19
|
+
var key = Keymap.hintFor("undo")
|
|
20
|
+
return key.length > 0 ? Format.fill(HINTS.undo, key) : ""
|
|
21
|
+
}
|
|
22
|
+
function pasteHint() {
|
|
23
|
+
var key = Keymap.hintFor("paste")
|
|
24
|
+
return key.length > 0 ? Format.fill(HINTS.paste, key) : ""
|
|
25
|
+
}
|
|
26
|
+
// The hint is the strip's second lane, so a finished line takes it as its tail and hintOf splits it off again.
|
|
27
|
+
function withUndo(line) { return line + undoHint() }
|
|
28
|
+
function withPaste(line) { return line + pasteHint() }
|
|
29
|
+
|
|
30
|
+
// The key that still removes the rows where there is no Trash, drawn in the secondary lane.
|
|
31
|
+
function trashHint() {
|
|
32
|
+
var key = Keymap.hintFor("deletePermanently")
|
|
33
|
+
return key.length > 0 ? Format.fill(HINTS.deletes, key) : ""
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// Refusal where gio has no Trash: the place in the primary, the key that still works in the secondary.
|
|
37
|
+
var NO_TRASH = "This location has no Trash"
|
|
38
|
+
function noTrashLine() { return NO_TRASH + trashHint() }
|
|
39
|
+
|
|
40
|
+
// An arm's record: its owner (the pane, or the Trash view while it is open) and the stamp that owner set before the prompt.
|
|
41
|
+
function armOf(owner, stamp) { return { owner: owner, stamp: stamp } }
|
|
42
|
+
|
|
43
|
+
// Live while the bar still has that owner and the owner still holds that stamp; its second press, any other key and a new listing zero it.
|
|
44
|
+
function armLive(arm, owner) { return arm !== null && arm.stamp > 0 && arm.owner === owner && owner.trashArmedAt === arm.stamp }
|
|
45
|
+
|
|
46
|
+
// What the arm has left by its owner's clock, the stamp, so a Qt timer that fires early never ends it while the key still acts.
|
|
47
|
+
function armLeft(arm, now, armMs) { return arm === null ? 0 : armMs - (now - arm.stamp) }
|
|
48
|
+
|
|
49
|
+
// A live arm's prompt, else the oldest unacknowledged error, else the notice: a hidden live prompt's second press acts unannounced.
|
|
50
|
+
function transientOf(errors, notice, prompt, live) {
|
|
51
|
+
if (live === true) return { text: prompt, isError: false, detail: "" }
|
|
52
|
+
if (errors.length) return { text: errors[0].text, isError: true, detail: errors[0].detail }
|
|
53
|
+
return { text: notice, isError: false, detail: "" }
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// The no-Trash refusal names its place and replaces its own copy there, where it stands; other errors name none.
|
|
57
|
+
function withError(errors, text, detail, place) {
|
|
58
|
+
var entry = { text: text, detail: detail || "", place: text === noTrashLine() ? place : "" }
|
|
59
|
+
var at = entry.place.length === 0 ? -1
|
|
60
|
+
: errors.findIndex(function (e) { return e.text === text && e.place === entry.place })
|
|
61
|
+
if (at < 0) return errors.concat([entry])
|
|
62
|
+
var next = errors.slice()
|
|
63
|
+
next[at] = entry
|
|
64
|
+
return next
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
// Leaving a place drops its refusals; other errors wait for dismissal, and an unchanged queue is the same array.
|
|
68
|
+
function errorsAt(errors, place) {
|
|
69
|
+
var kept = errors.filter(function (entry) { return entry.place.length === 0 || entry.place === place })
|
|
70
|
+
return kept.length === errors.length ? errors : kept
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
// The durable verdict's own notes, mirrored from src/backend/durable.rs: a done line
|
|
74
|
+
// carrying one draws "Copied N items" with "<note> · z undoes" beside it, the way the
|
|
75
|
+
// CloudMounts board draws the rclone upload sentence.
|
|
76
|
+
var VERDICT_NOTES = ["rclone uploads them in the background", "copied, but the drive did not confirm the folder"]
|
|
77
|
+
|
|
78
|
+
// Which hint a result carries, if any.
|
|
79
|
+
function hintOf(notice) {
|
|
80
|
+
var text = String(notice || "")
|
|
81
|
+
for (var i = 0; i < VERDICT_NOTES.length; i++) {
|
|
82
|
+
var undoKey = Keymap.hintFor("undo")
|
|
83
|
+
var tail = undoKey.length > 0 ? Format.fill(HINTS.noteUndo, VERDICT_NOTES[i], undoKey) : Format.fill(HINTS.note, VERDICT_NOTES[i])
|
|
84
|
+
if (text.length >= tail.length && text.lastIndexOf(tail) === text.length - tail.length)
|
|
85
|
+
return tail
|
|
86
|
+
}
|
|
87
|
+
if (undoHint().length > 0 && text.indexOf(undoHint()) >= 0) {
|
|
88
|
+
return undoHint()
|
|
89
|
+
}
|
|
90
|
+
if (pasteHint().length > 0 && text.indexOf(pasteHint()) >= 0) {
|
|
91
|
+
return pasteHint()
|
|
92
|
+
}
|
|
93
|
+
var trash = trashHint()
|
|
94
|
+
if (trash.length > 0 && text.indexOf(trash) >= 0) {
|
|
95
|
+
return trash
|
|
96
|
+
}
|
|
97
|
+
return ""
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
// Sample input: " · rclone uploads them in the background · z undoes"; any hint ending in undoHint() carries undo.
|
|
101
|
+
function hasUndoHint(hint) {
|
|
102
|
+
var text = String(hint || "")
|
|
103
|
+
var undo = undoHint()
|
|
104
|
+
return undo.length > 0 && text.length >= undo.length
|
|
105
|
+
&& text.lastIndexOf(undo) === text.length - undo.length
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
// Only the displayed activity's Starting line walks the busy mark, never one queued behind it; the record says so, not its text.
|
|
109
|
+
function displayedStarting(activities) {
|
|
110
|
+
var list = activities || []
|
|
111
|
+
return list.length > 0 && list[0].starting === true
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
// The key it names. ui/StatusBar.qml draws the separator itself, so the key arrives without one.
|
|
115
|
+
function hintKey(hint) {
|
|
116
|
+
return hint.replace(" \u00b7 ", "")
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
// Sample input: "esc dismisses · z undoes". The undo segment lifted out of a hint, so the strip
|
|
120
|
+
// can draw it as its own click target; the middot between them stays muted.
|
|
121
|
+
function withoutUndoKey(keyHint) {
|
|
122
|
+
var undo = hintKey(undoHint())
|
|
123
|
+
if (keyHint === undo) {
|
|
124
|
+
return ""
|
|
125
|
+
}
|
|
126
|
+
var tail = " \u00b7 " + undo
|
|
127
|
+
if (keyHint.length > tail.length && keyHint.lastIndexOf(tail) === keyHint.length - tail.length) {
|
|
128
|
+
return keyHint.substring(0, keyHint.length - tail.length)
|
|
129
|
+
}
|
|
130
|
+
return keyHint
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
// Sample input: keyHint "z undoes" with nothing else standing. The secondary lane as one string,
|
|
134
|
+
// so ui/StatusBar.qml draws the rest beside the undo target from this same join.
|
|
135
|
+
function secondaryText(keyHint, transientIsError, stickyHere, sticky, activities, searching, searchLine, retryLine) {
|
|
136
|
+
var extra = activities.slice(1).map(function (entry) { return entry.text }).join(" · ")
|
|
137
|
+
return [keyHint,
|
|
138
|
+
transientIsError && stickyHere ? sticky : "",
|
|
139
|
+
extra,
|
|
140
|
+
stickyHere && !transientIsError && searching ? searchLine : "",
|
|
141
|
+
transientIsError ? "" : retryLine]
|
|
142
|
+
.filter(function (s) { return s.length > 0 }).map(function (s) { return " · " + s }).join("")
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
// Sample input: { transient: "Copy failed", transientIsError: true, searching: true, searchLine: "3 found in 1.6 s", stickyHere: true, sticky: "Copying 2 of 5" }
|
|
146
|
+
function errorHere(slot) {
|
|
147
|
+
return slot.transient.length > 0 && slot.transientIsError
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
function promptHere(slot) {
|
|
151
|
+
return slot.armLive === true
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
// The centre zone is what just happened, and nothing else. The disk facts have a zone of their own,
|
|
155
|
+
// so this no longer falls back to them: an idle bar's centre is empty. StatusBar board rule 1.
|
|
156
|
+
// The ordering rule: acknowledged errors leave the slot; activity cannot displace them.
|
|
157
|
+
function centreText(slot) {
|
|
158
|
+
// A prompt stands over activity and search as well, for the reason transientOf gives.
|
|
159
|
+
if (errorHere(slot) || promptHere(slot))
|
|
160
|
+
return slot.transient
|
|
161
|
+
if (slot.stickyHere)
|
|
162
|
+
return slot.sticky
|
|
163
|
+
if (slot.searching)
|
|
164
|
+
return slot.searchLine
|
|
165
|
+
return slot.transient
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
function centreRole(slot) {
|
|
169
|
+
return errorHere(slot) ? "error" : "foreground"
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
// Whether the centre draws the notice, whose display time is the one ui/StatusBar.qml's timer ends.
|
|
173
|
+
function noticeShown(slot) {
|
|
174
|
+
return !promptHere(slot) && slot.transient.length > 0 && !slot.transientIsError && !slot.stickyHere && !slot.searching
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
// The selection's byte total, or -1 when the bar may not claim one. StatusBar board rule 3: every
|
|
178
|
+
// selected row has to be held and every size known and complete, and nothing here starts a sweep.
|
|
179
|
+
// A file carries its own bytes; a directory has them only from a finished DirSizes answer.
|
|
180
|
+
function selectionBytes(pane) {
|
|
181
|
+
var count = pane.selection.count()
|
|
182
|
+
// More rows selected than the window holds means at least one of them is not here to measure.
|
|
183
|
+
if (count === 0 || count > pane.rows.length) {
|
|
184
|
+
return -1
|
|
185
|
+
}
|
|
186
|
+
var indices = pane.selection.indices()
|
|
187
|
+
var bytes = 0
|
|
188
|
+
for (var i = 0; i < indices.length; i++) {
|
|
189
|
+
var row = pane.rows[indices[i] - pane.held]
|
|
190
|
+
if (!row) {
|
|
191
|
+
return -1
|
|
192
|
+
}
|
|
193
|
+
if (row.d) {
|
|
194
|
+
var walked = DirSizes.known(DirSizes.sizeFor(pane.dirSizeState, indices[i]), row)
|
|
195
|
+
if (!walked || walked.partial) {
|
|
196
|
+
return -1
|
|
197
|
+
}
|
|
198
|
+
bytes += walked.bytes
|
|
199
|
+
continue
|
|
200
|
+
}
|
|
201
|
+
bytes += row.s
|
|
202
|
+
}
|
|
203
|
+
return bytes
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
// Each backend numbers its own transfers, so an id is meaningful only with its pane owner.
|
|
207
|
+
function activityChanged(activities, owner, text, transfer, starting) {
|
|
208
|
+
var next = activities.slice()
|
|
209
|
+
var at = next.findIndex(function (activity) { return activity.owner === owner })
|
|
210
|
+
if (!text) {
|
|
211
|
+
if (at >= 0) next.splice(at, 1)
|
|
212
|
+
return next
|
|
213
|
+
}
|
|
214
|
+
var previous = at >= 0 ? next[at] : null
|
|
215
|
+
var activity = { owner: owner, text: text, transfer: transfer, starting: starting === true,
|
|
216
|
+
cancelling: !!(previous && previous.transfer.id === transfer.id && previous.cancelling) }
|
|
217
|
+
if (at >= 0) next[at] = activity
|
|
218
|
+
else next.push(activity)
|
|
219
|
+
return next
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
function cancelActivity(activities) {
|
|
223
|
+
if (!activities.length || !activities[0].transfer.running || activities[0].cancelling)
|
|
224
|
+
return activities
|
|
225
|
+
var next = activities.slice()
|
|
226
|
+
next[0] = Object.assign({}, next[0], { cancelling: true })
|
|
227
|
+
return next
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
// One marked item wins; otherwise name the visible cursor row, including in a
|
|
231
|
+
// multi-selection. Reuse display names so Trash never leaks collision-safe names.
|
|
232
|
+
function fileName(pane) {
|
|
233
|
+
if (!pane || pane.listInFlight) return ""
|
|
234
|
+
var indices = pane.selection.indices()
|
|
235
|
+
var index = indices.length === 1 ? indices[0] : pane.cursorIndex
|
|
236
|
+
if (indices.length !== 1 && pane.shown !== null && pane.shown.indexOf(index) < 0) return ""
|
|
237
|
+
return Match.rowName(pane.rowFor(index), true)
|
|
238
|
+
}
|
package/ui/js/Swap.js
ADDED
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
.pragma library
|
|
2
|
+
|
|
3
|
+
// The listing swap's decisions, see AGENTS.md "The listing swap"; ui/PaneSwap.qml holds the state and the timer.
|
|
4
|
+
|
|
5
|
+
// Both swaps' cap, the pane mark's hold-off and a PDF page render's cap: with four 120 Hz frames for input, the Timer and the draw, the mark shows by 100 ms.
|
|
6
|
+
var CAP_MS = 66
|
|
7
|
+
|
|
8
|
+
// The hold-off of a loading state nothing keeps MIN_SHOW_MS: LoadingState outside the pane, the folder fallback, a search walk's mark.
|
|
9
|
+
var HOLD_MS = 150
|
|
10
|
+
|
|
11
|
+
// A drawn loading state stands this long before content replaces it; under 100 ms the two changes read as one blink.
|
|
12
|
+
var MIN_SHOW_MS = 100
|
|
13
|
+
|
|
14
|
+
// Answered while a listing is out: the navigations take its place, escape touches no row, the rest change the window.
|
|
15
|
+
var ANSWERED_WHILE_LISTING = ["open", "parent", "historyBack", "historyForward", "escape",
|
|
16
|
+
"viewList", "viewColumns", "viewGrid", "viewDual", "sidebar", "windowNew", "togglePreview",
|
|
17
|
+
"reload"]
|
|
18
|
+
|
|
19
|
+
// What a swallowed key says, the sentence every refused navigation already gives.
|
|
20
|
+
var LOADING = "A directory is already loading."
|
|
21
|
+
|
|
22
|
+
// What a listed or rows line does: dropped, kept for the rows behind it, applied alone, or landed with the kept line.
|
|
23
|
+
var DROP = "drop"
|
|
24
|
+
var KEEP = "keep"
|
|
25
|
+
var APPLY = "apply"
|
|
26
|
+
var LAND = "land"
|
|
27
|
+
var WAIT = "wait"
|
|
28
|
+
|
|
29
|
+
function idle() {
|
|
30
|
+
return { holding: false, listed: null, fellBack: false, waits: false, walk: false, query: "", since: 0, relist: false }
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
// Only a settled listing is held, plus a walk's drawn state for a listing after it; see ui/PaneSwap.qml hold.
|
|
34
|
+
function begin(state, listingState, searchMode, ask, now) {
|
|
35
|
+
// The exit holds the whole search state, strip and rows, until the folder lands in one turn.
|
|
36
|
+
var exit = ask.holdWalk === true
|
|
37
|
+
var afterWalk = state.walk === true && !exit
|
|
38
|
+
var holding = ask.clearAtOnce !== true && listingState !== "loading" && (searchMode === "" || exit) && !afterWalk
|
|
39
|
+
// An unheld Back or Forward still keeps its listed line, so the count, the rows and the cursor land in one turn.
|
|
40
|
+
var waits = !holding && !!ask.restore && String(ask.restore.name || "").length > 0
|
|
41
|
+
return { holding: holding, listed: null, fellBack: false, waits: waits, walk: state.walk, query: ask.keptQuery || "", since: now,
|
|
42
|
+
relist: ask.relist === true }
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// A session line lands only on its open session's newest sent gen; a closed exit's lines never land either.
|
|
46
|
+
function dropSessionLine(searchMode, gen, searchGen, leaving, openedGen) {
|
|
47
|
+
if (gen > 0 && leaving === true) {
|
|
48
|
+
return true
|
|
49
|
+
}
|
|
50
|
+
return gen > 0 && ((searchMode || "").length === 0 || gen !== searchGen || gen <= (openedGen || 0))
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// A live answer holds old rows until its own rows land, no listing out.
|
|
54
|
+
function keepLive(searchMode, inFlight) {
|
|
55
|
+
return (searchMode || "").length > 0 && inFlight !== true
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
// While a list is out, only a listed line naming the directory asked for answers it; an earlier sort's or search's is dropped.
|
|
59
|
+
// Held rows, a fallback or a loading mark already drawn keep it for the rows, so the mark never gives way to a count over none.
|
|
60
|
+
function onListed(state, inFlight, path, asked, marked) {
|
|
61
|
+
if (inFlight === true && path.length > 0 && path !== asked)
|
|
62
|
+
return DROP
|
|
63
|
+
return state.holding || state.fellBack || state.waits || marked === true ? KEEP : APPLY
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// A rows line ahead of its listed line answers a listing already replaced; one behind a kept listed line lands with it,
|
|
67
|
+
// once the loading mark it replaces has stood waitMs more.
|
|
68
|
+
function onRows(state, inFlight, listedSeen, waitMs) {
|
|
69
|
+
if (inFlight === true && listedSeen !== true)
|
|
70
|
+
return DROP
|
|
71
|
+
if (state.listed === null)
|
|
72
|
+
return APPLY
|
|
73
|
+
return waitMs > 0 ? WAIT : LAND
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// How much longer a loading state drawn at since stands before it may go; 0 when none is drawn.
|
|
77
|
+
function showLeft(since, now) {
|
|
78
|
+
return since > 0 ? Math.max(0, since + MIN_SHOW_MS - now) : 0
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// How long a held listing begun at state.since still holds before it falls back; -1 when nothing is held.
|
|
82
|
+
function capLeft(state, now) {
|
|
83
|
+
return state.holding === true ? Math.max(0, state.since + CAP_MS - now) : -1
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// The pane mark's hold-off: a directory listing keeps its mark MIN_SHOW_MS, so it draws at the cap; a walk's does not.
|
|
87
|
+
function markHoldOff(searchMode) {
|
|
88
|
+
return (searchMode || "") === "" ? CAP_MS : HOLD_MS
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// A directory listing out under a drawn mark; a walk's or a search's matches stream into a loading pane, never waiting on it.
|
|
92
|
+
function marked(since, inFlight, searchMode, walk) {
|
|
93
|
+
return since > 0 && inFlight === true && (searchMode || "") === "" && walk !== true
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
function kept(state, listed) {
|
|
97
|
+
return Object.assign({}, state, { listed: listed })
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
// Every listed line that is applied rather than kept says whether the rows it brings are a walk's.
|
|
101
|
+
function heard(state, walk) {
|
|
102
|
+
return Object.assign({}, state, { walk: walk === true })
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// A held listing is only ever a directory's, which is what begin() asked for.
|
|
106
|
+
function landed(state) {
|
|
107
|
+
return Object.assign({}, state, { holding: false, listed: null, fellBack: false, waits: false, walk: false, relist: false })
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
// The cap ran out: the pane shows the loading state until the rows land, and a listed line already kept waits for them.
|
|
111
|
+
function expired(state) {
|
|
112
|
+
return Object.assign({}, state, { holding: false, fellBack: true })
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
// A failed or refused listing ends the hold without a swap; the failure draws what it always did.
|
|
116
|
+
function dropped(state) {
|
|
117
|
+
return Object.assign({}, state, { holding: false, listed: null, fellBack: false, waits: false, relist: false })
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
// The listing is no longer out, however it ended.
|
|
121
|
+
function ended(state) {
|
|
122
|
+
return Object.assign({}, state, { holding: false, listed: null, fellBack: false, waits: false, relist: false })
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
// A stale or window refusal ended only its own request, and so does a scan failure naming a folder no longer asked for; any other failure ends the listing, letting held rows go while it is still out.
|
|
126
|
+
function failListing(pane, where, path) {
|
|
127
|
+
if (where === "stale" || where === "window")
|
|
128
|
+
return false
|
|
129
|
+
if (where === "scan" && !!path && path !== pane.listingPath)
|
|
130
|
+
return false
|
|
131
|
+
// An Esc relist that died leaves no cursor file armed for whatever listing comes next.
|
|
132
|
+
if (pane.swap.phase.relist === true)
|
|
133
|
+
pane.pendingSelect = ""
|
|
134
|
+
pane.swap.drop()
|
|
135
|
+
pane.listInFlight = false
|
|
136
|
+
pane.listedSeen = false
|
|
137
|
+
return true
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
// Sample input: {"c":"transfer","op":"move","rows":[3],"dest":"/home/gm/omarchy"} with held 7 gains "listing":7, unless it names one.
|
|
141
|
+
function named(request, held) {
|
|
142
|
+
if (request.rows === undefined || request.listing !== undefined || !(held > 0))
|
|
143
|
+
return request
|
|
144
|
+
return Object.assign({}, request, { listing: held })
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
// A key swallowed while a listing is out, held or loading: the backend already numbers rows for the directory asked for.
|
|
148
|
+
function swallows(inFlight, action) {
|
|
149
|
+
return inFlight === true && action.length > 0 && ANSWERED_WHILE_LISTING.indexOf(action) < 0
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
// A re-sort renumbers every row without a new list, so a selection made while it was in flight names other files once the new numbering lands.
|
|
153
|
+
function clearsSelection(oldHeld, listing) {
|
|
154
|
+
return oldHeld > 0 && listing > 0 && listing !== oldHeld
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
// A blank frame: a listing out and loading before the cap, or no row drawn while a live count still names rows.
|
|
158
|
+
function frameKind(inFlight, listingState, fellBack, drawn, named, live) {
|
|
159
|
+
if (inFlight === true && listingState === "loading") {
|
|
160
|
+
return fellBack === true ? "loading" : "blank"
|
|
161
|
+
}
|
|
162
|
+
if (live === true && drawn === 0 && named > 0) {
|
|
163
|
+
return "blank"
|
|
164
|
+
}
|
|
165
|
+
return ""
|
|
166
|
+
}
|
package/ui/js/TabMove.js
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
.pragma library
|
|
2
|
+
|
|
3
|
+
// Reorder is pure with no pane; Tabs.js snapshots around it.
|
|
4
|
+
// Sample input: items ["a","b","c"], from 0.
|
|
5
|
+
|
|
6
|
+
// A drag names the insertion point, not the tab it takes.
|
|
7
|
+
function insertionAt(x, tabWidth, count) {
|
|
8
|
+
if (!(tabWidth > 0) || !(count > 0))
|
|
9
|
+
return 0
|
|
10
|
+
return Math.max(0, Math.min(count, Math.floor(x / tabWidth + 0.5)))
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
// The { and } keys move one place, clamping at either end rather than wrapping.
|
|
14
|
+
function step(from, delta, count) {
|
|
15
|
+
return Math.max(0, Math.min(count - 1, from + delta))
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
// A favourite drag answers where the row lands and the line draws: (40, 1, 30, 5) drops at 2, line at 3.
|
|
19
|
+
function railReorder(dy, from, rowHeight, count) {
|
|
20
|
+
var n = Math.max(1, count)
|
|
21
|
+
var step = Math.round(dy / rowHeight)
|
|
22
|
+
return { to: Math.max(0, Math.min(n - 1, from + step)),
|
|
23
|
+
line: Math.max(0, Math.min(n, from + step + (dy >= 0 ? 1 : 0))) }
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
// A move keeps the current tab current: the dragged tab follows its destination, and a crossed tab shifts back.
|
|
27
|
+
function reorder(items, from, to, index) {
|
|
28
|
+
if (from < 0 || from >= items.length || to < 0 || to >= items.length || from === to)
|
|
29
|
+
return index
|
|
30
|
+
var moving = items.splice(from, 1)[0]
|
|
31
|
+
items.splice(to, 0, moving)
|
|
32
|
+
if (index === from)
|
|
33
|
+
return to
|
|
34
|
+
if (from < index && to >= index)
|
|
35
|
+
return index - 1
|
|
36
|
+
if (from > index && to <= index)
|
|
37
|
+
return index + 1
|
|
38
|
+
return index
|
|
39
|
+
}
|