flea-qml 0.0.0-stage → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +22 -0
- package/README.md +478 -2
- package/THIRD-PARTY-NOTICES.md +29 -0
- package/demos/App.java +5 -0
- package/demos/Dockerfile +4 -0
- package/demos/Main.kt +3 -0
- package/demos/Program.cs +1 -0
- package/demos/README.md +12 -0
- package/demos/app.dart +3 -0
- package/demos/app.deb +0 -0
- package/demos/app.js +1 -0
- package/demos/backup.tar +0 -0
- package/demos/budget.xlsx +0 -0
- package/demos/build.sh +2 -0
- package/demos/bundle.zip +0 -0
- package/demos/clip.mp4 +0 -0
- package/demos/data.sqlite +0 -0
- package/demos/disk.iso +0 -0
- package/demos/engine.cpp +5 -0
- package/demos/firmware.bin +0 -0
- package/demos/flake.nix +4 -0
- package/demos/folder/inside.txt +1 -0
- package/demos/font.ttf +0 -0
- package/demos/index.html +5 -0
- package/demos/index.php +2 -0
- package/demos/init.lua +1 -0
- package/demos/letter.docx +0 -0
- package/demos/lib.rs +3 -0
- package/demos/main.c +6 -0
- package/demos/main.h +3 -0
- package/demos/math-and-diagrams.md +200 -0
- package/demos/notes.tar.gz +0 -0
- package/demos/notes.txt +3 -0
- package/demos/photo.png +0 -0
- package/demos/program +2 -0
- package/demos/report.pdf +32 -0
- package/demos/script.py +1 -0
- package/demos/server.go +7 -0
- package/demos/settings.json +4 -0
- package/demos/slides.pptx +0 -0
- package/demos/song.mp3 +0 -0
- package/demos/style.css +4 -0
- package/demos/tool.rb +1 -0
- package/demos/types.ts +2 -0
- package/docs/pele.md +23 -0
- package/docs/protocol.md +3420 -0
- package/docs/temml.md +63 -0
- package/index.js +107 -0
- package/package.json +34 -4
- package/src/archive.js +402 -0
- package/src/archiveops.js +697 -0
- package/src/backend.js +369 -0
- package/src/bulkrename.js +95 -0
- package/src/clip-host.js +76 -0
- package/src/clip.js +462 -0
- package/src/code.js +168 -0
- package/src/compare.js +74 -0
- package/src/create.js +128 -0
- package/src/dirsize.js +147 -0
- package/src/figure-svg.js +530 -0
- package/src/figure-thread.js +23 -0
- package/src/figure.js +132 -0
- package/src/find.js +55 -0
- package/src/flea.js +39 -0
- package/src/fsinfo.js +39 -0
- package/src/highlight.js +141 -0
- package/src/html.js +52 -0
- package/src/kinds.js +89 -0
- package/src/listing.js +130 -0
- package/src/markdown-html.js +317 -0
- package/src/mathml.js +186 -0
- package/src/menu.js +180 -0
- package/src/meta.js +129 -0
- package/src/office.js +810 -0
- package/src/order.js +100 -0
- package/src/peek.js +49 -0
- package/src/pele-wrapper.js +695 -0
- package/src/permissions.js +180 -0
- package/src/places.js +313 -0
- package/src/preview-language.js +10 -0
- package/src/transfer.js +669 -0
- package/src/trash-record.js +41 -0
- package/src/trash.js +210 -0
- package/src/trashbrowse.js +326 -0
- package/src/uistate.js +393 -0
- package/src/uistore.js +168 -0
- package/src/vendor/LICENSES/Apache-2.0.txt +202 -0
- package/src/vendor/LICENSES/MIT-katex-2015.txt +27 -0
- package/src/vendor/LICENSES/MIT-katex.txt +21 -0
- package/src/vendor/LICENSES/MIT-mermaid.txt +21 -0
- package/src/vendor/LICENSES/MIT-pele.txt +40 -0
- package/src/vendor/LICENSES/MIT-perseus.txt +18 -0
- package/src/vendor/LICENSES/MIT-temml.txt +21 -0
- package/src/vendor/pele.js +145 -0
- package/src/vendor/temml.mjs +14708 -0
- package/src/watch.js +98 -0
- package/src/wayland/client.js +109 -0
- package/src/wayland/protocol.js +55 -0
- package/src/wayland/protocols/ext-data-control-v1.xml +276 -0
- package/src/wayland/protocols/wayland.xml +3248 -0
- package/src/wayland/protocols/wlr-data-control-unstable-v1.xml +278 -0
- package/src/wayland/resource-io.js +6 -0
- package/src/wayland/socket-discovery.js +26 -0
- package/src/wayland/transport-posix.js +120 -0
- package/src/wayland/transport-win32.js +11 -0
- package/src/wayland/transport.js +3 -0
- package/src/wayland/win32-resources.js +80 -0
- package/src/wayland/win32-wire.js +62 -0
- package/test/archive.test.js +80 -0
- package/test/bench-markdown-scroll.mjs +190 -0
- package/test/clip-host.test.js +113 -0
- package/test/code-preview.test.js +35 -0
- package/test/compare-ui-paths.test.js +24 -0
- package/test/compare.test.js +54 -0
- package/test/delete-trash.test.js +67 -0
- package/test/dirsize.test.js +138 -0
- package/test/file-ops.test.js +241 -0
- package/test/find-contents.test.js +161 -0
- package/test/find-input.test.js +66 -0
- package/test/fixtures/pele-parity.json +1006 -0
- package/test/highlight-launcher.test.js +35 -0
- package/test/html-preview.test.js +22 -0
- package/test/input.test.js +15 -0
- package/test/keymap.test.js +26 -0
- package/test/language-icons.test.js +36 -0
- package/test/launcher.test.js +51 -0
- package/test/manual-code-scroll.mjs +28 -0
- package/test/manual-column-scroll.mjs +24 -0
- package/test/manual-compare-ui.mjs +20 -0
- package/test/manual-find-status.mjs +37 -0
- package/test/manual-html-security.mjs +23 -0
- package/test/manual-html-ui.mjs +30 -0
- package/test/manual-syntax-preview.mjs +26 -0
- package/test/manual-trash-ui.mjs +86 -0
- package/test/markdown-diagrams.test.js +93 -0
- package/test/markdown-html.test.js +105 -0
- package/test/mathml.test.js +92 -0
- package/test/menu-transfer.test.js +57 -0
- package/test/office-preview.test.js +154 -0
- package/test/pele-parity.test.js +28 -0
- package/test/places.test.js +134 -0
- package/test/preview-keys.test.js +60 -0
- package/test/preview-language.test.js +22 -0
- package/test/status-filename.test.js +20 -0
- package/test/transfer-replace-merge.test.js +187 -0
- package/test/trash-address.test.js +23 -0
- package/test/trash-view.test.js +37 -0
- package/test/trashbrowse.test.js +135 -0
- package/ui/AboutFacts.qml +78 -0
- package/ui/ArchiveCards.qml +68 -0
- package/ui/ArchiveCompressDialog.qml +378 -0
- package/ui/ArchivePasswordDialog.qml +257 -0
- package/ui/Backend.qml +771 -0
- package/ui/BulkOldNames.qml +47 -0
- package/ui/BulkRenameDialog.qml +380 -0
- package/ui/CardFrame.qml +67 -0
- package/ui/CardScroll.qml +79 -0
- package/ui/CheckBox.qml +73 -0
- package/ui/ChromeBar.qml +360 -0
- package/ui/ChromeButton.qml +131 -0
- package/ui/ChromeModes.qml +43 -0
- package/ui/CodeLines.qml +256 -0
- package/ui/CodeRefusal.qml +52 -0
- package/ui/CollideConfirm.qml +147 -0
- package/ui/CollideHost.qml +167 -0
- package/ui/ColumnPane.qml +523 -0
- package/ui/ColumnRow.qml +380 -0
- package/ui/ColumnsArea.qml +594 -0
- package/ui/ColumnsLanding.qml +147 -0
- package/ui/CompareView.qml +321 -0
- package/ui/ContextMenu.qml +743 -0
- package/ui/ConvertDialog.qml +456 -0
- package/ui/CountedWorker.qml +7 -0
- package/ui/Crumb.qml +64 -0
- package/ui/CrumbDrop.qml +25 -0
- package/ui/CsvTable.qml +394 -0
- package/ui/CursorMark.qml +41 -0
- package/ui/DefaultClaim.qml +130 -0
- package/ui/DeviceLock.qml +47 -0
- package/ui/DeviceMounts.qml +540 -0
- package/ui/DialogButton.qml +150 -0
- package/ui/DialogField.qml +147 -0
- package/ui/DialogHeader.qml +31 -0
- package/ui/DialogScrim.qml +20 -0
- package/ui/DialogTitle.qml +37 -0
- package/ui/Divider.qml +9 -0
- package/ui/DropInto.qml +126 -0
- package/ui/DropTarget.qml +35 -0
- package/ui/DropboxMark.qml +60 -0
- package/ui/EmptyState.qml +150 -0
- package/ui/EscapeHint.qml +11 -0
- package/ui/FactsTable.qml +54 -0
- package/ui/FastScrollHandler.qml +476 -0
- package/ui/FatNamesConfirm.qml +157 -0
- package/ui/Favourites.qml +143 -0
- package/ui/FigureService.qml +120 -0
- package/ui/FileDrag.qml +267 -0
- package/ui/FilterStrip.qml +133 -0
- package/ui/FitMetrics.qml +22 -0
- package/ui/FlashDriveRows.qml +137 -0
- package/ui/FlashHost.qml +72 -0
- package/ui/FlashImageRow.qml +104 -0
- package/ui/FlashRunner.qml +119 -0
- package/ui/FlashStepRow.qml +172 -0
- package/ui/FlashStrip.qml +38 -0
- package/ui/FlashView.qml +397 -0
- package/ui/FleaMark.qml +88 -0
- package/ui/FlyoutFade.qml +23 -0
- package/ui/FontPane.qml +170 -0
- package/ui/Glass.qml +114 -0
- package/ui/GlassTagger.qml +59 -0
- package/ui/Glyph.qml +64 -0
- package/ui/GlyphSolid.qml +22 -0
- package/ui/GridArea.qml +664 -0
- package/ui/GridTile.qml +325 -0
- package/ui/GvfsBridge.qml +164 -0
- package/ui/Header.qml +433 -0
- package/ui/HoverTimers.qml +39 -0
- package/ui/HtmlClip.qml +30 -0
- package/ui/HtmlPane.qml +63 -0
- package/ui/HyprlandMark.qml +45 -0
- package/ui/Ipc.qml +1005 -0
- package/ui/IpcControls.qml +7 -0
- package/ui/IpcMenuState.qml +48 -0
- package/ui/IpcPreviewState.qml +185 -0
- package/ui/JumpPath.qml +51 -0
- package/ui/KeymapSheet.qml +561 -0
- package/ui/KeymapSheetResult.qml +89 -0
- package/ui/KindStack.qml +40 -0
- package/ui/LangMark.qml +51 -0
- package/ui/LangMarkLoader.qml +26 -0
- package/ui/List.qml +480 -0
- package/ui/LoadingState.qml +54 -0
- package/ui/LocalSend.qml +56 -0
- package/ui/LocalSendMark.qml +73 -0
- package/ui/MarkdownBlockView.qml +311 -0
- package/ui/MarkdownBlocks.qml +35 -0
- package/ui/MarkdownFigure.qml +254 -0
- package/ui/MarkdownImages.qml +72 -0
- package/ui/MarkdownList.qml +81 -0
- package/ui/MarkdownMathsText.qml +97 -0
- package/ui/MarkdownPane.qml +83 -0
- package/ui/MarkdownPictures.qml +41 -0
- package/ui/MarkdownQuote.qml +52 -0
- package/ui/MarkdownRemote.qml +82 -0
- package/ui/MarkdownSource.qml +155 -0
- package/ui/MarkdownTable.qml +222 -0
- package/ui/MarkdownTableScroll.qml +64 -0
- package/ui/MarkdownTableWheel.qml +126 -0
- package/ui/MarkdownText.qml +87 -0
- package/ui/MarkdownWorker.js +132 -0
- package/ui/MatchText.qml +99 -0
- package/ui/MediaSession.qml +38 -0
- package/ui/MediaSound.qml +26 -0
- package/ui/MediaStrip.qml +191 -0
- package/ui/MediaTrack.qml +36 -0
- package/ui/MediaVolume.qml +54 -0
- package/ui/MenuActionDialog.qml +396 -0
- package/ui/MenuEdgeFade.qml +24 -0
- package/ui/MenuHost.qml +227 -0
- package/ui/MenuRow.qml +351 -0
- package/ui/MountListing.qml +100 -0
- package/ui/NetworkDialog.qml +435 -0
- package/ui/NetworkForm.qml +426 -0
- package/ui/NetworkMounts.qml +913 -0
- package/ui/NetworkPlaces.qml +127 -0
- package/ui/OpenWithDialog.qml +613 -0
- package/ui/Opener.qml +115 -0
- package/ui/Pane.qml +1296 -0
- package/ui/PaneMenuActions.qml +527 -0
- package/ui/PanePath.qml +90 -0
- package/ui/PaneRail.qml +239 -0
- package/ui/PaneStates.qml +88 -0
- package/ui/PaneSwap.qml +339 -0
- package/ui/PaneWire.qml +605 -0
- package/ui/ParkedWait.qml +9 -0
- package/ui/PathEntry.qml +186 -0
- package/ui/PathJump.qml +400 -0
- package/ui/PdfViewer.qml +297 -0
- package/ui/PermissionsDialog.qml +658 -0
- package/ui/PermissionsHeadings.qml +31 -0
- package/ui/PhoneMounts.qml +67 -0
- package/ui/PickerAnswers.qml +75 -0
- package/ui/PickerBox.qml +26 -0
- package/ui/PickerChrome.qml +295 -0
- package/ui/PickerFilter.qml +97 -0
- package/ui/PickerGrid.qml +308 -0
- package/ui/PickerHeader.qml +28 -0
- package/ui/PickerLifecycle.qml +27 -0
- package/ui/PickerList.qml +218 -0
- package/ui/PickerListing.qml +149 -0
- package/ui/PickerPathBar.qml +127 -0
- package/ui/PickerPlaces.qml +189 -0
- package/ui/PickerRecent.qml +92 -0
- package/ui/PickerSave.qml +101 -0
- package/ui/PickerSelection.qml +155 -0
- package/ui/PickerWindow.qml +846 -0
- package/ui/PowerSectorsReader.qml +10 -0
- package/ui/PrebuildDriver.qml +146 -0
- package/ui/Preview.qml +1004 -0
- package/ui/PreviewAnimation.qml +24 -0
- package/ui/PreviewArchive.qml +66 -0
- package/ui/PreviewColumn.qml +551 -0
- package/ui/PreviewEdge.qml +63 -0
- package/ui/PreviewFacts.qml +30 -0
- package/ui/PreviewFactsLine.qml +34 -0
- package/ui/PreviewHtml.qml +233 -0
- package/ui/PreviewImage.qml +253 -0
- package/ui/PreviewImagePan.qml +13 -0
- package/ui/PreviewImageSharp.qml +32 -0
- package/ui/PreviewLines.qml +106 -0
- package/ui/PreviewMarkdown.qml +706 -0
- package/ui/PreviewMedia.qml +250 -0
- package/ui/PreviewPdf.qml +482 -0
- package/ui/PreviewScroll.qml +201 -0
- package/ui/PreviewSwap.qml +335 -0
- package/ui/PreviewText.qml +149 -0
- package/ui/ProtocolChip.qml +18 -0
- package/ui/QuickLookArchive.qml +38 -0
- package/ui/QuickLookBar.qml +103 -0
- package/ui/QuickLookPrepare.qml +355 -0
- package/ui/QuickLookSwap.qml +10 -0
- package/ui/QuickLookWarm.qml +65 -0
- package/ui/RailDrop.qml +155 -0
- package/ui/RailHeading.qml +19 -0
- package/ui/RailPlaces.qml +38 -0
- package/ui/RailTrashRow.qml +67 -0
- package/ui/RenameField.qml +353 -0
- package/ui/RendererRetry.qml +11 -0
- package/ui/ResizeHandle.qml +52 -0
- package/ui/Reveal.qml +54 -0
- package/ui/Row.qml +476 -0
- package/ui/RowDrag.qml +213 -0
- package/ui/RowDropTarget.qml +27 -0
- package/ui/RunCard.qml +286 -0
- package/ui/Scripts.qml +65 -0
- package/ui/SearchStrip.qml +232 -0
- package/ui/SelectionBand.qml +140 -0
- package/ui/SelectionPreview.qml +370 -0
- package/ui/SettingsFavourite.qml +122 -0
- package/ui/SettingsGroup.qml +96 -0
- package/ui/SettingsHint.qml +12 -0
- package/ui/SettingsMetrics.qml +29 -0
- package/ui/SettingsPane.qml +178 -0
- package/ui/SettingsPanel.qml +547 -0
- package/ui/SettingsRail.qml +128 -0
- package/ui/SettingsRow.qml +409 -0
- package/ui/SettingsRuler.qml +85 -0
- package/ui/SettingsSegment.qml +85 -0
- package/ui/ShareBrowser.qml +113 -0
- package/ui/ShareLink.qml +67 -0
- package/ui/ShelfPins.qml +101 -0
- package/ui/Sidebar.qml +732 -0
- package/ui/SidebarRow.qml +358 -0
- package/ui/Spinner.qml +60 -0
- package/ui/StableModel.qml +89 -0
- package/ui/StateMessage.qml +84 -0
- package/ui/StatusBar.qml +512 -0
- package/ui/StatusFileName.qml +27 -0
- package/ui/TabBar.qml +673 -0
- package/ui/TabDragGeometry.qml +60 -0
- package/ui/TagMenuMark.qml +52 -0
- package/ui/TagRailSection.qml +53 -0
- package/ui/TagSlot.qml +40 -0
- package/ui/TagState.qml +150 -0
- package/ui/TagSwatch.qml +28 -0
- package/ui/Taildrop.qml +86 -0
- package/ui/TailscaleMark.qml +50 -0
- package/ui/Theme.qml +460 -0
- package/ui/ThemeColors.qml +43 -0
- package/ui/TransferCard.qml +239 -0
- package/ui/TrashConfirm.qml +129 -0
- package/ui/TrashDropHandler.qml +11 -0
- package/ui/TrashHost.qml +202 -0
- package/ui/TrashMonitor.qml +30 -0
- package/ui/TrashToolbar.qml +19 -0
- package/ui/TrashView.qml +492 -0
- package/ui/UnlockDialog.qml +450 -0
- package/ui/UnlockHost.qml +206 -0
- package/ui/UpdateCheck.qml +97 -0
- package/ui/UserDirs.qml +25 -0
- package/ui/ViewState.qml +565 -0
- package/ui/ViewportScrollBar.qml +195 -0
- package/ui/ViewportScrollBars.qml +25 -0
- package/ui/WebPreview.qml +33 -0
- package/ui/WebPreviewView.qml +26 -0
- package/ui/WindowBody.qml +827 -0
- package/ui/WindowDrag.qml +35 -0
- package/ui/boot/Commons/AudioNodes.qml +50 -0
- package/ui/boot/Commons/AudioNodesModel.js +96 -0
- package/ui/boot/Commons/Border.qml +243 -0
- package/ui/boot/Commons/BorderGeometry.js +373 -0
- package/ui/boot/Commons/Color.qml +258 -0
- package/ui/boot/Commons/I18n.qml +118 -0
- package/ui/boot/Commons/InputDevices.qml +112 -0
- package/ui/boot/Commons/InputMethodState.qml +38 -0
- package/ui/boot/Commons/IpcRegistry.qml +77 -0
- package/ui/boot/Commons/Numbers.js +19 -0
- package/ui/boot/Commons/Plural.js +91 -0
- package/ui/boot/Commons/ShellIpc.qml +12 -0
- package/ui/boot/Commons/Style.qml +561 -0
- package/ui/boot/Commons/Translations.qml +100 -0
- package/ui/boot/Commons/UntypedInput.qml +152 -0
- package/ui/boot/Commons/Util.qml +188 -0
- package/ui/boot/Commons/qmldir +13 -0
- package/ui/boot/LICENSE-omarchy +20 -0
- package/ui/boot/Ui/BackgroundMedia.qml +49 -0
- package/ui/boot/Ui/BarIconButton.qml +106 -0
- package/ui/boot/Ui/BarIconContent.qml +38 -0
- package/ui/boot/Ui/BarIndicator.qml +53 -0
- package/ui/boot/Ui/BarWidget.qml +50 -0
- package/ui/boot/Ui/BorderOverlay.qml +54 -0
- package/ui/boot/Ui/BorderSurface.qml +40 -0
- package/ui/boot/Ui/Button.qml +224 -0
- package/ui/boot/Ui/ButtonGroup.qml +131 -0
- package/ui/boot/Ui/ConfirmDialog.qml +134 -0
- package/ui/boot/Ui/CursorSurface.qml +42 -0
- package/ui/boot/Ui/Dropdown.qml +245 -0
- package/ui/boot/Ui/FilterInput.qml +26 -0
- package/ui/boot/Ui/IconContentBounds.qml +141 -0
- package/ui/boot/Ui/KeyboardPanel.qml +453 -0
- package/ui/boot/Ui/MultiSelect.qml +624 -0
- package/ui/boot/Ui/NumberField.qml +86 -0
- package/ui/boot/Ui/OpticalGlyph.qml +68 -0
- package/ui/boot/Ui/OverlayWindow.qml +102 -0
- package/ui/boot/Ui/Panel.qml +60 -0
- package/ui/boot/Ui/PanelActionButton.qml +105 -0
- package/ui/boot/Ui/PanelController.qml +16 -0
- package/ui/boot/Ui/PanelHero.qml +112 -0
- package/ui/boot/Ui/PanelKeyCatcher.qml +100 -0
- package/ui/boot/Ui/PanelSectionHeader.qml +31 -0
- package/ui/boot/Ui/PanelSeparator.qml +19 -0
- package/ui/boot/Ui/PanelSlider.qml +156 -0
- package/ui/boot/Ui/PanelToolTip.qml +50 -0
- package/ui/boot/Ui/PluginBarApi.qml +89 -0
- package/ui/boot/Ui/PointerMoveGate.qml +54 -0
- package/ui/boot/Ui/PopupCard.qml +181 -0
- package/ui/boot/Ui/ScreenMoveRemap.qml +43 -0
- package/ui/boot/Ui/SearchableDropdown.qml +354 -0
- package/ui/boot/Ui/SizedImage.qml +125 -0
- package/ui/boot/Ui/SpeedTestOverlay.qml +412 -0
- package/ui/boot/Ui/TextField.qml +58 -0
- package/ui/boot/Ui/Toggle.qml +118 -0
- package/ui/boot/Ui/ToggleSwitch.qml +115 -0
- package/ui/boot/Ui/WidgetButton.qml +172 -0
- package/ui/boot/Ui/qmldir +41 -0
- package/ui/boot/fleatab.qml +50 -0
- package/ui/boot/picker.qml +39 -0
- package/ui/boot/shell.qml +122 -0
- package/ui/boot/tabtearoff.qml +51 -0
- package/ui/js/Anchor.js +379 -0
- package/ui/js/AnchorHold.js +162 -0
- package/ui/js/Archive.js +157 -0
- package/ui/js/ArchiveCard.js +44 -0
- package/ui/js/ArchiveOps.js +44 -0
- package/ui/js/BackReturn.js +118 -0
- package/ui/js/BulkRename.js +100 -0
- package/ui/js/Buttons.js +54 -0
- package/ui/js/ChromeKeys.js +116 -0
- package/ui/js/ClipMarks.js +73 -0
- package/ui/js/ClipSelection.js +67 -0
- package/ui/js/Clipboard.js +179 -0
- package/ui/js/Cloud.js +97 -0
- package/ui/js/CodeRuns.js +72 -0
- package/ui/js/Collide.js +212 -0
- package/ui/js/ColumnFit.js +28 -0
- package/ui/js/ColumnMenu.js +111 -0
- package/ui/js/Columns.js +298 -0
- package/ui/js/ColumnsCarry.js +103 -0
- package/ui/js/Compare.js +74 -0
- package/ui/js/Contrast.js +157 -0
- package/ui/js/ControlReader.js +42 -0
- package/ui/js/Convert.js +52 -0
- package/ui/js/CopyAs.js +52 -0
- package/ui/js/Crumbs.js +178 -0
- package/ui/js/Csv.js +231 -0
- package/ui/js/Density.js +44 -0
- package/ui/js/Devices.js +440 -0
- package/ui/js/DirSizes.js +180 -0
- package/ui/js/Drag.js +364 -0
- package/ui/js/DragOut.js +166 -0
- package/ui/js/DropDev.js +52 -0
- package/ui/js/Dropbox.js +41 -0
- package/ui/js/Eject.js +217 -0
- package/ui/js/Errors.js +188 -0
- package/ui/js/ExtThumbs.js +115 -0
- package/ui/js/Facts.js +402 -0
- package/ui/js/FigureDate.js +14 -0
- package/ui/js/Filter.js +285 -0
- package/ui/js/Find.js +46 -0
- package/ui/js/Flash.js +184 -0
- package/ui/js/FlashCard.js +79 -0
- package/ui/js/FlashEndings.js +125 -0
- package/ui/js/FlashPane.js +116 -0
- package/ui/js/FleaBin.js +12 -0
- package/ui/js/Focus.js +502 -0
- package/ui/js/FolderSorts.js +108 -0
- package/ui/js/FolderViews.js +44 -0
- package/ui/js/Format.js +305 -0
- package/ui/js/Fuzzy.js +141 -0
- package/ui/js/GlassTag.js +72 -0
- package/ui/js/Grid.js +33 -0
- package/ui/js/GridGeometry.js +90 -0
- package/ui/js/GridNames.js +153 -0
- package/ui/js/GvfsBridge.js +200 -0
- package/ui/js/HostClipboard.js +29 -0
- package/ui/js/Icons.js +218 -0
- package/ui/js/Input.js +50 -0
- package/ui/js/Jump.js +200 -0
- package/ui/js/KeyName.js +64 -0
- package/ui/js/Keymap.js +401 -0
- package/ui/js/Kinds.js +164 -0
- package/ui/js/LICENSES/ISC-lucide.txt +43 -0
- package/ui/js/LangMarkPaths.js +47 -0
- package/ui/js/LangMarks.js +120 -0
- package/ui/js/Lists.js +11 -0
- package/ui/js/LocalSend.js +39 -0
- package/ui/js/LockedMenu.js +63 -0
- package/ui/js/MakeDefault.js +186 -0
- package/ui/js/MarkBox.js +7 -0
- package/ui/js/Markdown.js +119 -0
- package/ui/js/MarkdownLists.js +86 -0
- package/ui/js/MarkdownMaths.js +58 -0
- package/ui/js/MarkdownPictures.js +32 -0
- package/ui/js/MarkdownPrepared.js +139 -0
- package/ui/js/MarkdownTableFit.js +34 -0
- package/ui/js/Marks.js +148 -0
- package/ui/js/Marquee.js +96 -0
- package/ui/js/Match.js +93 -0
- package/ui/js/Material.js +109 -0
- package/ui/js/MdBlocks.js +437 -0
- package/ui/js/MdBreak.js +71 -0
- package/ui/js/MdChunks.js +70 -0
- package/ui/js/MdContainer.js +137 -0
- package/ui/js/MdDocument.js +337 -0
- package/ui/js/MdEmph.js +97 -0
- package/ui/js/MdEntity.js +108 -0
- package/ui/js/MdEntityTable.js +223 -0
- package/ui/js/MdEscape.js +59 -0
- package/ui/js/MdFront.js +37 -0
- package/ui/js/MdHold.js +32 -0
- package/ui/js/MdHtml.js +307 -0
- package/ui/js/MdHtmlBlock.js +290 -0
- package/ui/js/MdHtmlHeading.js +53 -0
- package/ui/js/MdHtmlImage.js +179 -0
- package/ui/js/MdInline.js +154 -0
- package/ui/js/MdItems.js +212 -0
- package/ui/js/MdLeaf.js +309 -0
- package/ui/js/MdLink.js +196 -0
- package/ui/js/MdMath.js +67 -0
- package/ui/js/MdParagraphs.js +138 -0
- package/ui/js/MdRefs.js +232 -0
- package/ui/js/MdResolve.js +226 -0
- package/ui/js/MdRun.js +300 -0
- package/ui/js/MdUrl.js +226 -0
- package/ui/js/Menu.js +514 -0
- package/ui/js/MenuContext.js +85 -0
- package/ui/js/MenuFit.js +13 -0
- package/ui/js/MenuRefresh.js +74 -0
- package/ui/js/MenuWheel.js +35 -0
- package/ui/js/Messages.js +186 -0
- package/ui/js/Motion.js +16 -0
- package/ui/js/Mounts.js +320 -0
- package/ui/js/MouseNav.js +13 -0
- package/ui/js/Nav.js +329 -0
- package/ui/js/NetFs.js +26 -0
- package/ui/js/OpenWith.js +83 -0
- package/ui/js/Ops.js +585 -0
- package/ui/js/Palette.js +33 -0
- package/ui/js/PathBar.js +260 -0
- package/ui/js/Permissions.js +179 -0
- package/ui/js/Phones.js +112 -0
- package/ui/js/Picker.js +353 -0
- package/ui/js/PlaceMenu.js +96 -0
- package/ui/js/Places.js +265 -0
- package/ui/js/PreviewAsk.js +21 -0
- package/ui/js/PreviewKeys.js +155 -0
- package/ui/js/PreviewSettle.js +29 -0
- package/ui/js/PreviewSwap.js +101 -0
- package/ui/js/PropertyFacts.js +144 -0
- package/ui/js/Protocols.js +296 -0
- package/ui/js/QuickLookKinds.js +27 -0
- package/ui/js/QuickLookRect.js +24 -0
- package/ui/js/RailDrop.js +51 -0
- package/ui/js/RailKeys.js +87 -0
- package/ui/js/RailMenu.js +133 -0
- package/ui/js/Recent.js +135 -0
- package/ui/js/RecentMode.js +156 -0
- package/ui/js/Reload.js +60 -0
- package/ui/js/Renderer.js +9 -0
- package/ui/js/RunFile.js +143 -0
- package/ui/js/Scripts.js +28 -0
- package/ui/js/Scroll.js +304 -0
- package/ui/js/ScrollOff.js +69 -0
- package/ui/js/Search.js +478 -0
- package/ui/js/Selection.js +97 -0
- package/ui/js/Settings.js +476 -0
- package/ui/js/SettingsAbout.js +97 -0
- package/ui/js/SettingsShelf.js +52 -0
- package/ui/js/SheetKeys.js +42 -0
- package/ui/js/SheetQuery.js +281 -0
- package/ui/js/ShelfPile.js +27 -0
- package/ui/js/SlowClick.js +53 -0
- package/ui/js/SlowOp.js +6 -0
- package/ui/js/Sort.js +134 -0
- package/ui/js/Startup.js +63 -0
- package/ui/js/StateWords.js +17 -0
- package/ui/js/Status.js +238 -0
- package/ui/js/Swap.js +166 -0
- package/ui/js/TabMove.js +39 -0
- package/ui/js/Tabs.js +736 -0
- package/ui/js/Tags.js +134 -0
- package/ui/js/Taildrop.js +128 -0
- package/ui/js/Tap.js +174 -0
- package/ui/js/TextSize.js +107 -0
- package/ui/js/Thumbs.js +158 -0
- package/ui/js/Transfer.js +172 -0
- package/ui/js/Trash.js +81 -0
- package/ui/js/TrashDates.js +47 -0
- package/ui/js/TrashDrop.js +64 -0
- package/ui/js/UiState.js +438 -0
- package/ui/js/Unlock.js +152 -0
- package/ui/js/Update.js +130 -0
- package/ui/js/UserDirs.js +56 -0
- package/ui/qmldir +228 -0
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
import QtQuick
|
|
2
|
+
import qs.Commons
|
|
3
|
+
import qs.Commons as Commons
|
|
4
|
+
|
|
5
|
+
Item {
|
|
6
|
+
id: root
|
|
7
|
+
|
|
8
|
+
property QtObject bar: null
|
|
9
|
+
property real value: 0
|
|
10
|
+
property real minimum: 0
|
|
11
|
+
property real maximum: 1
|
|
12
|
+
property real step: 0.05
|
|
13
|
+
property bool integer: false
|
|
14
|
+
property color trackColor: bar ? Style.selectedFillFor(bar.foreground, Commons.Color.accent) : "#333"
|
|
15
|
+
property color fillColor: bar ? bar.foreground : Commons.Color.foreground
|
|
16
|
+
property color knobColor: bar ? bar.foreground : Commons.Color.foreground
|
|
17
|
+
property bool dragging: false
|
|
18
|
+
property real trackHeight: Math.max(4, Math.round(Style.spacing.controlHeight * 0.11))
|
|
19
|
+
property real knobSize: Math.max(14, Math.round(Style.spacing.controlHeight * 0.38))
|
|
20
|
+
property real liveValue: value
|
|
21
|
+
|
|
22
|
+
// macOS-style notches. When > 1, that many evenly-spaced tick marks are cut
|
|
23
|
+
// into the track (drawn in the panel background color, so only the part
|
|
24
|
+
// crossing the track shows). Purely visual — snapping is the caller's job via
|
|
25
|
+
// `integer`/`step` or an index-based value. Default 0 leaves the track plain.
|
|
26
|
+
property int tickCount: 0
|
|
27
|
+
property color tickColor: bar ? bar.background : Commons.Color.background
|
|
28
|
+
|
|
29
|
+
onValueChanged: if (!dragging) liveValue = value
|
|
30
|
+
|
|
31
|
+
signal moved(real value)
|
|
32
|
+
signal released(real value)
|
|
33
|
+
|
|
34
|
+
// Right-click is a secondary action on the whole track — audio uses it to
|
|
35
|
+
// mute the channel the slider belongs to. Dragging stays left-button only.
|
|
36
|
+
signal rightClicked()
|
|
37
|
+
|
|
38
|
+
implicitWidth: Style.space(200)
|
|
39
|
+
implicitHeight: Math.max(Style.space(22), knobSize + Style.spacing.md)
|
|
40
|
+
|
|
41
|
+
readonly property real range: Math.max(0.0001, maximum - minimum)
|
|
42
|
+
readonly property real progress: Math.max(0, Math.min(1, (liveValue - minimum) / range))
|
|
43
|
+
readonly property bool _hot: mouseArea.containsMouse || root.dragging
|
|
44
|
+
// In a mirrored (right-to-left) layout the anchored fill already starts at
|
|
45
|
+
// the right; the knob, ticks, and pointer are placed by x, so they flip here.
|
|
46
|
+
readonly property bool mirrored: LayoutMirroring.enabled
|
|
47
|
+
function trackX(fraction) {
|
|
48
|
+
return track.width * (root.mirrored ? 1 - fraction : fraction)
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
Rectangle {
|
|
52
|
+
id: track
|
|
53
|
+
anchors.verticalCenter: parent.verticalCenter
|
|
54
|
+
anchors.left: parent.left
|
|
55
|
+
anchors.right: parent.right
|
|
56
|
+
height: root.trackHeight
|
|
57
|
+
radius: height / 2
|
|
58
|
+
color: root.trackColor
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
Rectangle {
|
|
62
|
+
id: fill
|
|
63
|
+
anchors.verticalCenter: track.verticalCenter
|
|
64
|
+
anchors.left: track.left
|
|
65
|
+
height: track.height
|
|
66
|
+
radius: track.radius
|
|
67
|
+
color: root.fillColor
|
|
68
|
+
width: track.width * root.progress
|
|
69
|
+
|
|
70
|
+
Behavior on width {
|
|
71
|
+
enabled: !root.dragging
|
|
72
|
+
NumberAnimation { duration: Style.duration(140); easing.type: Easing.OutCubic }
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
Repeater {
|
|
77
|
+
model: root.tickCount > 1 ? root.tickCount : 0
|
|
78
|
+
Rectangle {
|
|
79
|
+
required property int index
|
|
80
|
+
width: Math.max(1, Style.space(2))
|
|
81
|
+
height: root.trackHeight + Style.space(4)
|
|
82
|
+
radius: 1
|
|
83
|
+
color: root.tickColor
|
|
84
|
+
anchors.verticalCenter: track.verticalCenter
|
|
85
|
+
x: Math.max(0, Math.min(track.width - width,
|
|
86
|
+
root.trackX(index / (root.tickCount - 1)) - width / 2))
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
BorderSurface {
|
|
91
|
+
id: knob
|
|
92
|
+
width: root.knobSize
|
|
93
|
+
height: root.knobSize
|
|
94
|
+
radius: root.knobSize / 2
|
|
95
|
+
color: root.knobColor
|
|
96
|
+
borderSpec: Border.flat(root.bar ? root.bar.background : "#101315", Math.max(1, Style.space(2)))
|
|
97
|
+
anchors.verticalCenter: track.verticalCenter
|
|
98
|
+
x: Math.max(0, Math.min(track.width - width, root.trackX(root.progress) - width / 2))
|
|
99
|
+
scale: root._hot ? 1.15 : 1.0
|
|
100
|
+
|
|
101
|
+
Behavior on x {
|
|
102
|
+
enabled: !root.dragging
|
|
103
|
+
NumberAnimation { duration: Style.duration(140); easing.type: Easing.OutCubic }
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
Behavior on scale {
|
|
107
|
+
NumberAnimation { duration: Style.duration(110); easing.type: Easing.OutCubic }
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
MouseArea {
|
|
112
|
+
id: mouseArea
|
|
113
|
+
anchors.fill: parent
|
|
114
|
+
hoverEnabled: true
|
|
115
|
+
cursorShape: Qt.PointingHandCursor
|
|
116
|
+
acceptedButtons: Qt.LeftButton | Qt.RightButton
|
|
117
|
+
|
|
118
|
+
function valueFromX(x) {
|
|
119
|
+
var clamped = Math.max(0, Math.min(track.width, root.mirrored ? track.width - x : x))
|
|
120
|
+
var raw = root.minimum + (clamped / track.width) * root.range
|
|
121
|
+
if (root.integer) raw = Math.round(raw)
|
|
122
|
+
return Math.max(root.minimum, Math.min(root.maximum, raw))
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
onPressed: function(mouse) {
|
|
126
|
+
if (mouse.button !== Qt.LeftButton) return
|
|
127
|
+
root.dragging = true
|
|
128
|
+
var next = valueFromX(mouse.x)
|
|
129
|
+
root.liveValue = next
|
|
130
|
+
root.moved(next)
|
|
131
|
+
}
|
|
132
|
+
onClicked: function(mouse) {
|
|
133
|
+
if (mouse.button === Qt.RightButton) root.rightClicked()
|
|
134
|
+
}
|
|
135
|
+
onPositionChanged: function(mouse) {
|
|
136
|
+
if (!root.dragging) return
|
|
137
|
+
var next = valueFromX(mouse.x)
|
|
138
|
+
root.liveValue = next
|
|
139
|
+
root.moved(next)
|
|
140
|
+
}
|
|
141
|
+
onReleased: function(mouse) {
|
|
142
|
+
if (mouse.button !== Qt.LeftButton) return
|
|
143
|
+
root.dragging = false
|
|
144
|
+
root.released(root.liveValue)
|
|
145
|
+
root.liveValue = root.value
|
|
146
|
+
}
|
|
147
|
+
onWheel: function(wheel) {
|
|
148
|
+
var delta = wheel.angleDelta.y > 0 ? root.step : -root.step
|
|
149
|
+
var next = Math.max(root.minimum, Math.min(root.maximum, root.liveValue + delta))
|
|
150
|
+
if (root.integer) next = Math.round(next)
|
|
151
|
+
root.liveValue = next
|
|
152
|
+
root.moved(next)
|
|
153
|
+
root.released(next)
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import QtQuick
|
|
2
|
+
import QtQuick.Controls
|
|
3
|
+
import qs.Commons
|
|
4
|
+
import qs.Commons as Commons
|
|
5
|
+
|
|
6
|
+
// Styled wrapper around Qt Quick Controls ToolTip. Drop-in: declare inside
|
|
7
|
+
// the hovered item and bind `visible` to the hover state, e.g.
|
|
8
|
+
// PanelToolTip {
|
|
9
|
+
// visible: mouse.containsMouse
|
|
10
|
+
// text: "Forget network"
|
|
11
|
+
// }
|
|
12
|
+
//
|
|
13
|
+
// Defaults pull from [tooltip] in shell.toml via Commons.Color.tooltip.*. Override
|
|
14
|
+
// the panel* properties per-instance only when you need a tooltip that
|
|
15
|
+
// intentionally diverges from the theme.
|
|
16
|
+
//
|
|
17
|
+
// Property names are prefixed `panel*` to avoid clashing with ToolTip's
|
|
18
|
+
// built-in `background`/`font` properties.
|
|
19
|
+
ToolTip {
|
|
20
|
+
id: root
|
|
21
|
+
|
|
22
|
+
property color panelForeground: Commons.Color.tooltip.text
|
|
23
|
+
property color panelBackground: Commons.Color.tooltip.background
|
|
24
|
+
property color panelBorder: Commons.Color.tooltip.border
|
|
25
|
+
property string fontFamily: Style.font.family
|
|
26
|
+
property real fontSize: Style.font.bodySmall
|
|
27
|
+
|
|
28
|
+
readonly property var panelBorderSpec: Border.localOrSurfaceSpec("tooltip", "border", panelBorder, Commons.Color.tooltip.border, Style.normalBorderWidth)
|
|
29
|
+
|
|
30
|
+
delay: 400
|
|
31
|
+
padding: 0
|
|
32
|
+
|
|
33
|
+
background: BorderSurface {
|
|
34
|
+
color: root.panelBackground
|
|
35
|
+
borderSpec: root.panelBorderSpec
|
|
36
|
+
radius: Style.cornerRadius
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
contentItem: Text {
|
|
40
|
+
textFormat: Text.PlainText
|
|
41
|
+
text: root.text
|
|
42
|
+
color: root.panelForeground
|
|
43
|
+
font.family: root.fontFamily
|
|
44
|
+
font.pixelSize: root.fontSize
|
|
45
|
+
leftPadding: Border.left(root.panelBorderSpec) + Style.spacing.controlPaddingX
|
|
46
|
+
rightPadding: Border.right(root.panelBorderSpec) + Style.spacing.controlPaddingX
|
|
47
|
+
topPadding: Border.top(root.panelBorderSpec) + Style.spacing.controlPaddingY
|
|
48
|
+
bottomPadding: Border.bottom(root.panelBorderSpec) + Style.spacing.controlPaddingY
|
|
49
|
+
}
|
|
50
|
+
}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import QtQuick
|
|
2
|
+
|
|
3
|
+
// Bar surface exposed to an installed third-party widget. Scalar presentation
|
|
4
|
+
// state is mirrored by Bar.qml and operations are delegated through scoped
|
|
5
|
+
// callbacks. The facade avoids direct host-Bar injection; it cannot isolate a
|
|
6
|
+
// visual child from the parent hierarchy of the QML scene that renders it.
|
|
7
|
+
QtObject {
|
|
8
|
+
id: api
|
|
9
|
+
|
|
10
|
+
required property string pluginId
|
|
11
|
+
required property string moduleName
|
|
12
|
+
property var shell: null
|
|
13
|
+
|
|
14
|
+
property color foreground: "transparent"
|
|
15
|
+
property color barForeground: "transparent"
|
|
16
|
+
property color background: "transparent"
|
|
17
|
+
property color urgent: "transparent"
|
|
18
|
+
property string fontFamily: ""
|
|
19
|
+
property string position: "top"
|
|
20
|
+
property bool vertical: false
|
|
21
|
+
property int barSize: 0
|
|
22
|
+
property bool transparent: false
|
|
23
|
+
property bool foregroundAnimationEnabled: true
|
|
24
|
+
property bool centerSectionRevealHeld: false
|
|
25
|
+
property bool traySectionDragActive: false
|
|
26
|
+
property bool traySectionPopoutOpen: false
|
|
27
|
+
property bool _centerHoverRevealSuppressed: false
|
|
28
|
+
readonly property bool centerHoverRevealSuppressed: _centerHoverRevealSuppressed
|
|
29
|
+
property var activePopout: null
|
|
30
|
+
property var clickTargets: []
|
|
31
|
+
property var layoutConfig: ({})
|
|
32
|
+
readonly property var foreignPopoutMarker: ({ foreign: true })
|
|
33
|
+
|
|
34
|
+
property var _showTooltip: null
|
|
35
|
+
property var _hideTooltip: null
|
|
36
|
+
property var _registerClickTarget: null
|
|
37
|
+
property var _unregisterClickTarget: null
|
|
38
|
+
property var _requestPopout: null
|
|
39
|
+
property var _releasePopout: null
|
|
40
|
+
property var _switchPanelFrom: null
|
|
41
|
+
property var _targetBelongsToWindow: null
|
|
42
|
+
property var _moduleWidgets: null
|
|
43
|
+
property var _run: null
|
|
44
|
+
property var _setCenterHoverRevealSuppressed: null
|
|
45
|
+
|
|
46
|
+
function setCenterHoverRevealSuppressed(value) {
|
|
47
|
+
if (_setCenterHoverRevealSuppressed) _setCenterHoverRevealSuppressed(!!value)
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
function showTooltip(target, text) {
|
|
51
|
+
if (_showTooltip) _showTooltip(target, String(text || ""))
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
function hideTooltip(target) {
|
|
55
|
+
if (_hideTooltip) _hideTooltip(target)
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
function registerClickTarget(target) {
|
|
59
|
+
if (_registerClickTarget) _registerClickTarget(target)
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
function unregisterClickTarget(target) {
|
|
63
|
+
if (_unregisterClickTarget) _unregisterClickTarget(target)
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
function requestPopout(owner) {
|
|
67
|
+
if (_requestPopout) _requestPopout(owner)
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
function releasePopout(owner) {
|
|
71
|
+
if (_releasePopout) _releasePopout(owner)
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
function switchPanelFrom(owner, direction) {
|
|
75
|
+
return _switchPanelFrom ? _switchPanelFrom(owner, direction) : false
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
function targetBelongsToWindow(target, window) {
|
|
79
|
+
return _targetBelongsToWindow ? _targetBelongsToWindow(target, window) : false
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
function moduleWidgets(id) {
|
|
83
|
+
return _moduleWidgets ? _moduleWidgets(String(id || "")) : []
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
function run(command) {
|
|
87
|
+
if (_run) _run(String(command || ""))
|
|
88
|
+
}
|
|
89
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import QtQuick
|
|
2
|
+
|
|
3
|
+
// Filters synthetic hover churn from moving delegates under a stationary
|
|
4
|
+
// pointer. Call reset() after keyboard/list mutations, then moved() from a
|
|
5
|
+
// row MouseArea's onPositionChanged before changing cursor selection. A
|
|
6
|
+
// transition known to originate from the pointer can call allowInitialSample()
|
|
7
|
+
// so the item under the stationary pointer remains selected.
|
|
8
|
+
QtObject {
|
|
9
|
+
id: root
|
|
10
|
+
|
|
11
|
+
property Item referenceItem: null
|
|
12
|
+
property real threshold: 1
|
|
13
|
+
property bool primed: false
|
|
14
|
+
property bool initialSampleAllowed: false
|
|
15
|
+
property real lastX: 0
|
|
16
|
+
property real lastY: 0
|
|
17
|
+
|
|
18
|
+
function reset() {
|
|
19
|
+
root.primed = false
|
|
20
|
+
root.initialSampleAllowed = false
|
|
21
|
+
root.lastX = 0
|
|
22
|
+
root.lastY = 0
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
function allowInitialSample() {
|
|
26
|
+
root.reset()
|
|
27
|
+
root.initialSampleAllowed = true
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function moved(item, mouse) {
|
|
31
|
+
if (!item || !mouse) {
|
|
32
|
+
root.reset()
|
|
33
|
+
return false
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
var target = root.referenceItem || item
|
|
37
|
+
var point = item.mapToItem(target, mouse.x, mouse.y)
|
|
38
|
+
var firstSample = !root.primed
|
|
39
|
+
var didMove = !firstSample
|
|
40
|
+
? Math.abs(point.x - root.lastX) > root.threshold || Math.abs(point.y - root.lastY) > root.threshold
|
|
41
|
+
: root.initialSampleAllowed
|
|
42
|
+
|
|
43
|
+
// Keep the previous accepted position while filtering jitter so slow,
|
|
44
|
+
// sub-threshold steps accumulate into deliberate pointer movement.
|
|
45
|
+
if (firstSample || didMove) {
|
|
46
|
+
root.lastX = point.x
|
|
47
|
+
root.lastY = point.y
|
|
48
|
+
}
|
|
49
|
+
root.primed = true
|
|
50
|
+
root.initialSampleAllowed = false
|
|
51
|
+
|
|
52
|
+
return didMove
|
|
53
|
+
}
|
|
54
|
+
}
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
import QtQuick
|
|
2
|
+
import Quickshell
|
|
3
|
+
import Quickshell.Hyprland
|
|
4
|
+
import qs.Commons
|
|
5
|
+
import qs.Commons as Commons
|
|
6
|
+
|
|
7
|
+
PopupWindow {
|
|
8
|
+
id: root
|
|
9
|
+
|
|
10
|
+
required property Item anchorItem
|
|
11
|
+
required property QtObject bar
|
|
12
|
+
property var owner: null
|
|
13
|
+
property int margin: Style.gapsOut
|
|
14
|
+
property int padding: Style.spacing.popupPadding
|
|
15
|
+
property int contentWidth: Style.space(280)
|
|
16
|
+
property int contentHeight: Style.space(200)
|
|
17
|
+
property color borderColor: Commons.Color.popups.border
|
|
18
|
+
property var borderSpec: Border.localOrSurfaceSpec("popups", "border", borderColor, Commons.Color.popups.border, Math.max(1, Style.space(2)))
|
|
19
|
+
property bool open: false
|
|
20
|
+
property bool centerOnBar: false
|
|
21
|
+
// "click" — uses HyprlandFocusGrab so clicking outside dismisses the popup.
|
|
22
|
+
// "hover" — passive overlay; the owning widget controls open via hover.
|
|
23
|
+
property string triggerMode: "click"
|
|
24
|
+
|
|
25
|
+
readonly property var coordinatorKey: owner || root
|
|
26
|
+
readonly property var anchorWindow: anchorItem ? anchorItem.QsWindow.window : null
|
|
27
|
+
readonly property var popupScreen: anchorWindow ? anchorWindow.screen : null
|
|
28
|
+
readonly property bool containsMouse: cardHover.hovered
|
|
29
|
+
readonly property real screenW: popupScreen ? popupScreen.width : 0
|
|
30
|
+
readonly property real screenH: popupScreen ? popupScreen.height : 0
|
|
31
|
+
readonly property real barW: anchorWindow ? anchorWindow.width : 0
|
|
32
|
+
readonly property real barH: anchorWindow ? anchorWindow.height : 0
|
|
33
|
+
readonly property real availableCardWidth: screenW > 0
|
|
34
|
+
? Math.max(120, screenW - ((bar && (bar.position === "left" || bar.position === "right")) ? barW : 0) - root.margin * 2)
|
|
35
|
+
: 0
|
|
36
|
+
readonly property real availableCardHeight: screenH > 0
|
|
37
|
+
? Math.max(120, screenH - ((bar && (bar.position === "top" || bar.position === "bottom")) ? barH : 0) - root.margin * 2)
|
|
38
|
+
: 0
|
|
39
|
+
readonly property real verticalContentInset: padding * 2 + Border.top(borderSpec) + Border.bottom(borderSpec)
|
|
40
|
+
|
|
41
|
+
function fittedContentWidth(width, cap) {
|
|
42
|
+
var desired = Math.max(1, Number(width) || 1)
|
|
43
|
+
var maxWidth = root.availableCardWidth > 0 ? root.availableCardWidth : desired
|
|
44
|
+
if (cap !== undefined && Number(cap) > 0) maxWidth = Math.min(maxWidth, Number(cap))
|
|
45
|
+
return Math.round(Math.min(desired, maxWidth))
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
function fittedContentHeight(implicitHeight, cap) {
|
|
49
|
+
var desired = Math.max(root.verticalContentInset, (Number(implicitHeight) || 0) + root.verticalContentInset)
|
|
50
|
+
var maxHeight = root.availableCardHeight > 0 ? root.availableCardHeight : desired
|
|
51
|
+
if (cap !== undefined && Number(cap) > 0) maxHeight = Math.min(maxHeight, Number(cap))
|
|
52
|
+
return Math.round(Math.min(desired, maxHeight))
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
function cappedContentHeight(height) {
|
|
56
|
+
var desired = Math.max(root.padding * 2, Number(height) || root.padding * 2)
|
|
57
|
+
var maxHeight = root.availableCardHeight > 0 ? root.availableCardHeight : desired
|
|
58
|
+
return Math.round(Math.min(desired, maxHeight))
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
function close() {
|
|
62
|
+
if (owner && "close" in owner) owner.close()
|
|
63
|
+
else root.open = false
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
default property alias contentItem: contentHolder.children
|
|
67
|
+
|
|
68
|
+
visible: open || card.opacity > 0
|
|
69
|
+
color: "transparent"
|
|
70
|
+
implicitWidth: contentWidth
|
|
71
|
+
implicitHeight: contentHeight
|
|
72
|
+
|
|
73
|
+
onOpenChanged: {
|
|
74
|
+
if (!bar) return
|
|
75
|
+
if (open) bar.requestPopout(coordinatorKey)
|
|
76
|
+
else if (bar.activePopout === coordinatorKey) bar.releasePopout(coordinatorKey)
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
// Outside-click dismissal via Hyprland's focus grab. While `active`, input
|
|
80
|
+
// is routed only to the listed windows; clicking anywhere else clears the
|
|
81
|
+
// grab and we close the popup. Skipped for hover-mode popups so the cursor
|
|
82
|
+
// can move freely between the trigger and the popup.
|
|
83
|
+
HyprlandFocusGrab {
|
|
84
|
+
active: root.open && root.triggerMode === "click"
|
|
85
|
+
windows: root.anchorWindow ? [root, root.anchorWindow] : [root]
|
|
86
|
+
onCleared: root.close()
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
anchor {
|
|
90
|
+
id: popupAnchor
|
|
91
|
+
window: anchorItem ? anchorItem.QsWindow.window : null
|
|
92
|
+
adjustment: PopupAdjustment.Slide
|
|
93
|
+
edges: Edges.Top | Edges.Left
|
|
94
|
+
gravity: Edges.Bottom | Edges.Right
|
|
95
|
+
rect.width: 1
|
|
96
|
+
rect.height: 1
|
|
97
|
+
|
|
98
|
+
onAnchoring: {
|
|
99
|
+
if (!root.anchorItem || !root.bar) return
|
|
100
|
+
|
|
101
|
+
var target = root.anchorItem
|
|
102
|
+
var popupWidth = root.implicitWidth
|
|
103
|
+
var popupHeight = root.implicitHeight
|
|
104
|
+
var localX = target.width / 2 - popupWidth / 2
|
|
105
|
+
var localY = target.height + root.margin
|
|
106
|
+
|
|
107
|
+
if (root.bar.position === "bottom") {
|
|
108
|
+
localY = -popupHeight - root.margin
|
|
109
|
+
} else if (root.bar.position === "left") {
|
|
110
|
+
localX = target.width + root.margin
|
|
111
|
+
localY = target.height / 2 - popupHeight / 2
|
|
112
|
+
} else if (root.bar.position === "right") {
|
|
113
|
+
localX = -popupWidth - root.margin
|
|
114
|
+
localY = target.height / 2 - popupHeight / 2
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
var window = target.QsWindow.window
|
|
118
|
+
if (!window) return
|
|
119
|
+
|
|
120
|
+
if (root.centerOnBar) {
|
|
121
|
+
var cx = 0;
|
|
122
|
+
var cy = 0;
|
|
123
|
+
if (root.bar.position === "top" || root.bar.position === "bottom") {
|
|
124
|
+
cx = window.width / 2 - popupWidth / 2
|
|
125
|
+
cy = root.bar.position === "bottom" ? -popupHeight - root.margin : window.height + root.margin
|
|
126
|
+
cx = Math.max(root.margin, Math.min(cx, window.width - popupWidth - root.margin))
|
|
127
|
+
} else {
|
|
128
|
+
cx = root.bar.position === "left" ? window.width + root.margin : -popupWidth - root.margin
|
|
129
|
+
cy = window.height / 2 - popupHeight / 2
|
|
130
|
+
cy = Math.max(root.margin, Math.min(cy, window.height - popupHeight - root.margin))
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
popupAnchor.rect.x = Math.round(cx)
|
|
134
|
+
popupAnchor.rect.y = Math.round(cy)
|
|
135
|
+
return
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
var point = window.contentItem.mapFromItem(target, localX, localY)
|
|
139
|
+
|
|
140
|
+
if (root.bar.position === "top" || root.bar.position === "bottom") {
|
|
141
|
+
point.x = Math.max(root.margin, Math.min(point.x, window.width - popupWidth - root.margin))
|
|
142
|
+
} else {
|
|
143
|
+
point.y = Math.max(root.margin, Math.min(point.y, window.height - popupHeight - root.margin))
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
popupAnchor.rect.x = Math.round(point.x)
|
|
147
|
+
popupAnchor.rect.y = Math.round(point.y)
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
BorderSurface {
|
|
152
|
+
id: card
|
|
153
|
+
anchors.fill: parent
|
|
154
|
+
color: Commons.Color.popups.background
|
|
155
|
+
borderSpec: root.borderSpec
|
|
156
|
+
padding: root.padding
|
|
157
|
+
radius: Style.cornerRadius
|
|
158
|
+
opacity: root.open ? 1.0 : 0
|
|
159
|
+
|
|
160
|
+
Behavior on opacity {
|
|
161
|
+
NumberAnimation { duration: Style.duration(140); easing.type: Easing.OutCubic }
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
Item {
|
|
165
|
+
id: contentHolder
|
|
166
|
+
anchors.fill: parent
|
|
167
|
+
// Right-to-left languages read the card mirrored; the card itself
|
|
168
|
+
// stays where the bar puts it.
|
|
169
|
+
LayoutMirroring.enabled: Commons.I18n.rightToLeft
|
|
170
|
+
LayoutMirroring.childrenInherit: true
|
|
171
|
+
anchors.topMargin: card.contentTopInset
|
|
172
|
+
anchors.rightMargin: card.contentRightInset
|
|
173
|
+
anchors.bottomMargin: card.contentBottomInset
|
|
174
|
+
anchors.leftMargin: card.contentLeftInset
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
HoverHandler {
|
|
178
|
+
id: cardHover
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import QtQuick
|
|
2
|
+
|
|
3
|
+
// Hyprland leaves an already-mapped layer surface at its old global position
|
|
4
|
+
// when its monitor moves within the layout: undocking disables the internal
|
|
5
|
+
// panel, the external monitor shifts to x=0, and long-lived surfaces such as
|
|
6
|
+
// the bar and background keep rendering at the old offset — or entirely
|
|
7
|
+
// off-screen — until they are unmapped and remapped. Watch the screen's
|
|
8
|
+
// origin and pulse `remapping` when it moves; the owning window folds that
|
|
9
|
+
// into its `visible` binding so the compositor re-places the surface at the
|
|
10
|
+
// monitor's new origin.
|
|
11
|
+
Item {
|
|
12
|
+
id: root
|
|
13
|
+
|
|
14
|
+
required property var window
|
|
15
|
+
readonly property var screen: window ? window.screen : null
|
|
16
|
+
|
|
17
|
+
// Fold into the window's binding: visible: <shown> && !guard.remapping
|
|
18
|
+
property bool remapping: false
|
|
19
|
+
|
|
20
|
+
visible: false
|
|
21
|
+
|
|
22
|
+
// A layout reshuffle can move the monitor more than once before it lands.
|
|
23
|
+
// Let the positions settle before the single remap pulse.
|
|
24
|
+
Timer {
|
|
25
|
+
id: settleTimer
|
|
26
|
+
interval: 200
|
|
27
|
+
onTriggered: root.remapping = true
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// Hold the surface unmapped for a beat so the compositor processes the
|
|
31
|
+
// unmap before the remap instead of coalescing them into a no-op.
|
|
32
|
+
Timer {
|
|
33
|
+
interval: 50
|
|
34
|
+
running: root.remapping
|
|
35
|
+
onTriggered: root.remapping = false
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
Connections {
|
|
39
|
+
target: root.screen
|
|
40
|
+
function onXChanged() { settleTimer.restart() }
|
|
41
|
+
function onYChanged() { settleTimer.restart() }
|
|
42
|
+
}
|
|
43
|
+
}
|