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
|
@@ -0,0 +1,409 @@
|
|
|
1
|
+
import QtQuick
|
|
2
|
+
import qs.Commons
|
|
3
|
+
import "." as Flea
|
|
4
|
+
|
|
5
|
+
// One row of the settings panel's pane, drawn from the object ui/js/Settings.js rows() built. Every
|
|
6
|
+
// kind is one row height, the window's own, except a hint, which wraps and takes the height its
|
|
7
|
+
// wording needs; the Settings board's anatomy note is where the "no metric of its own" rule comes from.
|
|
8
|
+
Item {
|
|
9
|
+
id: root
|
|
10
|
+
|
|
11
|
+
// {kind, label, value?, on?, state?} from ui/js/Settings.js; kind decides what is drawn.
|
|
12
|
+
property var row: ({})
|
|
13
|
+
property bool current: false
|
|
14
|
+
property bool firstRow: false
|
|
15
|
+
|
|
16
|
+
signal activated()
|
|
17
|
+
signal pointerMoved()
|
|
18
|
+
signal favouriteMoved(int to)
|
|
19
|
+
signal favouriteRemoved()
|
|
20
|
+
// Every steppable row steps the same way, so h/l and the two chevrons fire one signal, never two.
|
|
21
|
+
signal stepped(int direction)
|
|
22
|
+
// The ruler's own way in: the same writer a step reaches, addressed by stop instead of direction.
|
|
23
|
+
signal stopPicked(int stop)
|
|
24
|
+
|
|
25
|
+
readonly property string kind: root.row.kind || "fact"
|
|
26
|
+
readonly property bool isGroup: root.kind === "group"
|
|
27
|
+
readonly property bool firstGroup: root.isGroup && root.firstRow
|
|
28
|
+
readonly property bool isHint: root.kind === "hint"
|
|
29
|
+
readonly property bool isFooter: root.isHint && root.row.footer === true
|
|
30
|
+
readonly property bool isFavourite: root.kind === "favourite"
|
|
31
|
+
readonly property Item favouriteItem: favourite
|
|
32
|
+
readonly property bool isHero: root.kind === "hero"
|
|
33
|
+
readonly property bool isKeyPreview: root.kind === "keyPreview"
|
|
34
|
+
readonly property bool isLock: root.kind === "lock"
|
|
35
|
+
readonly property bool isRuler: root.kind === "ruler"
|
|
36
|
+
readonly property bool hasBox: root.kind === "check"
|
|
37
|
+
// SettingsMenus rule 3 and SettingsRest rule 3: a heading carrying its group's master or its one action is operated like any other control.
|
|
38
|
+
readonly property bool isGroupControl: root.isGroup && (root.row.master === true || (root.row.action || "") !== "")
|
|
39
|
+
// Length and not Array.isArray: a Repeater hands the delegate a QVariantList wrapper, on which
|
|
40
|
+
// isArray reads false while typeof is "object" and length is right, so the segment never drew.
|
|
41
|
+
// Which control a choice gets, SettingsGrammar rule 1: a segment when every option fits on the row beside the label, the chevron walk when they do not, and nothing else decides it. A Row reports its own implicitWidth whether or not it is itself visible, so measuring the segment and hiding it on the answer is no loop.
|
|
42
|
+
readonly property real segmentChrome: 2 * Theme.spacing.rowPaddingX + Theme.markSize + 3 * Theme.spacing.gap
|
|
43
|
+
readonly property bool hasSegment: root.kind === "choice" && root.row.labels !== undefined && root.row.labels.length > 1
|
|
44
|
+
&& segment.implicitWidth + rowLabel.implicitWidth + root.segmentChrome <= root.width
|
|
45
|
+
readonly property bool hasSteps: root.kind === "choice" && !root.hasSegment
|
|
46
|
+
// The hover lift ui/MenuRow.qml uses, so a settings row and a menu row read alike.
|
|
47
|
+
readonly property real hoverOpacity: Theme.washHover
|
|
48
|
+
// SettingsGrammar rule 7: a dependent greys in place while its parent is off, and an inert check the same way; the grey takes the row's handlers with it, because a control that cannot act must not answer a tap.
|
|
49
|
+
readonly property bool greyed: root.row.available === false || root.hasBox && root.row.inert === true
|
|
50
|
+
readonly property string boxValue: root.row.on === true ? "on" : "off"
|
|
51
|
+
// SettingsMenus rule 5: the one row that can destroy a file carries the urgent role the model already gives it.
|
|
52
|
+
readonly property bool isUrgent: root.row.role === "error" && !root.isHint
|
|
53
|
+
|
|
54
|
+
enabled: !root.greyed
|
|
55
|
+
opacity: root.greyed ? Theme.disabledOpacity : 1
|
|
56
|
+
height: root.isGroup ? groupHead.implicitHeight
|
|
57
|
+
: root.isFavourite ? favourite.implicitHeight : root.isHero ? hero.implicitHeight + 4 * Theme.spacing.rowPaddingY
|
|
58
|
+
: root.isKeyPreview ? keyPreview.implicitHeight + 2 * Theme.spacing.rowPaddingY
|
|
59
|
+
: root.isRuler ? ruler.implicitHeight + 2 * Theme.spacing.rowPaddingY
|
|
60
|
+
: root.isHint ? hint.y + hint.implicitHeight + (root.isFooter
|
|
61
|
+
? Theme.settings.railPaddingY + 2 * Theme.spacing.hairline : SettingsMetrics.hintBottom - SettingsMetrics.hintLead) : Theme.rowHeight
|
|
62
|
+
|
|
63
|
+
Grid {
|
|
64
|
+
id: keyPreview
|
|
65
|
+
visible: root.isKeyPreview
|
|
66
|
+
x: Theme.spacing.rowPaddingX
|
|
67
|
+
y: Theme.spacing.rowPaddingY
|
|
68
|
+
width: parent.width - 2 * Theme.spacing.rowPaddingX
|
|
69
|
+
columns: 2
|
|
70
|
+
spacing: Theme.spacing.gap
|
|
71
|
+
Repeater {
|
|
72
|
+
model: root.isKeyPreview ? root.row.items : []
|
|
73
|
+
delegate: Item {
|
|
74
|
+
id: binding
|
|
75
|
+
required property var modelData
|
|
76
|
+
width: (keyPreview.width - keyPreview.spacing) / 2
|
|
77
|
+
height: Theme.hitMin
|
|
78
|
+
Rectangle {
|
|
79
|
+
id: cap
|
|
80
|
+
width: Math.min(capText.implicitWidth + Theme.spacing.gap, parent.width)
|
|
81
|
+
height: parent.height
|
|
82
|
+
color: "transparent"
|
|
83
|
+
border.width: Theme.spacing.hairline
|
|
84
|
+
border.color: Theme.color.mutedFrame
|
|
85
|
+
Text {
|
|
86
|
+
id: capText
|
|
87
|
+
anchors.fill: parent
|
|
88
|
+
anchors.margins: Theme.spacing.hairline
|
|
89
|
+
horizontalAlignment: Text.AlignHCenter
|
|
90
|
+
verticalAlignment: Text.AlignVCenter
|
|
91
|
+
text: binding.modelData.keys
|
|
92
|
+
font.family: Theme.font.family
|
|
93
|
+
font.pixelSize: Theme.font.caption
|
|
94
|
+
color: Theme.color.foreground
|
|
95
|
+
textFormat: Text.PlainText
|
|
96
|
+
elide: Text.ElideRight
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
Flea.Glyph {
|
|
100
|
+
id: bindingMark
|
|
101
|
+
x: cap.width + Theme.spacing.gap
|
|
102
|
+
anchors.verticalCenter: parent.verticalCenter
|
|
103
|
+
visible: !!binding.modelData.glyph
|
|
104
|
+
width: visible ? Theme.chromeMarkSize : 0
|
|
105
|
+
height: width
|
|
106
|
+
name: binding.modelData.glyph || "file"
|
|
107
|
+
color: Theme.color.mutedFrame
|
|
108
|
+
}
|
|
109
|
+
Text {
|
|
110
|
+
x: bindingMark.x + bindingMark.width + (bindingMark.visible ? Theme.spacing.gap : 0)
|
|
111
|
+
width: Math.max(0, parent.width - x)
|
|
112
|
+
height: parent.height
|
|
113
|
+
verticalAlignment: Text.AlignVCenter
|
|
114
|
+
text: binding.modelData.label
|
|
115
|
+
font.family: Theme.font.family
|
|
116
|
+
font.pixelSize: Theme.font.caption
|
|
117
|
+
color: Theme.color.foreground
|
|
118
|
+
textFormat: Text.PlainText
|
|
119
|
+
elide: Text.ElideRight
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
Flea.SettingsFavourite {
|
|
126
|
+
id: favourite
|
|
127
|
+
anchors.fill: parent
|
|
128
|
+
visible: root.isFavourite
|
|
129
|
+
row: root.row
|
|
130
|
+
onActivated: root.activated()
|
|
131
|
+
onMoved: function (to) { root.favouriteMoved(to) }
|
|
132
|
+
onRemoved: root.favouriteRemoved()
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
Column {
|
|
136
|
+
id: hero
|
|
137
|
+
visible: root.isHero
|
|
138
|
+
anchors.centerIn: parent
|
|
139
|
+
spacing: Theme.spacing.gap
|
|
140
|
+
Flea.FleaMark {
|
|
141
|
+
anchors.horizontalCenter: parent.horizontalCenter
|
|
142
|
+
width: Theme.markSize * 2
|
|
143
|
+
height: width
|
|
144
|
+
color: Theme.color.accent
|
|
145
|
+
}
|
|
146
|
+
Text {
|
|
147
|
+
anchors.horizontalCenter: parent.horizontalCenter
|
|
148
|
+
text: root.row.label || ""
|
|
149
|
+
font.family: Theme.font.family
|
|
150
|
+
font.pixelSize: Theme.font.body
|
|
151
|
+
font.bold: true
|
|
152
|
+
color: Theme.color.foreground
|
|
153
|
+
textFormat: Text.PlainText
|
|
154
|
+
}
|
|
155
|
+
Text {
|
|
156
|
+
anchors.horizontalCenter: parent.horizontalCenter
|
|
157
|
+
text: root.row.value || ""
|
|
158
|
+
font.family: Theme.font.family
|
|
159
|
+
font.pixelSize: Theme.font.caption
|
|
160
|
+
color: Theme.color.foreground
|
|
161
|
+
textFormat: Text.PlainText
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
Rectangle {
|
|
166
|
+
anchors.fill: parent
|
|
167
|
+
visible: root.current
|
|
168
|
+
color: Theme.color.foreground
|
|
169
|
+
opacity: root.hoverOpacity
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
Rectangle {
|
|
173
|
+
anchors.top: parent.top
|
|
174
|
+
anchors.topMargin: root.isFooter ? Theme.settings.railPaddingY : groupHead.gap
|
|
175
|
+
width: parent.width
|
|
176
|
+
height: Theme.spacing.hairline
|
|
177
|
+
visible: root.isFooter || root.isGroup && !root.firstGroup
|
|
178
|
+
color: Theme.color.mutedFrame
|
|
179
|
+
opacity: 0.4
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
// A heading and a hint are the only two rows that are not a label and a control on one line, so
|
|
183
|
+
// they draw instead of the pair below rather than beside it.
|
|
184
|
+
Flea.SettingsGroup {
|
|
185
|
+
id: groupHead
|
|
186
|
+
visible: root.isGroup
|
|
187
|
+
width: parent.width
|
|
188
|
+
row: root.row
|
|
189
|
+
first: root.firstGroup
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
Flea.SettingsHint {
|
|
193
|
+
id: hint
|
|
194
|
+
visible: root.isHint
|
|
195
|
+
footer: root.isFooter
|
|
196
|
+
x: root.isFooter ? Theme.spacing.rowPaddingX : markSlot.x + markSlot.width + Theme.spacing.gap
|
|
197
|
+
y: root.isFooter ? 2 * Theme.settings.railPaddingY + Theme.spacing.hairline : SettingsMetrics.hintTop + SettingsMetrics.hintLead
|
|
198
|
+
width: parent.width - x - Theme.spacing.rowPaddingX
|
|
199
|
+
text: root.row.label || ""
|
|
200
|
+
color: root.row.role === "error" ? Theme.color.error
|
|
201
|
+
: root.row.role === "accent" ? Theme.color.accent
|
|
202
|
+
: root.row.role === "foreground" ? Theme.color.foreground : Theme.color.muted
|
|
203
|
+
wrapMode: root.row.elide === "right" ? Text.NoWrap : Text.WordWrap
|
|
204
|
+
elide: root.row.elide === "right" ? Text.ElideRight : Text.ElideNone
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
// Every board row carries a mark in one column, so a section reads as a column and not a ragged
|
|
208
|
+
// list; a row the boards give no mark keeps the slot open rather than closing it up. ui/MenuRow.qml
|
|
209
|
+
// is the pattern, brand marks included, and the slot sets the label's indent the same way.
|
|
210
|
+
Item {
|
|
211
|
+
id: markSlot
|
|
212
|
+
visible: !root.isGroup && !root.isHint && !root.isHero && !root.isFavourite && !root.isKeyPreview
|
|
213
|
+
anchors.left: parent.left
|
|
214
|
+
anchors.leftMargin: Theme.spacing.rowPaddingX
|
|
215
|
+
anchors.verticalCenter: parent.verticalCenter
|
|
216
|
+
width: Theme.markSize
|
|
217
|
+
height: Theme.markSize
|
|
218
|
+
|
|
219
|
+
Flea.Glyph {
|
|
220
|
+
anchors.fill: parent
|
|
221
|
+
visible: root.row.glyph !== undefined && root.row.mark === undefined
|
|
222
|
+
name: root.row.glyph !== undefined ? root.row.glyph : "file"
|
|
223
|
+
color: root.isUrgent ? Theme.color.error : Theme.color.mutedFrame
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
Flea.TailscaleMark {
|
|
227
|
+
anchors.centerIn: parent
|
|
228
|
+
visible: root.row.mark === "tailscale"
|
|
229
|
+
iconSize: Theme.markSize
|
|
230
|
+
color: Theme.color.mutedFrame
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
Flea.DropboxMark {
|
|
234
|
+
anchors.centerIn: parent
|
|
235
|
+
visible: root.row.mark === "dropbox"
|
|
236
|
+
iconSize: Theme.markSize
|
|
237
|
+
color: Theme.color.mutedFrame
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
Flea.LocalSendMark {
|
|
241
|
+
anchors.centerIn: parent
|
|
242
|
+
visible: root.row.mark === "localsend"
|
|
243
|
+
iconSize: Theme.markSize
|
|
244
|
+
color: Theme.color.mutedFrame
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
Flea.HyprlandMark {
|
|
248
|
+
anchors.centerIn: parent
|
|
249
|
+
visible: root.row.mark === "hyprland"
|
|
250
|
+
iconSize: Theme.markSize
|
|
251
|
+
color: Theme.color.mutedFrame
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
// The shelf is Flea's own destination, so its switch carries Flea's own mark, the way ui/MenuRow.qml draws the row it governs.
|
|
255
|
+
Flea.FleaMark {
|
|
256
|
+
anchors.centerIn: parent
|
|
257
|
+
visible: root.row.mark === "flea"
|
|
258
|
+
width: Theme.markSize
|
|
259
|
+
height: Theme.markSize
|
|
260
|
+
color: Theme.color.mutedFrame
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
// A ruler is the row above it continued, so it starts at that row's label column, as a hint
|
|
265
|
+
// does: HANDOFF rules 3 and 8, nothing is indented and a hint sits under its control's label.
|
|
266
|
+
Flea.SettingsRuler {
|
|
267
|
+
id: ruler
|
|
268
|
+
visible: root.isRuler
|
|
269
|
+
anchors.left: markSlot.right
|
|
270
|
+
anchors.leftMargin: Theme.spacing.gap
|
|
271
|
+
anchors.right: parent.right
|
|
272
|
+
anchors.rightMargin: Theme.spacing.rowPaddingX
|
|
273
|
+
anchors.verticalCenter: parent.verticalCenter
|
|
274
|
+
height: ruler.implicitHeight
|
|
275
|
+
stops: root.row.stops !== undefined ? root.row.stops : []
|
|
276
|
+
index: root.row.index !== undefined ? root.row.index : -1
|
|
277
|
+
active: root.row.on === true
|
|
278
|
+
onPicked: function (stop) { root.stopPicked(stop) }
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
Text {
|
|
282
|
+
id: rowLabel
|
|
283
|
+
visible: !root.isGroup && !root.isHint && !root.isHero && !root.isFavourite && !root.isRuler && !root.isKeyPreview
|
|
284
|
+
anchors.left: markSlot.right
|
|
285
|
+
anchors.leftMargin: Theme.spacing.gap
|
|
286
|
+
anchors.right: trailing.left
|
|
287
|
+
anchors.rightMargin: Theme.spacing.gap
|
|
288
|
+
anchors.verticalCenter: parent.verticalCenter
|
|
289
|
+
text: root.row.label || ""
|
|
290
|
+
color: root.isUrgent ? Theme.color.error
|
|
291
|
+
: root.isLock || root.kind === "fact" ? Theme.color.muted : Theme.color.foreground
|
|
292
|
+
font.family: Theme.font.family
|
|
293
|
+
font.pixelSize: Theme.font.body
|
|
294
|
+
textFormat: Text.PlainText
|
|
295
|
+
elide: Text.ElideRight
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
// Row lays its children out itself, so none of them anchors vertically: each takes the mark
|
|
299
|
+
// height and centres its own content inside that, which keeps one baseline across four kinds.
|
|
300
|
+
Row {
|
|
301
|
+
id: trailing
|
|
302
|
+
anchors.right: parent.right
|
|
303
|
+
anchors.rightMargin: Theme.spacing.rowPaddingX
|
|
304
|
+
anchors.verticalCenter: parent.verticalCenter
|
|
305
|
+
spacing: Theme.spacing.gap
|
|
306
|
+
|
|
307
|
+
// A choice's name, a fact's value and the caption a check row carries are all one thing: the value the row currently holds, drawn on the right the way the boards draw it. SettingsRest rule 6 mutes a fact whole, and the one fact reporting a live number keeps the foreground for it; rule 5 takes the head off a value whose identity is in its tail.
|
|
308
|
+
Text {
|
|
309
|
+
visible: root.kind === "fact" || root.kind === "action" || root.hasSteps
|
|
310
|
+
|| (root.hasBox && (root.row.value || "") !== "")
|
|
311
|
+
height: Theme.markSize
|
|
312
|
+
verticalAlignment: Text.AlignVCenter
|
|
313
|
+
text: root.row.value || ""
|
|
314
|
+
color: root.row.role === "accent" ? Theme.color.accent
|
|
315
|
+
: root.hasSteps || root.row.role === "live" ? Theme.color.foreground : Theme.color.muted
|
|
316
|
+
font.family: Theme.font.family
|
|
317
|
+
font.pixelSize: Theme.font.body
|
|
318
|
+
textFormat: Text.PlainText
|
|
319
|
+
width: Math.min(implicitWidth, root.width * 0.56)
|
|
320
|
+
elide: root.row.elide === "head" ? Text.ElideLeft : Text.ElideRight
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
// SettingsRest draws the sentence after the value it explains, so the row reads label, value, sentence; half the row at most, or the label would elide to make space for prose.
|
|
324
|
+
Text {
|
|
325
|
+
id: caption
|
|
326
|
+
visible: !!root.row.caption && width > 0
|
|
327
|
+
height: Theme.markSize
|
|
328
|
+
// The boards centre each line box on the row, so the baseline sits a fixed shift from the label's, on a whole pixel; a Row sets x only, so y is ours.
|
|
329
|
+
y: Math.round(rowLabel.y + rowLabel.baselineOffset) + SettingsMetrics.captionShift - Math.round(caption.baselineOffset) - trailing.y
|
|
330
|
+
text: root.row.caption || ""
|
|
331
|
+
color: Theme.color.muted
|
|
332
|
+
font.family: Theme.font.family
|
|
333
|
+
font.pixelSize: Theme.font.caption
|
|
334
|
+
textFormat: Text.PlainText
|
|
335
|
+
width: Math.min(implicitWidth, Math.round(root.width * 0.5))
|
|
336
|
+
elide: Text.ElideRight
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
Flea.SettingsSegment {
|
|
340
|
+
id: segment
|
|
341
|
+
visible: root.hasSegment
|
|
342
|
+
options: root.row.labels !== undefined ? root.row.labels : []
|
|
343
|
+
value: root.row.value || ""
|
|
344
|
+
glyphs: root.row.id === "view" ? root.row.values : []
|
|
345
|
+
onPicked: function (i) { root.stopPicked(i) }
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
Flea.Glyph {
|
|
349
|
+
visible: root.hasSteps || root.kind === "action" && root.row.inert !== true
|
|
350
|
+
width: visible ? Theme.markSize : 0
|
|
351
|
+
height: Theme.markSize
|
|
352
|
+
name: "chevron-right"
|
|
353
|
+
color: Theme.color.mutedFrame
|
|
354
|
+
|
|
355
|
+
TapHandler {
|
|
356
|
+
enabled: root.hasSteps
|
|
357
|
+
gesturePolicy: TapHandler.ReleaseWithinBounds
|
|
358
|
+
onTapped: root.stepped(1)
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
// A locked row draws the lock mark where the box would be, so the section stays a complete
|
|
363
|
+
// list of what the menu can contain rather than hiding the two rows nobody can switch off.
|
|
364
|
+
Flea.Glyph {
|
|
365
|
+
visible: root.isLock
|
|
366
|
+
width: root.isLock ? Theme.markSize : 0
|
|
367
|
+
height: Theme.markSize
|
|
368
|
+
name: "lock"
|
|
369
|
+
color: Theme.color.mutedFrame
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
Flea.CheckBox {
|
|
373
|
+
visible: root.hasBox
|
|
374
|
+
width: root.hasBox ? implicitWidth : 0
|
|
375
|
+
value: root.boxValue
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
HoverHandler {
|
|
380
|
+
id: pointer
|
|
381
|
+
enabled: root.hasBox || root.isGroupControl || root.kind === "choice" || root.kind === "action" || root.isFavourite
|
|
382
|
+
property bool armed: false
|
|
383
|
+
property point restingAt
|
|
384
|
+
onHoveredChanged: pointer.armed = false
|
|
385
|
+
onPointChanged: {
|
|
386
|
+
if (!pointer.hovered) return
|
|
387
|
+
if (!pointer.armed) {
|
|
388
|
+
pointer.armed = true
|
|
389
|
+
pointer.restingAt = pointer.point.scenePosition
|
|
390
|
+
return
|
|
391
|
+
}
|
|
392
|
+
// Scrolling moves the row beneath a resting pointer; only scene-space motion selects it.
|
|
393
|
+
if (pointer.point.scenePosition.x !== pointer.restingAt.x || pointer.point.scenePosition.y !== pointer.restingAt.y)
|
|
394
|
+
root.pointerMoved()
|
|
395
|
+
pointer.restingAt = pointer.point.scenePosition
|
|
396
|
+
}
|
|
397
|
+
cursorShape: Qt.PointingHandCursor
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
// A segment and a ruler each own their own targets, so the row behind them must not also fire:
|
|
401
|
+
// a tap on the option already showing would otherwise toggle the very setting it names.
|
|
402
|
+
TapHandler {
|
|
403
|
+
enabled: (root.hasBox || root.isGroupControl || root.kind === "action") && !root.isLock && !root.hasSteps
|
|
404
|
+
&& !root.hasSegment && !root.isRuler
|
|
405
|
+
acceptedButtons: Qt.LeftButton
|
|
406
|
+
gesturePolicy: TapHandler.ReleaseWithinBounds
|
|
407
|
+
onTapped: root.activated()
|
|
408
|
+
}
|
|
409
|
+
}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import QtQuick
|
|
2
|
+
|
|
3
|
+
// The Display board's seven-stop ruler: one tick per size Omarchy offers, each carrying its own
|
|
4
|
+
// number, with the stop in force marked by a taller tick under a foreground number rather than by a
|
|
5
|
+
// fill nobody could read (SettingsRest rule 2). The marked tick takes the accent once an override
|
|
6
|
+
// makes the ruler the control, which is the Blueprint's own rule for an active control against a
|
|
7
|
+
// quiet one, and stays muted while Omarchy owns the size and the ruler is only reporting it.
|
|
8
|
+
Item {
|
|
9
|
+
id: root
|
|
10
|
+
|
|
11
|
+
property var stops: []
|
|
12
|
+
// The last filled tick. Omarchy can be on a size that is not a stop, so the caller fills to the
|
|
13
|
+
// nearest one rather than leaving the ruler blank.
|
|
14
|
+
property int index: -1
|
|
15
|
+
property bool active: false
|
|
16
|
+
|
|
17
|
+
signal picked(int stop)
|
|
18
|
+
|
|
19
|
+
readonly property int tickGap: Theme.spacing.hairline * 2
|
|
20
|
+
readonly property int tickHeight: Theme.spacing.hairline * 3
|
|
21
|
+
// The board's own 7 against 11: the stop in force stands taller, so the mark is never a colour alone.
|
|
22
|
+
readonly property int markedHeight: Theme.spacing.hairline * 5
|
|
23
|
+
// And the board's own 2 against 3 across; the tap target is the slot behind the ink, so a mark this narrow still answers a click anywhere on its stop.
|
|
24
|
+
readonly property int tickInk: Theme.spacing.hairline * 2
|
|
25
|
+
readonly property int markedInk: Theme.spacing.hairline * 3
|
|
26
|
+
// The hairline treatment the panel already uses for a quiet edge, so an unmarked stop reads as one.
|
|
27
|
+
readonly property real restOpacity: 0.4
|
|
28
|
+
readonly property real tickWidth: root.stops.length > 0
|
|
29
|
+
? (root.width - root.tickGap * (root.stops.length - 1)) / root.stops.length : 0
|
|
30
|
+
readonly property real numberHeight: Theme.font.caption * 1.5
|
|
31
|
+
// WCAG 2.5.8's floor under the tap target, whatever height the numbers and ticks come to.
|
|
32
|
+
readonly property int hitHeight: Math.max(Theme.hitMin, Math.round(root.numberHeight + root.markedHeight))
|
|
33
|
+
|
|
34
|
+
implicitHeight: root.hitHeight
|
|
35
|
+
|
|
36
|
+
Repeater {
|
|
37
|
+
model: root.stops
|
|
38
|
+
|
|
39
|
+
delegate: Item {
|
|
40
|
+
id: tick
|
|
41
|
+
required property var modelData
|
|
42
|
+
required property int index
|
|
43
|
+
readonly property bool marked: tick.index === root.index
|
|
44
|
+
|
|
45
|
+
// The hit box is taller than the drawn tick and centred on the ruler, so it moves nothing.
|
|
46
|
+
x: tick.index * (root.tickWidth + root.tickGap)
|
|
47
|
+
y: Math.round((root.height - tick.height) / 2)
|
|
48
|
+
width: root.tickWidth
|
|
49
|
+
height: root.hitHeight
|
|
50
|
+
|
|
51
|
+
Text {
|
|
52
|
+
id: number
|
|
53
|
+
anchors.horizontalCenter: parent.horizontalCenter
|
|
54
|
+
y: Math.round((root.numberHeight - implicitHeight) / 2)
|
|
55
|
+
text: tick.modelData
|
|
56
|
+
color: tick.marked ? Theme.color.foreground : Theme.color.muted
|
|
57
|
+
opacity: tick.marked ? 1 : root.restOpacity
|
|
58
|
+
font.family: Theme.font.family
|
|
59
|
+
font.pixelSize: Theme.font.caption
|
|
60
|
+
textFormat: Text.PlainText
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
Rectangle {
|
|
64
|
+
anchors.horizontalCenter: parent.horizontalCenter
|
|
65
|
+
y: Math.round(root.numberHeight)
|
|
66
|
+
width: tick.marked ? root.markedInk : root.tickInk
|
|
67
|
+
height: tick.marked ? root.markedHeight : root.tickHeight
|
|
68
|
+
color: root.active && tick.marked ? Theme.color.accent : Theme.color.mutedFrame
|
|
69
|
+
opacity: tick.marked ? 1 : root.restOpacity
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
HoverHandler {
|
|
73
|
+
enabled: root.active
|
|
74
|
+
cursorShape: Qt.PointingHandCursor
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
TapHandler {
|
|
78
|
+
enabled: root.active
|
|
79
|
+
acceptedButtons: Qt.LeftButton
|
|
80
|
+
gesturePolicy: TapHandler.ReleaseWithinBounds
|
|
81
|
+
onTapped: root.picked(tick.modelData)
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import QtQuick
|
|
2
|
+
import "." as Flea
|
|
3
|
+
import "js/Buttons.js" as Buttons
|
|
4
|
+
|
|
5
|
+
// The Display board's two-value control: both names side by side, the current one bright, rather than
|
|
6
|
+
// the chevron walk a longer list needs. ui/SettingsRow.qml draws it for any row whose model names its
|
|
7
|
+
// options, and the row above owns the writer, so nothing here holds state.
|
|
8
|
+
Row {
|
|
9
|
+
id: root
|
|
10
|
+
|
|
11
|
+
property var options: []
|
|
12
|
+
property string value: ""
|
|
13
|
+
property var glyphs: []
|
|
14
|
+
// A host that puts the row in its Tab order (a dialog's Format) sets this; Settings never focuses it.
|
|
15
|
+
property bool tabStop: false
|
|
16
|
+
// The hit minimum in Settings; a chrome strip hosts the same cells at its control height.
|
|
17
|
+
property int cellHeight: Theme.hitMin
|
|
18
|
+
|
|
19
|
+
// The option a pointer chose, which is never the one already showing.
|
|
20
|
+
signal picked(int index)
|
|
21
|
+
|
|
22
|
+
spacing: Theme.spacing.hairline * Buttons.SEGMENT_GAP
|
|
23
|
+
|
|
24
|
+
Repeater {
|
|
25
|
+
model: root.options
|
|
26
|
+
|
|
27
|
+
delegate: Rectangle {
|
|
28
|
+
id: segment
|
|
29
|
+
required property var modelData
|
|
30
|
+
required property int index
|
|
31
|
+
|
|
32
|
+
readonly property bool current: segment.modelData === root.value
|
|
33
|
+
readonly property string glyph: root.glyphs[segment.index] || ""
|
|
34
|
+
// A segment that takes the keyboard (a dialog's Tab stop) marks its current cell as DialogButton marks a focused set member.
|
|
35
|
+
readonly property bool focusedHere: root.tabStop && segment.current && root.activeFocus && segment.glyph.length === 0
|
|
36
|
+
// Accent where it has hue, else RING wide in the foreground, both inside the cell like DialogButton's set member.
|
|
37
|
+
readonly property string focusFrame: Buttons.focusFrame(Theme.color.accentHasHue, true, false)
|
|
38
|
+
|
|
39
|
+
// The WCAG floor the Blueprint sets for a compact control, which this row has room for.
|
|
40
|
+
width: segment.glyph ? Math.max(Theme.hitMin, Theme.railIconSize + 2 * (Theme.spacing.gap - Theme.spacing.hairline))
|
|
41
|
+
: name.implicitWidth + 2 * Theme.spacing.gap
|
|
42
|
+
height: root.cellHeight
|
|
43
|
+
// Containers rule 4: a segmented cell is never filled, so the choice reads as brightness.
|
|
44
|
+
color: "transparent"
|
|
45
|
+
// Rule 3: words in a set are Tier B and every member wears the box; glyphs in a strip are
|
|
46
|
+
// Tier A, where a box around four marks would be furniture.
|
|
47
|
+
border.width: segment.glyph ? 0 : segment.focusedHere && segment.focusFrame === "thick" ? Buttons.RING : Theme.spacing.hairline
|
|
48
|
+
border.color: segment.focusedHere && segment.focusFrame === "accent" ? Theme.color.accent
|
|
49
|
+
: segment.current ? Theme.color.foreground : Theme.color.mutedFrame
|
|
50
|
+
Accessible.role: Accessible.Button
|
|
51
|
+
Accessible.name: String(segment.modelData)
|
|
52
|
+
Accessible.onPressAction: root.picked(segment.index)
|
|
53
|
+
|
|
54
|
+
Flea.Glyph {
|
|
55
|
+
anchors.centerIn: parent
|
|
56
|
+
visible: segment.glyph.length > 0
|
|
57
|
+
width: Theme.railIconSize
|
|
58
|
+
height: width
|
|
59
|
+
name: segment.glyph || "file"
|
|
60
|
+
color: segment.current ? Theme.color.foreground : Theme.color.mutedFrame
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
Text {
|
|
64
|
+
id: name
|
|
65
|
+
visible: segment.glyph.length === 0
|
|
66
|
+
anchors.centerIn: parent
|
|
67
|
+
text: segment.modelData
|
|
68
|
+
color: segment.current ? Theme.color.foreground : Theme.color.muted
|
|
69
|
+
font.family: Theme.font.family
|
|
70
|
+
font.pixelSize: Theme.font.caption
|
|
71
|
+
textFormat: Text.PlainText
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
HoverHandler {
|
|
75
|
+
cursorShape: Qt.PointingHandCursor
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
TapHandler {
|
|
79
|
+
acceptedButtons: Qt.LeftButton
|
|
80
|
+
gesturePolicy: TapHandler.ReleaseWithinBounds
|
|
81
|
+
onTapped: if (!segment.current) root.picked(segment.index)
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|