flea-qml 0.0.0-stage → 0.1.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 +478 -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 +402 -0
- package/src/archiveops.js +697 -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 +129 -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/transfer.js +669 -0
- package/src/trash-record.js +41 -0
- package/src/trash.js +210 -0
- package/src/trashbrowse.js +326 -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 +241 -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-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-html-security.mjs +23 -0
- package/test/manual-html-ui.mjs +30 -0
- package/test/manual-syntax-preview.mjs +26 -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 +68 -0
- package/ui/ArchiveCompressDialog.qml +378 -0
- package/ui/ArchivePasswordDialog.qml +257 -0
- package/ui/Backend.qml +771 -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 +523 -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 +115 -0
- package/ui/Pane.qml +1296 -0
- package/ui/PaneMenuActions.qml +527 -0
- package/ui/PanePath.qml +90 -0
- package/ui/PaneRail.qml +239 -0
- package/ui/PaneStates.qml +88 -0
- package/ui/PaneSwap.qml +339 -0
- package/ui/PaneWire.qml +605 -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 +1004 -0
- package/ui/PreviewAnimation.qml +24 -0
- package/ui/PreviewArchive.qml +66 -0
- package/ui/PreviewColumn.qml +551 -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 +38 -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 +732 -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/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 +827 -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 +122 -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 +364 -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 +502 -0
- package/ui/js/FolderSorts.js +108 -0
- package/ui/js/FolderViews.js +44 -0
- package/ui/js/Format.js +305 -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 +736 -0
- package/ui/js/Tags.js +134 -0
- package/ui/js/Taildrop.js +128 -0
- package/ui/js/Tap.js +174 -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 +81 -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 +228 -0
package/ui/ColumnRow.qml
ADDED
|
@@ -0,0 +1,380 @@
|
|
|
1
|
+
import QtQuick
|
|
2
|
+
import qs.Commons
|
|
3
|
+
import "." as Flea
|
|
4
|
+
import "js/Drag.js" as DragOps
|
|
5
|
+
import "js/Icons.js" as Icons
|
|
6
|
+
import "js/LangMarks.js" as LangMarks
|
|
7
|
+
import "js/Format.js" as Format
|
|
8
|
+
import "js/DirSizes.js" as DirSizes
|
|
9
|
+
import "js/Match.js" as Match
|
|
10
|
+
|
|
11
|
+
// One row of a Miller column: a mark, a name, and the chevron a chosen directory carries. Simpler
|
|
12
|
+
// than a list row on purpose, because a column has no size, date, mode or kind to draw.
|
|
13
|
+
Item {
|
|
14
|
+
id: root
|
|
15
|
+
|
|
16
|
+
// {n, d, i} as a peek answers them, or a listing row, which carries the same three fields.
|
|
17
|
+
property var row: null
|
|
18
|
+
// The pane's thumbnail path for this row, empty for a peek's row: only the listing's own column asks for any.
|
|
19
|
+
property string thumb: ""
|
|
20
|
+
// A path is not a thumbnail: a cache file evicted between the answer and the decode leaves the mark to the glyph.
|
|
21
|
+
readonly property bool thumbDrawn: root.thumb.length > 0 && thumbImage.status !== Image.Error
|
|
22
|
+
// One filename lookup; only a mapped row without a thumbnail builds the mark's Loader.
|
|
23
|
+
readonly property string langSlug: ViewState.langMarks ? LangMarks.slugForRow(root.row) : ""
|
|
24
|
+
property var langLoader: null
|
|
25
|
+
function syncLangMark() { LangMarks.syncMark(root, markGlyph, Qt.resolvedUrl("LangMarkLoader.qml"), Component.Ready) }
|
|
26
|
+
onLangSlugChanged: root.syncLangMark()
|
|
27
|
+
onThumbDrawnChanged: root.syncLangMark()
|
|
28
|
+
readonly property alias iconStatus: thumbImage.status
|
|
29
|
+
readonly property Item thumbItem: thumbImage
|
|
30
|
+
// The row this column's own cursor is on. Only the active column paints it in the accent.
|
|
31
|
+
property bool cursor: false
|
|
32
|
+
// A member of the pane's selection, which only the column drawing the pane's own listing has.
|
|
33
|
+
property bool selected: false
|
|
34
|
+
// The same row in an ancestor column: the cursor trail, lifted like a hover rather than accented.
|
|
35
|
+
property bool lifted: false
|
|
36
|
+
// The active column draws a size; a peek column cannot ask for one and leaves this false.
|
|
37
|
+
property bool showSize: false
|
|
38
|
+
// The recursive size of a directory row, resolved by index the way the list resolves it.
|
|
39
|
+
property var dirSize: null
|
|
40
|
+
// An ancestor column that is not on the trail reads back, so its text drops to muted.
|
|
41
|
+
property bool dim: false
|
|
42
|
+
property bool hovered: false
|
|
43
|
+
// False while ui/ColumnPane.qml's view holds the row pooled, which parks its listing reads and turns its hover off.
|
|
44
|
+
property bool live: true
|
|
45
|
+
ListView.onPooled: root.live = false
|
|
46
|
+
ListView.onReused: root.live = true
|
|
47
|
+
property bool dropTarget: false
|
|
48
|
+
property bool dropCopying: false
|
|
49
|
+
property bool dropLinking: false
|
|
50
|
+
// The area derives it per visible row, so an empty clipboard costs nothing.
|
|
51
|
+
property string clipMark: ""
|
|
52
|
+
// A cut row dims to the ClipMarks board's own opacity, content only.
|
|
53
|
+
readonly property bool clipCut: root.clipMark === "scissors"
|
|
54
|
+
// One dim for the content below, so one ternary serves the mark, the name and the size.
|
|
55
|
+
readonly property real dimOpacity: root.clipCut ? Theme.disabledOpacity : 1
|
|
56
|
+
// One helper, so each dimmed colour multiplies the cut without a second binding.
|
|
57
|
+
function dimmed(base) { return Util.alpha(base, root.dimOpacity) }
|
|
58
|
+
// The mark's own size: 12 px in the muted role, 9 px after the name, per the board.
|
|
59
|
+
readonly property int clipPx: Theme.clipMarkSize
|
|
60
|
+
// The pane's own column hands it over; a peek has none and never marks.
|
|
61
|
+
property var pane: null
|
|
62
|
+
// The column is drawn: a hidden Columns view keeps its rows still and builds no mark on them.
|
|
63
|
+
readonly property bool shown: root.ListView.view === null || root.ListView.view.visible
|
|
64
|
+
// The query List marks on this row, "" for none: a search's answered query, else the "/" filter's.
|
|
65
|
+
readonly property string markQuery: root.pane === null || !root.shown ? "" : root.pane.filterQuery.length > 0 ? root.pane.filterQuery : root.pane.searchMode.length > 0 ? root.pane.swap.answeredQuery : ""
|
|
66
|
+
readonly property bool marking: root.markQuery.length > 0 && root.row !== null
|
|
67
|
+
// List's markArmed: built with the filter strip, or after a search strip's first frame on pooled rows too, so no key or answer builds it.
|
|
68
|
+
readonly property bool markArmed: root.shown && root.pane !== null && (root.pane.searchMode.length > 0 ? root.pane.swap.searchWarm === true : root.row !== null && (root.pane.filterTyping || root.pane.filterQuery.length > 0))
|
|
69
|
+
// The column hands one budget for every row, with ElideMiddle as the backstop.
|
|
70
|
+
property int nameBudget: -1
|
|
71
|
+
property real paintWidth: 0 // Caller view width; fills paint to it under the lane, content keeps rowWidth.
|
|
72
|
+
|
|
73
|
+
// Truthiness, like the two readers below: ui/ColumnPane.qml hands this rows[index] raw, so a
|
|
74
|
+
// listing that shrank leaves a surviving delegate holding undefined, which is not null.
|
|
75
|
+
readonly property bool isDir: !!root.row && root.row.d === true
|
|
76
|
+
// The cut dim lives in the ink, so no child carries its own opacity binding.
|
|
77
|
+
readonly property color ink: root.dimmed(root.cursor ? Theme.color.accent : root.dim ? Theme.color.muted : Theme.color.foreground)
|
|
78
|
+
|
|
79
|
+
// ui/ColumnPane.qml sets it on the renaming (cursor) row: the error line pushes the rows below down as ui/Row.qml's does.
|
|
80
|
+
property real errorGrowth: 0
|
|
81
|
+
// Set by ui/ColumnPane.qml while its editor stands over this row, so the name under it is not drawn twice.
|
|
82
|
+
property bool renaming: false
|
|
83
|
+
// The editor is drawn over the row by ui/ColumnPane.qml, so its y is plain arithmetic on this row height.
|
|
84
|
+
implicitHeight: Theme.fileRowHeight + root.errorGrowth
|
|
85
|
+
|
|
86
|
+
Rectangle {
|
|
87
|
+
width: root.paintWidth > 0 ? root.paintWidth : parent.width
|
|
88
|
+
height: parent.height
|
|
89
|
+
// Match the active listing's cursor and marked-selection roles.
|
|
90
|
+
color: root.cursor ? Style.selectedAccentFill
|
|
91
|
+
: root.selected ? Style.selectionFill
|
|
92
|
+
: root.lifted ? Style.hoverFill
|
|
93
|
+
: root.hovered ? Style.hoverFill
|
|
94
|
+
: "transparent"
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
Rectangle {
|
|
98
|
+
width: Theme.spacing.hairline * 2
|
|
99
|
+
height: parent.height
|
|
100
|
+
color: root.cursor ? Theme.color.accent : "transparent"
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
// The drop wash builds behind the row content, so the accent never tints the text.
|
|
104
|
+
Loader {
|
|
105
|
+
id: washLoader
|
|
106
|
+
active: root.dropTarget
|
|
107
|
+
width: root.paintWidth > 0 ? root.paintWidth : parent.width
|
|
108
|
+
height: parent.height
|
|
109
|
+
// The board's accent hairline over a faint wash at the hover rung's alpha: the token wins over the mock's own 0.07.
|
|
110
|
+
sourceComponent: Rectangle {
|
|
111
|
+
anchors.fill: parent
|
|
112
|
+
color: Util.alpha(Theme.color.accent, Style.hoverFillAlpha)
|
|
113
|
+
border.width: Theme.spacing.hairline
|
|
114
|
+
border.color: Theme.color.accent
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
// The row's first line: its content centres here, so an error line that grows the row never moves the name.
|
|
119
|
+
Item {
|
|
120
|
+
id: line
|
|
121
|
+
width: parent.width
|
|
122
|
+
height: Theme.fileRowHeight
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
Item {
|
|
126
|
+
id: markSlot
|
|
127
|
+
anchors.left: parent.left
|
|
128
|
+
anchors.leftMargin: Theme.spacing.rowPaddingX
|
|
129
|
+
anchors.verticalCenter: line.verticalCenter
|
|
130
|
+
width: Theme.iconSize
|
|
131
|
+
height: Theme.iconSize
|
|
132
|
+
|
|
133
|
+
// Sized on purpose, the same decode arm as ui/Row.qml: the cache PNG is capped at the icon's own size.
|
|
134
|
+
Image {
|
|
135
|
+
id: thumbImage
|
|
136
|
+
anchors.fill: parent
|
|
137
|
+
visible: root.thumbDrawn
|
|
138
|
+
opacity: root.dimOpacity
|
|
139
|
+
sourceSize.width: Theme.iconSize
|
|
140
|
+
sourceSize.height: Theme.iconSize
|
|
141
|
+
fillMode: Image.PreserveAspectFit
|
|
142
|
+
asynchronous: true
|
|
143
|
+
// No cache by URL: a regenerated thumbnail keeps its path, and a cached decode would keep the old pixels.
|
|
144
|
+
cache: false
|
|
145
|
+
source: root.thumb.length > 0 ? Format.fileUri(root.thumb) : ""
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
Flea.Glyph {
|
|
149
|
+
id: markGlyph
|
|
150
|
+
anchors.fill: parent
|
|
151
|
+
visible: !root.thumbDrawn && root.langSlug === ""
|
|
152
|
+
name: root.row ? Icons.glyphForRow(root.row.i, root.row.p) : "file"
|
|
153
|
+
color: root.dimmed(root.cursor ? Theme.color.accent : Theme.color.mutedFrame)
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
// corner: arbitrary filename text draws PlainText and elides in the middle per Names040.
|
|
158
|
+
Text {
|
|
159
|
+
id: nameText
|
|
160
|
+
anchors.left: markSlot.right
|
|
161
|
+
anchors.leftMargin: Theme.spacing.gap
|
|
162
|
+
anchors.right: sizeCell.left
|
|
163
|
+
anchors.rightMargin: (root.row && root.row.shown ? Theme.tagSlotWidth + Theme.spacing.gap : 0) + (root.showSize ? Theme.spacing.gap : 0) + (root.clipMark.length > 0 ? Theme.spacing.gap + root.clipPx : 0)
|
|
164
|
+
anchors.verticalCenter: line.verticalCenter
|
|
165
|
+
visible: !root.renaming && !root.marking
|
|
166
|
+
text: root.row && root.nameBudget >= 0 ? Format.middleElide(Match.rowName(root.row, false), Math.max(0, root.nameBudget - (root.clipMark.length > 0 ? Math.ceil((Theme.spacing.gap + root.clipPx) / Theme.bodyAdvance) : 0))) : Match.rowName(root.row, false)
|
|
167
|
+
color: root.ink
|
|
168
|
+
font.family: Theme.font.family
|
|
169
|
+
font.pixelSize: Theme.font.body
|
|
170
|
+
textFormat: Text.PlainText
|
|
171
|
+
elide: Text.ElideMiddle
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
// A tagged row mounts its swatches (ui/TagSlot.qml) on first need and keeps them; an untagged row builds nothing.
|
|
175
|
+
property var tagItem: null
|
|
176
|
+
onRowChanged: {
|
|
177
|
+
var names = root.row ? root.row.tg : undefined
|
|
178
|
+
if (root.tagItem !== null) root.tagItem.tags = names || []
|
|
179
|
+
else if (names !== undefined) root.tagItem = Qt.createComponent("TagSlot.qml").createObject(root, { tags: names, after: nameText, hug: true })
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
// Only the active column carries a number (ColumnsTabs board rule 3); the size holds its right edge off the parent by the chevron width.
|
|
183
|
+
Text {
|
|
184
|
+
id: sizeCell
|
|
185
|
+
anchors.right: parent.right
|
|
186
|
+
anchors.rightMargin: Theme.spacing.rowPaddingX + chevronSlot.width + (root.showSize ? Theme.spacing.gap : 0)
|
|
187
|
+
anchors.verticalCenter: line.verticalCenter
|
|
188
|
+
visible: root.showSize && !root.dropTarget
|
|
189
|
+
width: visible ? Theme.column.size : 0
|
|
190
|
+
text: root.showSize && root.row ? root.sizeText() : ""
|
|
191
|
+
color: root.ink
|
|
192
|
+
horizontalAlignment: Text.AlignRight
|
|
193
|
+
font.family: Theme.font.family
|
|
194
|
+
font.pixelSize: Theme.font.caption
|
|
195
|
+
textFormat: Text.PlainText
|
|
196
|
+
// A narrow cell loses the ⚖️ before any digit of the size.
|
|
197
|
+
elide: Text.ElideLeft
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
// The drop label, the clip mark and the match mark build above the row content, so a row at rest builds none.
|
|
201
|
+
Loader {
|
|
202
|
+
id: dropClipLoader
|
|
203
|
+
active: root.dropTarget || root.clipMark.length > 0 || root.marking || root.markArmed
|
|
204
|
+
anchors.fill: line
|
|
205
|
+
sourceComponent: Item {
|
|
206
|
+
readonly property Item label: dropParts.item ? dropParts.item.label : null
|
|
207
|
+
readonly property Item mark: dropParts.item ? dropParts.item.mark : null
|
|
208
|
+
property alias names: markContent
|
|
209
|
+
anchors.fill: parent
|
|
210
|
+
// List's match mark and search split, built while a query marks or the strip is up: a row at rest builds none.
|
|
211
|
+
Loader {
|
|
212
|
+
id: markContent
|
|
213
|
+
active: root.marking || root.markArmed
|
|
214
|
+
x: root.markX()
|
|
215
|
+
width: root.markWidth()
|
|
216
|
+
height: parent.height
|
|
217
|
+
visible: root.marking && !root.renaming
|
|
218
|
+
sourceComponent: Item {
|
|
219
|
+
id: markParts
|
|
220
|
+
property alias label: matchName
|
|
221
|
+
readonly property Item folder: folderLoader.item as Item
|
|
222
|
+
// A search row draws its folder beside the name, as List's locating rows do; a "/" filter row keeps the plain name.
|
|
223
|
+
readonly property bool locating: root.pane !== null && root.pane.searchMode.length > 0
|
|
224
|
+
readonly property string path: root.row ? root.row.n : ""
|
|
225
|
+
readonly property string shownName: Match.rowName(root.row, markParts.locating)
|
|
226
|
+
readonly property var run: Match.run(shownName, root.markQuery)
|
|
227
|
+
Flea.MatchText {
|
|
228
|
+
id: matchName
|
|
229
|
+
anchors.left: parent.left
|
|
230
|
+
anchors.verticalCenter: parent.verticalCenter
|
|
231
|
+
width: markParts.locating ? Math.min(implicitWidth, parent.width * Theme.searchNameShare) : parent.width
|
|
232
|
+
text: parent.shownName
|
|
233
|
+
matchStart: parent.run.start
|
|
234
|
+
matchLength: parent.run.length
|
|
235
|
+
color: root.ink
|
|
236
|
+
accent: root.dimmed(Theme.color.accent)
|
|
237
|
+
armed: root.markArmed
|
|
238
|
+
elideMiddle: true
|
|
239
|
+
}
|
|
240
|
+
// Only a search row draws its folder; a "/" filter row builds none.
|
|
241
|
+
Loader {
|
|
242
|
+
id: folderLoader
|
|
243
|
+
active: markParts.locating
|
|
244
|
+
anchors.left: matchName.right
|
|
245
|
+
anchors.leftMargin: Theme.spacing.gap + (root.clipMark.length > 0 ? Theme.spacing.gap + root.clipPx : 0)
|
|
246
|
+
anchors.right: parent.right
|
|
247
|
+
anchors.verticalCenter: parent.verticalCenter
|
|
248
|
+
sourceComponent: Text {
|
|
249
|
+
text: Match.location(markParts.path)
|
|
250
|
+
// List's metadata ink (ui/Row.qml cellInk): foreground on a lifted row, a darker foreground at rest.
|
|
251
|
+
color: root.dimmed(root.cursor || root.lifted || root.hovered || root.selected || root.dropTarget ? Theme.color.foreground : Theme.color.metadata)
|
|
252
|
+
font.family: Theme.font.family
|
|
253
|
+
font.pixelSize: Theme.font.caption
|
|
254
|
+
elide: Text.ElideLeft
|
|
255
|
+
textFormat: Text.PlainText
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
// Built only on a drop target or a clipped row, so a marked row builds neither.
|
|
261
|
+
Loader {
|
|
262
|
+
id: dropParts
|
|
263
|
+
active: root.dropTarget || root.clipMark.length > 0
|
|
264
|
+
anchors.fill: parent
|
|
265
|
+
sourceComponent: Item {
|
|
266
|
+
property alias label: dropLabel
|
|
267
|
+
property alias mark: clipMarkGlyph
|
|
268
|
+
// The label the glyph follows: the match label while a query marks, else the plain name.
|
|
269
|
+
readonly property Item clipLabel: root.marking && markContent.item ? markContent.item.label : nameText
|
|
270
|
+
Text {
|
|
271
|
+
id: dropLabel
|
|
272
|
+
visible: root.dropTarget
|
|
273
|
+
anchors.right: parent.right
|
|
274
|
+
anchors.rightMargin: Theme.spacing.rowPaddingX
|
|
275
|
+
anchors.verticalCenter: parent.verticalCenter
|
|
276
|
+
text: DragOps.label(root.dropCopying, root.dropLinking)
|
|
277
|
+
color: Theme.color.accent
|
|
278
|
+
font.family: Theme.font.family
|
|
279
|
+
font.pixelSize: Theme.font.caption
|
|
280
|
+
textFormat: Text.PlainText
|
|
281
|
+
}
|
|
282
|
+
// The board's own nudge: the mark sits one pixel above the text centre line.
|
|
283
|
+
Flea.Glyph {
|
|
284
|
+
id: clipMarkGlyph
|
|
285
|
+
visible: root.clipMark.length > 0
|
|
286
|
+
width: root.clipPx
|
|
287
|
+
height: root.clipPx
|
|
288
|
+
x: (root.marking && markContent.item ? markContent.x : 0) + parent.clipLabel.x + Math.min(parent.clipLabel.implicitWidth, parent.clipLabel.width) + Theme.spacing.gap
|
|
289
|
+
anchors.verticalCenter: parent.verticalCenter
|
|
290
|
+
anchors.verticalCenterOffset: -1
|
|
291
|
+
name: root.clipMark
|
|
292
|
+
color: Theme.color.mutedFrame
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
// The list's own cell text, so a size reads the same wherever it is drawn.
|
|
300
|
+
function sizeText() {
|
|
301
|
+
if (Format.isSymlink(root.row.p)) return "link"
|
|
302
|
+
if (!root.row.d) return Format.size(root.row.s)
|
|
303
|
+
return DirSizes.folderText(root.dirSize, root.row)
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
// A folder's Size cell takes a click: measure it, as ui/Row.qml's does.
|
|
307
|
+
function onSizeCell(point) {
|
|
308
|
+
if (!root.row || !root.row.d || Format.isSymlink(root.row.p) || !sizeCell.visible || sizeCell.width <= 0) return false
|
|
309
|
+
var at = sizeCell.mapFromItem(root, point.x, point.y)
|
|
310
|
+
return at.x >= 0 && at.x < sizeCell.width
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
// Only a chosen directory carries it: it says the column to the right is showing what is inside.
|
|
314
|
+
Item {
|
|
315
|
+
id: chevronSlot
|
|
316
|
+
anchors.right: parent.right
|
|
317
|
+
anchors.rightMargin: Theme.spacing.rowPaddingX
|
|
318
|
+
anchors.verticalCenter: line.verticalCenter
|
|
319
|
+
width: root.dropTarget && dropClipLoader.item && dropClipLoader.item.label ? dropClipLoader.item.label.implicitWidth : root.showChevron ? Theme.font.caption : 0
|
|
320
|
+
height: root.dropTarget && dropClipLoader.item && dropClipLoader.item.label ? dropClipLoader.item.label.implicitHeight : Theme.font.caption
|
|
321
|
+
|
|
322
|
+
// Built only on the row that draws it, so a row at rest holds no Shape for it, and kept once built so a cursor that moves on hides it without a destroy and rebuild in the frame an answer lands.
|
|
323
|
+
Loader {
|
|
324
|
+
id: chevronLoader
|
|
325
|
+
property bool built: false
|
|
326
|
+
readonly property bool drawn: root.showChevron && !root.dropTarget
|
|
327
|
+
anchors.fill: parent
|
|
328
|
+
visible: drawn
|
|
329
|
+
active: built || drawn
|
|
330
|
+
onDrawnChanged: if (drawn) built = true
|
|
331
|
+
Component.onCompleted: if (drawn) built = true
|
|
332
|
+
sourceComponent: Flea.Glyph {
|
|
333
|
+
name: "chevron-right"
|
|
334
|
+
color: root.cursor ? Theme.color.accent : Theme.color.mutedFrame
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
readonly property bool showChevron: root.isDir && (root.cursor || root.lifted)
|
|
340
|
+
|
|
341
|
+
HoverHandler {
|
|
342
|
+
id: hover
|
|
343
|
+
enabled: root.live
|
|
344
|
+
onHoveredChanged: root.hovered = hovered
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
// Test seam as functions, so no row at rest binds to name geometry (tests/columnscost.qml).
|
|
348
|
+
function clipGlyph() { var m = dropClipLoader.item ? dropClipLoader.item.mark : null; return m && m.visible && m.width > 0 ? m : null }
|
|
349
|
+
function dropClipBuilt() { return dropClipLoader.item !== null && dropClipLoader.item.mark !== null }
|
|
350
|
+
function clipX() { var m = root.clipGlyph(); return m ? m.x : 0 }
|
|
351
|
+
// Paint order as a value: the wash builds behind the content, the label and mark above it.
|
|
352
|
+
function stackingOk() {
|
|
353
|
+
var kids = root.children
|
|
354
|
+
var wash = -1
|
|
355
|
+
var mark = -1
|
|
356
|
+
var top = -1
|
|
357
|
+
for (var i = 0; i < kids.length; i++) {
|
|
358
|
+
if (kids[i] === washLoader) wash = i
|
|
359
|
+
if (kids[i] === markSlot) mark = i
|
|
360
|
+
if (kids[i] === dropClipLoader) top = i
|
|
361
|
+
}
|
|
362
|
+
return wash >= 0 && mark >= 0 && top >= 0 && wash < mark && top > mark
|
|
363
|
+
}
|
|
364
|
+
function clipExpectedX() { var n = root.nameItem(); return n.mapToItem(root, 0, 0).x + Math.min(n.implicitWidth, n.width) + Theme.spacing.gap }
|
|
365
|
+
// Where a marked label starts and how wide it may run: after the mark slot, short of the size cell and the clip mark.
|
|
366
|
+
function markX() { return markSlot.x + markSlot.width + Theme.spacing.gap }
|
|
367
|
+
function markWidth() { return Math.max(0, sizeCell.x - root.markX() - (root.showSize ? Theme.spacing.gap : 0) - (root.clipMark.length > 0 ? Theme.spacing.gap + root.clipPx : 0)) }
|
|
368
|
+
function displayText() { return nameText.text }
|
|
369
|
+
// The drawn label: the match mark while a query marks, so a slow click still lands on the visible name.
|
|
370
|
+
function markPart() { var c = root.marking ? dropClipLoader.item : null; return c ? c.names.item : null }
|
|
371
|
+
function nameItem() { var p = root.markPart(); return p ? p.label : nameText }
|
|
372
|
+
function folderItem() { var p = root.markPart(); return p ? p.folder : null }
|
|
373
|
+
function markItem() { return markGlyph }
|
|
374
|
+
function sizeItem() { return sizeCell }
|
|
375
|
+
// Row-relative boxes for the geometry suite, so the probe reads the drawn layout and not the source.
|
|
376
|
+
function markRight() { return markSlot.x + markSlot.width }
|
|
377
|
+
function nameGeom() { return [nameText.x, nameText.width] }
|
|
378
|
+
function sizeGeom() { return [sizeCell.x, sizeCell.width] }
|
|
379
|
+
function chevronGeom() { return [chevronSlot.x, chevronSlot.width] }
|
|
380
|
+
}
|