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,172 @@
|
|
|
1
|
+
import QtQuick
|
|
2
|
+
import qs.Commons
|
|
3
|
+
import qs.Commons as Commons
|
|
4
|
+
|
|
5
|
+
Item {
|
|
6
|
+
id: root
|
|
7
|
+
|
|
8
|
+
property var bar: null
|
|
9
|
+
property string text: ""
|
|
10
|
+
property string fontFamily: bar ? bar.fontFamily : Style.font.family
|
|
11
|
+
property real fontSize: Style.font.body
|
|
12
|
+
property color foreground: bar ? bar.barForeground : Commons.Color.foreground
|
|
13
|
+
property color activeColor: bar ? bar.urgent : Commons.Color.urgent
|
|
14
|
+
property bool active: false
|
|
15
|
+
property real horizontalMargin: 8.5
|
|
16
|
+
property real verticalPadding: 6
|
|
17
|
+
property real fixedWidth: -1
|
|
18
|
+
property real fixedHeight: -1
|
|
19
|
+
property real textRotation: 0
|
|
20
|
+
property bool keepSpace: false
|
|
21
|
+
property bool dimmed: false
|
|
22
|
+
property bool concealed: false
|
|
23
|
+
property bool interactive: true
|
|
24
|
+
property bool pressable: true
|
|
25
|
+
property bool useActiveColor: true
|
|
26
|
+
property bool maintainIndicatorReveal: false
|
|
27
|
+
property bool labelVisible: true
|
|
28
|
+
// Off for icon-font labels, whose figure metrics say nothing about the glyph.
|
|
29
|
+
property bool centerFigures: true
|
|
30
|
+
property bool hasVisualContent: text !== ""
|
|
31
|
+
property var revealHost: bar
|
|
32
|
+
property string tooltipText: ""
|
|
33
|
+
property var registeredBar: null
|
|
34
|
+
|
|
35
|
+
signal pressed(int button)
|
|
36
|
+
signal wheelMoved(int delta)
|
|
37
|
+
|
|
38
|
+
function triggerPress(button) {
|
|
39
|
+
if (root.bar) root.bar.hideTooltip(root)
|
|
40
|
+
root.pressed(button)
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
function hideOwnTooltip() {
|
|
44
|
+
if (root.bar) root.bar.hideTooltip(root)
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function syncClickRegistration() {
|
|
48
|
+
if (registeredBar && registeredBar.unregisterClickTarget) registeredBar.unregisterClickTarget(root)
|
|
49
|
+
registeredBar = root.bar
|
|
50
|
+
if (registeredBar && registeredBar.registerClickTarget) registeredBar.registerClickTarget(root)
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
onBarChanged: syncClickRegistration()
|
|
54
|
+
onVisibleChanged: if (!visible) hideOwnTooltip()
|
|
55
|
+
onInteractiveChanged: if (!interactive) hideOwnTooltip()
|
|
56
|
+
onConcealedChanged: if (concealed) hideOwnTooltip()
|
|
57
|
+
Component.onCompleted: syncClickRegistration()
|
|
58
|
+
Component.onDestruction: if (registeredBar && registeredBar.unregisterClickTarget) registeredBar.unregisterClickTarget(root)
|
|
59
|
+
|
|
60
|
+
readonly property bool vertical: bar ? bar.vertical : false
|
|
61
|
+
readonly property int barSize: bar ? bar.barSize : Style.bar.sizeHorizontal
|
|
62
|
+
readonly property real scaledHorizontalMargin: Style.spaceReal(horizontalMargin)
|
|
63
|
+
readonly property real scaledVerticalPadding: Style.spaceReal(verticalPadding)
|
|
64
|
+
readonly property bool tooltipHovered: visible && interactive && !concealed && mouseArea.containsMouse
|
|
65
|
+
// Width of the painted label, for bar chrome that wants to line up with the
|
|
66
|
+
// text rather than with the slot it sits in. Zero on icon-only buttons.
|
|
67
|
+
readonly property real labelWidth: label.visible ? label.implicitWidth : 0
|
|
68
|
+
readonly property bool iconLabel: labelVisible && isIconGlyph(text)
|
|
69
|
+
readonly property real iconPaintedWidth: iconLabel && iconLoader.item ? iconLoader.item.paintedWidth : 0
|
|
70
|
+
readonly property real iconPaintedHeight: iconLabel && iconLoader.item ? iconLoader.item.paintedHeight : 0
|
|
71
|
+
readonly property real iconCenterErrorX: iconLabel && iconLoader.item
|
|
72
|
+
? iconLoader.x + iconLoader.item.paintedCenterX - width / 2 : 0
|
|
73
|
+
readonly property real iconCenterErrorY: iconLabel && iconLoader.item
|
|
74
|
+
? iconLoader.y + iconLoader.item.paintedCenterY - height / 2 : 0
|
|
75
|
+
|
|
76
|
+
function isIconGlyph(value) {
|
|
77
|
+
var text = String(value || "")
|
|
78
|
+
if (!text) return false
|
|
79
|
+
var code = text.codePointAt(0)
|
|
80
|
+
if (text.length !== (code > 0xffff ? 2 : 1)) return false
|
|
81
|
+
return (code >= 0xe000 && code <= 0xf8ff)
|
|
82
|
+
|| (code >= 0xf0000 && code <= 0xffffd)
|
|
83
|
+
|| (code >= 0x100000 && code <= 0x10fffd)
|
|
84
|
+
|| (code >= 0x2190 && code <= 0x2bff)
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
visible: hasVisualContent || keepSpace
|
|
88
|
+
opacity: !hasVisualContent || concealed ? 0 : (dimmed ? 0.45 : 1)
|
|
89
|
+
implicitWidth: fixedWidth > 0 ? fixedWidth
|
|
90
|
+
: (vertical ? barSize : (iconLabel ? Style.bar.iconSlot : Math.max(12, label.implicitWidth + scaledHorizontalMargin * 2)))
|
|
91
|
+
implicitHeight: fixedHeight > 0 ? fixedHeight
|
|
92
|
+
: (vertical ? (iconLabel ? Style.bar.iconSlot : Math.max(12, label.implicitHeight + scaledVerticalPadding * 2)) : barSize)
|
|
93
|
+
|
|
94
|
+
Behavior on opacity {
|
|
95
|
+
NumberAnimation { duration: Style.duration(140); easing.type: Easing.OutCubic }
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
Text {
|
|
99
|
+
id: label
|
|
100
|
+
textFormat: Text.PlainText
|
|
101
|
+
visible: root.labelVisible && !root.iconLabel
|
|
102
|
+
anchors.centerIn: parent
|
|
103
|
+
// Centering the line box puts the figures above the bar's middle, since
|
|
104
|
+
// the box keeps room for descenders. Center the figure height instead, so
|
|
105
|
+
// labels line up with the icons beside them.
|
|
106
|
+
anchors.verticalCenterOffset: !root.centerFigures || root.vertical || root.text.indexOf("\n") !== -1
|
|
107
|
+
? 0
|
|
108
|
+
: (labelMetrics.descent - labelMetrics.ascent + labelMetrics.tightBoundingRect("0").height) / 2
|
|
109
|
+
text: root.text
|
|
110
|
+
color: root.active && root.useActiveColor ? root.activeColor : root.foreground
|
|
111
|
+
font.family: root.fontFamily
|
|
112
|
+
font.pixelSize: root.fontSize
|
|
113
|
+
renderType: Text.NativeRendering
|
|
114
|
+
rotation: root.textRotation
|
|
115
|
+
horizontalAlignment: Text.AlignHCenter
|
|
116
|
+
verticalAlignment: Text.AlignVCenter
|
|
117
|
+
|
|
118
|
+
Behavior on color {
|
|
119
|
+
enabled: !root.bar || root.bar.foregroundAnimationEnabled
|
|
120
|
+
ColorAnimation { duration: Style.duration(160) }
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
FontMetrics {
|
|
125
|
+
id: labelMetrics
|
|
126
|
+
font: label.font
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
Loader {
|
|
130
|
+
id: iconLoader
|
|
131
|
+
active: root.iconLabel
|
|
132
|
+
width: Style.bar.iconCanvas
|
|
133
|
+
height: Style.bar.iconCanvas
|
|
134
|
+
x: (root.width - width) / 2
|
|
135
|
+
y: (root.height - height) / 2
|
|
136
|
+
sourceComponent: Component {
|
|
137
|
+
OpticalGlyph {
|
|
138
|
+
text: root.text
|
|
139
|
+
fontFamily: root.fontFamily
|
|
140
|
+
fontSize: root.fontSize
|
|
141
|
+
paintedSize: Style.bar.iconSize
|
|
142
|
+
color: root.active && root.useActiveColor ? root.activeColor : root.foreground
|
|
143
|
+
rotation: root.textRotation
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
MouseArea {
|
|
149
|
+
id: mouseArea
|
|
150
|
+
anchors.fill: parent
|
|
151
|
+
acceptedButtons: Qt.LeftButton | Qt.RightButton | Qt.MiddleButton
|
|
152
|
+
enabled: root.interactive
|
|
153
|
+
hoverEnabled: true
|
|
154
|
+
cursorShape: root.pressable ? Qt.PointingHandCursor : Qt.ArrowCursor
|
|
155
|
+
onEntered: {
|
|
156
|
+
if (root.bar) {
|
|
157
|
+
root.bar.showTooltip(root, root.tooltipText)
|
|
158
|
+
}
|
|
159
|
+
if (root.maintainIndicatorReveal && root.revealHost && root.revealHost.setIndicatorItemHovered)
|
|
160
|
+
root.revealHost.setIndicatorItemHovered(true)
|
|
161
|
+
}
|
|
162
|
+
onExited: {
|
|
163
|
+
if (root.bar) {
|
|
164
|
+
root.bar.hideTooltip(root)
|
|
165
|
+
}
|
|
166
|
+
if (root.maintainIndicatorReveal && root.revealHost && root.revealHost.setIndicatorItemHovered)
|
|
167
|
+
root.revealHost.setIndicatorItemHovered(false)
|
|
168
|
+
}
|
|
169
|
+
onClicked: function(mouse) { if (root.pressable) root.triggerPress(mouse.button) }
|
|
170
|
+
onWheel: function(wheel) { root.wheelMoved(wheel.angleDelta.y) }
|
|
171
|
+
}
|
|
172
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
module qs.Ui
|
|
2
|
+
|
|
3
|
+
BarIndicator 1.0 BarIndicator.qml
|
|
4
|
+
BarIconButton 1.0 BarIconButton.qml
|
|
5
|
+
BarIconContent 1.0 BarIconContent.qml
|
|
6
|
+
BarWidget 1.0 BarWidget.qml
|
|
7
|
+
BackgroundMedia 1.0 BackgroundMedia.qml
|
|
8
|
+
BorderOverlay 1.0 BorderOverlay.qml
|
|
9
|
+
BorderSurface 1.0 BorderSurface.qml
|
|
10
|
+
Button 1.0 Button.qml
|
|
11
|
+
ButtonGroup 1.0 ButtonGroup.qml
|
|
12
|
+
ConfirmDialog 1.0 ConfirmDialog.qml
|
|
13
|
+
CursorSurface 1.0 CursorSurface.qml
|
|
14
|
+
Dropdown 1.0 Dropdown.qml
|
|
15
|
+
FilterInput 1.0 FilterInput.qml
|
|
16
|
+
IconContentBounds 1.0 IconContentBounds.qml
|
|
17
|
+
KeyboardPanel 1.0 KeyboardPanel.qml
|
|
18
|
+
MultiSelect 1.0 MultiSelect.qml
|
|
19
|
+
NumberField 1.0 NumberField.qml
|
|
20
|
+
OpticalGlyph 1.0 OpticalGlyph.qml
|
|
21
|
+
OverlayWindow 1.0 OverlayWindow.qml
|
|
22
|
+
Panel 1.0 Panel.qml
|
|
23
|
+
PanelActionButton 1.0 PanelActionButton.qml
|
|
24
|
+
PanelController 1.0 PanelController.qml
|
|
25
|
+
PanelKeyCatcher 1.0 PanelKeyCatcher.qml
|
|
26
|
+
PanelHero 1.0 PanelHero.qml
|
|
27
|
+
PanelSectionHeader 1.0 PanelSectionHeader.qml
|
|
28
|
+
PanelSeparator 1.0 PanelSeparator.qml
|
|
29
|
+
PanelSlider 1.0 PanelSlider.qml
|
|
30
|
+
PanelToolTip 1.0 PanelToolTip.qml
|
|
31
|
+
PluginBarApi 1.0 PluginBarApi.qml
|
|
32
|
+
PointerMoveGate 1.0 PointerMoveGate.qml
|
|
33
|
+
ScreenMoveRemap 1.0 ScreenMoveRemap.qml
|
|
34
|
+
PopupCard 1.0 PopupCard.qml
|
|
35
|
+
SearchableDropdown 1.0 SearchableDropdown.qml
|
|
36
|
+
SizedImage 1.0 SizedImage.qml
|
|
37
|
+
SpeedTestOverlay 1.0 SpeedTestOverlay.qml
|
|
38
|
+
TextField 1.0 TextField.qml
|
|
39
|
+
Toggle 1.0 Toggle.qml
|
|
40
|
+
ToggleSwitch 1.0 ToggleSwitch.qml
|
|
41
|
+
WidgetButton 1.0 WidgetButton.qml
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import QtQml
|
|
2
|
+
import Quickshell
|
|
3
|
+
import Quickshell.Io
|
|
4
|
+
|
|
5
|
+
// Only a validated tab's matching lift acknowledgment closes its source.
|
|
6
|
+
QtObject {
|
|
7
|
+
id: root
|
|
8
|
+
|
|
9
|
+
property var tabBar: null
|
|
10
|
+
property var view: null
|
|
11
|
+
property var panes: []
|
|
12
|
+
property var tabs: null
|
|
13
|
+
// Stage trace, on only with FLEA_TRACE_TABDRAG=1; read once, silent otherwise.
|
|
14
|
+
readonly property bool tabTrace: Quickshell.env("FLEA_TRACE_TABDRAG") === "1"
|
|
15
|
+
function traceTab(stage, detail) { if (root.tabTrace) console.log("TABDRAG " + stage + " pid=" + Quickshell.processId + " " + detail) }
|
|
16
|
+
|
|
17
|
+
property IpcHandler ack: IpcHandler {
|
|
18
|
+
target: "fleatab"
|
|
19
|
+
function taken(token: string): bool { return root.take(token) }
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
function take(token) {
|
|
23
|
+
root.traceTab("taken-call", "token=" + String(token) + " outToken=" + String(root.tabBar ? root.tabBar.outToken : "") + " outActive=" + String(root.tabBar ? root.tabBar.outActive : ""))
|
|
24
|
+
if (!root.tabBar || !root.tabs) return false
|
|
25
|
+
var lift = root.tabs.liftFor(root.tabBar.outstandingLifts, token)
|
|
26
|
+
if (!lift || !root.tabs.ackCloses(lift.token, token, lift.liftedAt, Date.now())) return false
|
|
27
|
+
if (root.tabs.resolveMovedTab(lift.pane, lift.identity) < 0) return false
|
|
28
|
+
lift.taken = true
|
|
29
|
+
root.tabBar.drainLifts()
|
|
30
|
+
root.traceTab("taken-recv", "token=" + String(token) + " result=accepted")
|
|
31
|
+
return true
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
property string launchPid: Quickshell.env("FLEA_TAB_SOURCE_PID") || ""
|
|
35
|
+
property string launchToken: Quickshell.env("FLEA_TAB_TOKEN") || ""
|
|
36
|
+
property string launchPath: Quickshell.env("FLEA_PATH") || ""
|
|
37
|
+
function openedLaunch(path) {
|
|
38
|
+
if (path !== root.launchPath || !/^[0-9]+$/.test(root.launchPid) || !root.launchToken || !root.tabBar) return
|
|
39
|
+
root.tabBar.sendTaken(root.launchPid, root.launchToken)
|
|
40
|
+
root.launchToken = ""
|
|
41
|
+
}
|
|
42
|
+
property Connections primaryAck: Connections {
|
|
43
|
+
target: root.panes.length > 0 ? root.panes[0] : null
|
|
44
|
+
function onOpened(path) { root.openedLaunch(path) }
|
|
45
|
+
}
|
|
46
|
+
property Connections secondaryAck: Connections {
|
|
47
|
+
target: root.panes.length > 1 ? root.panes[1] : null
|
|
48
|
+
function onOpened(path) { root.openedLaunch(path) }
|
|
49
|
+
}
|
|
50
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
// Its own app id, so one Hyprland rule can give the chooser the floating treatment Omarchy already
|
|
2
|
+
// gives xdg-desktop-portal-gtk without touching the window; flea --picker writes that rule.
|
|
3
|
+
//@ pragma AppId com.thisisgm.flea.picker
|
|
4
|
+
//@ pragma ShellId fleapicker
|
|
5
|
+
//@ pragma NativeTextRendering
|
|
6
|
+
//@ pragma CacheDir $BASE/flea
|
|
7
|
+
|
|
8
|
+
import Quickshell
|
|
9
|
+
import QtQuick
|
|
10
|
+
|
|
11
|
+
// A file: URL away for the reason ui/boot/shell.qml gives, but its window stays whole: the chooser
|
|
12
|
+
// is not on the measured path and its size comes from the Theme. See AGENTS.md "The first window".
|
|
13
|
+
ShellRoot {
|
|
14
|
+
id: root
|
|
15
|
+
|
|
16
|
+
LazyLoader {
|
|
17
|
+
id: chooser
|
|
18
|
+
active: true
|
|
19
|
+
// This directory cannot import ui/js/Format.js through qs:, so the one call is written out.
|
|
20
|
+
source: "file://" + encodeURI(Quickshell.shellDir + "/../PickerWindow.qml").replace(/#/g, "%23").replace(/\?/g, "%3F")
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
// Well past the 1.7 to 3.0 s the first launch after an update spends writing Qt's cache.
|
|
24
|
+
readonly property int windowBackstopMs: 6000
|
|
25
|
+
|
|
26
|
+
// LazyLoader carries neither a status nor a usable loading edge, so no window by this point is
|
|
27
|
+
// a load that failed, and silence would leave tools/flea-portal's caller waiting out its 600 s.
|
|
28
|
+
Timer {
|
|
29
|
+
interval: root.windowBackstopMs
|
|
30
|
+
repeat: false
|
|
31
|
+
running: true
|
|
32
|
+
onTriggered: {
|
|
33
|
+
if (!chooser.item) {
|
|
34
|
+
console.warn("flea: the chooser window did not load, so there is nothing to show")
|
|
35
|
+
Quickshell.execDetached(["kill", String(Quickshell.processId)])
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
//@ pragma AppId com.thisisgm.flea
|
|
2
|
+
//@ pragma ShellId flea
|
|
3
|
+
//@ pragma NativeTextRendering
|
|
4
|
+
//@ pragma CacheDir $BASE/flea
|
|
5
|
+
|
|
6
|
+
import Quickshell
|
|
7
|
+
import QtQuick
|
|
8
|
+
|
|
9
|
+
// The entry is the window and imports Quickshell and QtQuick only, because a Quickshell config is
|
|
10
|
+
// served through qs: URLs, which Qt's disk cache refuses; see AGENTS.md "The first window".
|
|
11
|
+
ShellRoot {
|
|
12
|
+
FloatingWindow {
|
|
13
|
+
id: fleaWindow
|
|
14
|
+
title: "Flea"
|
|
15
|
+
implicitWidth: 900
|
|
16
|
+
implicitHeight: 600
|
|
17
|
+
// Never seen: the body covers it on the first frame. ui/Theme.qml's own fallback, for the record.
|
|
18
|
+
color: "#101315"
|
|
19
|
+
property bool rendererFallbackStarted: false
|
|
20
|
+
// True when a glass launch cleared the colour before the window was shown, which tests/glass-boot.sh reads.
|
|
21
|
+
property bool clearedEarly: false
|
|
22
|
+
|
|
23
|
+
// Every *Centre reader on the IPC seam is this: an item's painted box, reduced to the point a test clicks.
|
|
24
|
+
function centreOf(item) {
|
|
25
|
+
if (!item)
|
|
26
|
+
return ""
|
|
27
|
+
var rect = fleaWindow.itemRect(item)
|
|
28
|
+
return Math.round(rect.x + rect.width / 2) + " " + Math.round(rect.y + rect.height / 2)
|
|
29
|
+
}
|
|
30
|
+
// "x y width height" in window pixels, for a test that asserts a card stays inside the window.
|
|
31
|
+
function rectOf(item) {
|
|
32
|
+
if (!item)
|
|
33
|
+
return ""
|
|
34
|
+
var rect = fleaWindow.itemRect(item)
|
|
35
|
+
var left = Math.round(rect.x), top = Math.round(rect.y)
|
|
36
|
+
return left + " " + top + " " + (Math.round(rect.x + rect.width) - left) + " " + (Math.round(rect.y + rect.height) - top)
|
|
37
|
+
}
|
|
38
|
+
// centreOf's sibling, "x width centre": the edges round because a click needs a whole pixel, the centre keeps three decimals because the misalignment it reads is half of one.
|
|
39
|
+
function boxOf(item) {
|
|
40
|
+
if (!item)
|
|
41
|
+
return ""
|
|
42
|
+
var rect = fleaWindow.itemRect(item)
|
|
43
|
+
return Math.round(rect.x) + " " + Math.round(rect.width) + " " + (rect.x + rect.width / 2).toFixed(3)
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// This directory cannot reach ui/js/Format.js through qs:, so its one call is written out.
|
|
47
|
+
function fileUrl(path) {
|
|
48
|
+
path = String(path)
|
|
49
|
+
// Only Windows paths use backslashes as separators; POSIX filenames may contain them.
|
|
50
|
+
var drive = /^[A-Za-z]:[\\/]/.test(path)
|
|
51
|
+
var unc = /^\\\\[^\\]/.test(path)
|
|
52
|
+
if (drive || unc) path = path.replace(/\\/g, "/")
|
|
53
|
+
var parts = path.split("/")
|
|
54
|
+
for (var i = 0; i < parts.length; i++) {
|
|
55
|
+
if (!(drive && i === 0)) parts[i] = encodeURIComponent(parts[i])
|
|
56
|
+
}
|
|
57
|
+
return (drive ? "file:///" : path.indexOf("//") === 0 ? "file:" : "file://") + parts.join("/")
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// Before the first frame, so the window maps holding its chrome; see AGENTS.md "The first window".
|
|
61
|
+
function loadBody() {
|
|
62
|
+
if (bodyLoader.status !== Loader.Null)
|
|
63
|
+
return
|
|
64
|
+
bodyLoader.setSource(fleaWindow.fileUrl(Quickshell.shellDir + "/../WindowBody.qml"), { host: fleaWindow })
|
|
65
|
+
// Only before the window exists does Quickshell still take a clear surface; see ui/Glass.qml.
|
|
66
|
+
if (bodyLoader.item && bodyLoader.item.clearSurface) {
|
|
67
|
+
fleaWindow.clearedEarly = !(bodyLoader.Window.window && bodyLoader.Window.window.visible)
|
|
68
|
+
if (fleaWindow.clearedEarly) fleaWindow.color = "transparent"
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// Quickshell 0.3.1 has no exit API, and it is signalled from here because a window closed
|
|
73
|
+
// before the body loads still has to take the process with it.
|
|
74
|
+
Connections { target: Quickshell; function onLastWindowClosed() { fleaWindow.quit() } }
|
|
75
|
+
|
|
76
|
+
// Nothing has been told to drain before the body exists, so an early exit kills directly.
|
|
77
|
+
function quit() {
|
|
78
|
+
if (bodyLoader.item)
|
|
79
|
+
bodyLoader.item.quitBackends()
|
|
80
|
+
else
|
|
81
|
+
Quickshell.execDetached(["kill", String(Quickshell.processId)])
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// sceneGraphError arrives on the first frame, and the entry always exists, so the retry is here.
|
|
85
|
+
function handleSceneGraphError(error, message) {
|
|
86
|
+
var backendName = Quickshell.env("QSG_RHI_BACKEND")
|
|
87
|
+
console.warn("graphics backend " + backendName + " failed (" + error + "): " + message)
|
|
88
|
+
var retry = retryCommand(backendName)
|
|
89
|
+
if (retry && !rendererFallbackStarted) {
|
|
90
|
+
rendererFallbackStarted = true
|
|
91
|
+
Quickshell.execDetached(retry)
|
|
92
|
+
}
|
|
93
|
+
quit()
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
// Loaded only once the error has arrived, which keeps ui/js/Renderer.js off the startup path.
|
|
97
|
+
function retryCommand(backendName) {
|
|
98
|
+
var helper = Qt.createComponent(fleaWindow.fileUrl(Quickshell.shellDir + "/../RendererRetry.qml"))
|
|
99
|
+
if (helper.status !== Component.Ready) {
|
|
100
|
+
console.warn("flea: the renderer retry helper did not load, so there is no fallback: " + helper.errorString())
|
|
101
|
+
return null
|
|
102
|
+
}
|
|
103
|
+
var object = helper.createObject(fleaWindow)
|
|
104
|
+
var retry = object.fallbackCommand(backendName)
|
|
105
|
+
object.destroy()
|
|
106
|
+
return retry
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
Loader {
|
|
110
|
+
id: bodyLoader
|
|
111
|
+
anchors.fill: parent
|
|
112
|
+
// A Loader is a focus scope, so without this every key press lands nowhere.
|
|
113
|
+
focus: true
|
|
114
|
+
// An empty window forever is what this catches; the engine prints the reason above it.
|
|
115
|
+
onStatusChanged: {
|
|
116
|
+
if (status === Loader.Error) {
|
|
117
|
+
console.warn("flea: the window body did not load, so there is nothing to show")
|
|
118
|
+
fleaWindow.quit()
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
// Null while this file loads and the QQuickWindow once it exists, which is before the scene graph starts.
|
|
124
|
+
Connections {
|
|
125
|
+
target: bodyLoader.Window.window
|
|
126
|
+
function onSceneGraphError(error, message) { fleaWindow.handleSceneGraphError(error, message) }
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
Component.onCompleted: fleaWindow.loadBody()
|
|
130
|
+
}
|
|
131
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import QtQuick
|
|
2
|
+
import Quickshell
|
|
3
|
+
import Quickshell.Wayland
|
|
4
|
+
|
|
5
|
+
// The tear-off catcher: one transparent Bottom-layer panel per screen, alive only while the source
|
|
6
|
+
// tab drag is out; the Loader that owns it unloads it on every end path.
|
|
7
|
+
Item {
|
|
8
|
+
id: root
|
|
9
|
+
|
|
10
|
+
// Loader assigns this after creation, so required can never hold here.
|
|
11
|
+
property var tabBar: null
|
|
12
|
+
// The boot directory cannot reach ui/js through qs:, so the strip hands the tab MIME in.
|
|
13
|
+
property string tabMime: ""
|
|
14
|
+
|
|
15
|
+
Variants {
|
|
16
|
+
model: Quickshell.screens
|
|
17
|
+
PanelWindow {
|
|
18
|
+
required property var modelData
|
|
19
|
+
screen: modelData
|
|
20
|
+
color: "transparent"
|
|
21
|
+
anchors {
|
|
22
|
+
top: true
|
|
23
|
+
bottom: true
|
|
24
|
+
left: true
|
|
25
|
+
right: true
|
|
26
|
+
}
|
|
27
|
+
WlrLayershell.namespace: "flea-tab-tearoff"
|
|
28
|
+
WlrLayershell.layer: WlrLayer.Bottom
|
|
29
|
+
// Ignore reserved bars so catcher-local origin is exactly the screen origin.
|
|
30
|
+
exclusionMode: ExclusionMode.Ignore
|
|
31
|
+
// Hyprland focuses an interactive layer on map and releases held buttons,
|
|
32
|
+
// stealing drag focus from the target window. Escape stays with Qt's source.
|
|
33
|
+
WlrLayershell.keyboardFocus: WlrKeyboardFocus.None
|
|
34
|
+
DropArea {
|
|
35
|
+
anchors.fill: parent
|
|
36
|
+
keys: [root.tabMime]
|
|
37
|
+
onEntered: function (drag) {
|
|
38
|
+
if (root.tabBar !== null)
|
|
39
|
+
root.tabBar.traceTab("catcher-enter", "global=" + (modelData.x + drag.x) + "," + (modelData.y + drag.y))
|
|
40
|
+
}
|
|
41
|
+
onDropped: function (drop) {
|
|
42
|
+
// The full-screen catcher starts at the screen's compositor position.
|
|
43
|
+
if (root.tabBar !== null && drop.getDataAsString(root.tabMime) !== "") {
|
|
44
|
+
drop.accept(Qt.MoveAction)
|
|
45
|
+
root.tabBar.catcherDrop(modelData.x + drop.x, modelData.y + drop.y)
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|