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,68 @@
|
|
|
1
|
+
import QtQuick
|
|
2
|
+
import qs.Commons
|
|
3
|
+
import qs.Commons as Commons
|
|
4
|
+
|
|
5
|
+
Item {
|
|
6
|
+
id: root
|
|
7
|
+
|
|
8
|
+
property string text: ""
|
|
9
|
+
property string fontFamily: Style.font.family
|
|
10
|
+
property real fontSize: Style.font.body
|
|
11
|
+
property real paintedSize: 0
|
|
12
|
+
property color color: Commons.Color.foreground
|
|
13
|
+
property bool debugBounds: false
|
|
14
|
+
|
|
15
|
+
readonly property int renderedFontSize: Math.max(1, Math.round(fontSize))
|
|
16
|
+
readonly property real tightWidth: Math.max(1, glyphMetrics.tightBoundingRect.width)
|
|
17
|
+
readonly property real tightHeight: Math.max(1, glyphMetrics.tightBoundingRect.height)
|
|
18
|
+
readonly property real paintedScale: paintedSize > 0
|
|
19
|
+
? Math.min(paintedSize, width, height) / Math.max(tightWidth, tightHeight)
|
|
20
|
+
: 1
|
|
21
|
+
readonly property real paintedWidth: tightWidth * paintedScale
|
|
22
|
+
readonly property real paintedHeight: tightHeight * paintedScale
|
|
23
|
+
readonly property real horizontalCorrection: glyph.implicitWidth / 2 - (glyphMetrics.tightBoundingRect.x + tightWidth / 2)
|
|
24
|
+
readonly property real paintedCenterX: glyph.x + (glyphMetrics.tightBoundingRect.x + tightWidth / 2) * paintedScale
|
|
25
|
+
readonly property real paintedCenterY: glyph.y + (glyph.baselineOffset + glyphMetrics.tightBoundingRect.y + tightHeight / 2) * paintedScale
|
|
26
|
+
readonly property real baselineY: glyph.y + glyph.baselineOffset * paintedScale
|
|
27
|
+
|
|
28
|
+
TextMetrics {
|
|
29
|
+
id: glyphMetrics
|
|
30
|
+
font.family: root.fontFamily
|
|
31
|
+
font.pixelSize: root.renderedFontSize
|
|
32
|
+
text: root.text
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
Text {
|
|
36
|
+
id: glyph
|
|
37
|
+
textFormat: Text.PlainText
|
|
38
|
+
// Bar icons fit their painted bounds. Text labels retain their line box.
|
|
39
|
+
x: root.width / 2 - (glyphMetrics.tightBoundingRect.x + root.tightWidth / 2) * root.paintedScale
|
|
40
|
+
y: root.paintedSize > 0
|
|
41
|
+
? root.height / 2 - (baselineOffset + glyphMetrics.tightBoundingRect.y + root.tightHeight / 2) * root.paintedScale
|
|
42
|
+
: Math.round((root.height - height) / 2)
|
|
43
|
+
text: root.text
|
|
44
|
+
color: root.color
|
|
45
|
+
font.family: root.fontFamily
|
|
46
|
+
font.pixelSize: root.renderedFontSize
|
|
47
|
+
transformOrigin: Item.TopLeft
|
|
48
|
+
scale: root.paintedScale
|
|
49
|
+
renderType: root.paintedSize > 0 ? Text.CurveRendering : Text.NativeRendering
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
Rectangle {
|
|
53
|
+
visible: root.debugBounds
|
|
54
|
+
anchors.fill: parent
|
|
55
|
+
color: "transparent"
|
|
56
|
+
border.width: 1
|
|
57
|
+
border.color: "#4488ff"
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
Rectangle {
|
|
61
|
+
visible: root.debugBounds
|
|
62
|
+
x: 0
|
|
63
|
+
y: Math.round(root.baselineY)
|
|
64
|
+
width: parent.width
|
|
65
|
+
height: 1
|
|
66
|
+
color: "#44ff88"
|
|
67
|
+
}
|
|
68
|
+
}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import QtQuick
|
|
2
|
+
import Quickshell
|
|
3
|
+
import Quickshell.Hyprland
|
|
4
|
+
import Quickshell.Wayland
|
|
5
|
+
import qs.Commons as Commons
|
|
6
|
+
|
|
7
|
+
// Map a fresh fullscreen surface on each open. Keep its first frames
|
|
8
|
+
// transparent until Qt receives the output's scale, so it opens sharp without
|
|
9
|
+
// retaining a parked surface that can be closed when a monitor disconnects.
|
|
10
|
+
PanelWindow {
|
|
11
|
+
id: window
|
|
12
|
+
|
|
13
|
+
// Whether the overlay is showing. Drive this instead of visible.
|
|
14
|
+
property bool shown: false
|
|
15
|
+
property int shownLayer: WlrLayer.Overlay
|
|
16
|
+
property int shownKeyboardFocus: WlrKeyboardFocus.Exclusive
|
|
17
|
+
|
|
18
|
+
property var targetScreen: null
|
|
19
|
+
readonly property var targetMonitor: {
|
|
20
|
+
var monitors = Hyprland.monitors.values
|
|
21
|
+
for (var i = 0; i < monitors.length; i++) {
|
|
22
|
+
if (targetScreen && monitors[i].name === targetScreen.name) return monitors[i]
|
|
23
|
+
}
|
|
24
|
+
return null
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
// Wait for fullscreen geometry as well as scale so no smaller opening frame
|
|
28
|
+
// is stretched across the output. Fractional scale uses units of 1/120;
|
|
29
|
+
// compare in those units to tolerate floating point rounding.
|
|
30
|
+
readonly property bool contentReady: shown && backingWindowVisible && !!targetScreen
|
|
31
|
+
&& width === targetScreen.width && height === targetScreen.height
|
|
32
|
+
&& !!targetMonitor && Math.round(devicePixelRatio * 120) === Math.round(targetMonitor.scale * 120)
|
|
33
|
+
property bool contentRevealed: false
|
|
34
|
+
|
|
35
|
+
onContentReadyChanged: {
|
|
36
|
+
contentRevealed = false
|
|
37
|
+
// Resize and scale notifications arrive while Qt is still updating the
|
|
38
|
+
// window. Reveal on the next turn, once its content layout has caught up.
|
|
39
|
+
if (contentReady) Qt.callLater(function() {
|
|
40
|
+
if (window.contentReady) window.contentRevealed = true
|
|
41
|
+
})
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function focusedScreen() {
|
|
45
|
+
var monitor = Hyprland.focusedMonitor
|
|
46
|
+
var name = monitor ? String(monitor.name || "") : ""
|
|
47
|
+
for (var i = 0; i < Quickshell.screens.length; i++) {
|
|
48
|
+
if (Quickshell.screens[i].name === name) return Quickshell.screens[i]
|
|
49
|
+
}
|
|
50
|
+
return Quickshell.screens.length > 0 ? Quickshell.screens[0] : null
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// Live monitor scaling does not emit a Hyprland monitor event, so its cached
|
|
54
|
+
// scale can lag behind Qt. Refresh on opening and on scale changes while open.
|
|
55
|
+
onShownChanged: {
|
|
56
|
+
targetScreen = shown ? focusedScreen() : null
|
|
57
|
+
if (shown) Hyprland.refreshMonitors()
|
|
58
|
+
}
|
|
59
|
+
onDevicePixelRatioChanged: if (shown) Hyprland.refreshMonitors()
|
|
60
|
+
|
|
61
|
+
Connections {
|
|
62
|
+
target: Quickshell
|
|
63
|
+
function onScreensChanged() {
|
|
64
|
+
if (window.shown && Quickshell.screens.indexOf(window.targetScreen) < 0) {
|
|
65
|
+
window.targetScreen = null
|
|
66
|
+
// Let the removed output finish closing its old window before mapping
|
|
67
|
+
// a replacement, rather than recreating it during Qt's teardown.
|
|
68
|
+
Qt.callLater(function() {
|
|
69
|
+
if (window.shown && !window.targetScreen) window.targetScreen = window.focusedScreen()
|
|
70
|
+
})
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
visible: shown && !!targetScreen && !!targetMonitor
|
|
76
|
+
screen: targetScreen
|
|
77
|
+
anchors { top: true; left: true; bottom: true; right: true }
|
|
78
|
+
color: "transparent"
|
|
79
|
+
exclusionMode: ExclusionMode.Ignore
|
|
80
|
+
WlrLayershell.layer: shownLayer
|
|
81
|
+
WlrLayershell.keyboardFocus: shownKeyboardFocus
|
|
82
|
+
|
|
83
|
+
// Opacity preserves keyboard handling while the scale arrives, including
|
|
84
|
+
// search keystrokes and Escape pressed immediately after opening.
|
|
85
|
+
Binding {
|
|
86
|
+
target: window.contentItem
|
|
87
|
+
property: "opacity"
|
|
88
|
+
value: window.contentRevealed ? 1 : 0
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// Right-to-left languages read the overlay mirrored.
|
|
92
|
+
Binding {
|
|
93
|
+
target: window.contentItem
|
|
94
|
+
property: "LayoutMirroring.enabled"
|
|
95
|
+
value: Commons.I18n.rightToLeft
|
|
96
|
+
}
|
|
97
|
+
Binding {
|
|
98
|
+
target: window.contentItem
|
|
99
|
+
property: "LayoutMirroring.childrenInherit"
|
|
100
|
+
value: true
|
|
101
|
+
}
|
|
102
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import QtQuick
|
|
2
|
+
import Quickshell.Io
|
|
3
|
+
import qs.Commons
|
|
4
|
+
import qs.Commons as Commons
|
|
5
|
+
|
|
6
|
+
// Base item for plugin popup widgets. Many first-party plugins expose a bar
|
|
7
|
+
// button plus a popup from one QML entry point; this base owns the shared
|
|
8
|
+
// IPC-backed open/close lifecycle while implementations own button behavior,
|
|
9
|
+
// keyboard navigation, and content.
|
|
10
|
+
Item {
|
|
11
|
+
id: root
|
|
12
|
+
|
|
13
|
+
property QtObject bar: null
|
|
14
|
+
property string moduleName: ""
|
|
15
|
+
property var settings: ({})
|
|
16
|
+
property string ipcTarget: ""
|
|
17
|
+
property bool manageIpc: true
|
|
18
|
+
property alias controller: panelController
|
|
19
|
+
property bool popoutSwitching: false
|
|
20
|
+
property bool popoutSwitchClosing: false
|
|
21
|
+
|
|
22
|
+
readonly property bool opened: panelController.open
|
|
23
|
+
readonly property color barForeground: bar ? bar.barForeground : Commons.Color.foreground
|
|
24
|
+
|
|
25
|
+
function open() { panelController.show() }
|
|
26
|
+
function close() { panelController.hide() }
|
|
27
|
+
function closeForPopoutSwitch() {
|
|
28
|
+
popoutSwitchClosing = true
|
|
29
|
+
close()
|
|
30
|
+
Qt.callLater(function() { popoutSwitchClosing = false })
|
|
31
|
+
}
|
|
32
|
+
function toggle() { opened ? close() : open() }
|
|
33
|
+
function switchPanel(direction) {
|
|
34
|
+
if (bar && typeof bar.switchPanelFrom === "function") return bar.switchPanelFrom(root, direction)
|
|
35
|
+
return false
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// Read a single value from this panel's inline shell.json entry, with a
|
|
39
|
+
// fallback for missing/null values. Matches BarWidget.setting().
|
|
40
|
+
function setting(name, fallback) {
|
|
41
|
+
var value = settings ? settings[name] : undefined
|
|
42
|
+
return value === undefined || value === null ? fallback : value
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
PanelController {
|
|
46
|
+
id: panelController
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
ShellIpc {
|
|
50
|
+
enabled: root.manageIpc && root.ipcTarget !== ""
|
|
51
|
+
target: root.ipcTarget
|
|
52
|
+
|
|
53
|
+
function open(): void { root.open() }
|
|
54
|
+
function close(): void { root.close() }
|
|
55
|
+
function show(): void { root.open() }
|
|
56
|
+
function hide(): void { root.close() }
|
|
57
|
+
function toggle(): void { root.toggle() }
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import QtQuick
|
|
2
|
+
import qs.Commons
|
|
3
|
+
import qs.Commons as Commons
|
|
4
|
+
|
|
5
|
+
// Small (22×22 by default) icon button used at the right edge of panel rows
|
|
6
|
+
// for inline actions — forget network, confirm passphrase, unpair device,
|
|
7
|
+
// etc. Two visual modes are supported via `hoverColor`:
|
|
8
|
+
// - default: hoverColor === foreground → subtle foreground-tint hover
|
|
9
|
+
// - urgent: hoverColor === bar.urgent → red-tint hover for destructive
|
|
10
|
+
// actions like forget/unpair
|
|
11
|
+
//
|
|
12
|
+
// `enabled` gates clicks and dims the icon. The component owns its own
|
|
13
|
+
// hover state visuals; mouse hover does NOT update any panel cursor state
|
|
14
|
+
// here because action buttons are not cursor targets — the row they live
|
|
15
|
+
// in is.
|
|
16
|
+
//
|
|
17
|
+
// Set `focusable: true` to make the button keyboard-tabbable with the
|
|
18
|
+
// shared hover-cursor/focus tokens. Use this
|
|
19
|
+
// in form contexts where Tab walks a list
|
|
20
|
+
// of controls; leave it false for the right-edge actions on panel rows
|
|
21
|
+
// where the row's CursorSurface owns the keyboard cursor.
|
|
22
|
+
//
|
|
23
|
+
// Set `hasCursor: true` to have the button render the same hover state as
|
|
24
|
+
// mouse hover — so a panel's keyboard cursor lands on it identically.
|
|
25
|
+
// Use this when a PanelActionButton is itself the cursor target (rather
|
|
26
|
+
// than living inside a CursorSurface row). Emits `hovered(bool)` on
|
|
27
|
+
// pointer enter/leave so the panel can update its cursor state to match.
|
|
28
|
+
BorderSurface {
|
|
29
|
+
id: root
|
|
30
|
+
|
|
31
|
+
property string iconText: ""
|
|
32
|
+
property string tooltipText: ""
|
|
33
|
+
property color foreground: Commons.Color.foreground
|
|
34
|
+
property color hoverColor: foreground
|
|
35
|
+
property string fontFamily: Style.font.family
|
|
36
|
+
property real fontSize: Style.font.icon
|
|
37
|
+
// Whole and odd, so an icon glyph (usually an odd number of pixels wide)
|
|
38
|
+
// has the same space on both sides instead of one pixel more on one side.
|
|
39
|
+
property real size: Math.round(Math.max(Style.space(22), fontSize + Style.spacing.sm * 2)) | 1
|
|
40
|
+
|
|
41
|
+
property bool focusable: false
|
|
42
|
+
property bool hasCursor: false
|
|
43
|
+
property bool bordered: false
|
|
44
|
+
|
|
45
|
+
signal clicked()
|
|
46
|
+
signal hovered(bool isHovered)
|
|
47
|
+
|
|
48
|
+
activeFocusOnTab: focusable
|
|
49
|
+
Keys.onReturnPressed: if (focusable) root.clicked()
|
|
50
|
+
Keys.onEnterPressed: if (focusable) root.clicked()
|
|
51
|
+
Keys.onSpacePressed: if (focusable) root.clicked()
|
|
52
|
+
|
|
53
|
+
implicitWidth: size
|
|
54
|
+
implicitHeight: size
|
|
55
|
+
radius: Style.cornerRadius
|
|
56
|
+
|
|
57
|
+
readonly property bool _showFocusRing: focusable && activeFocus
|
|
58
|
+
readonly property bool _hot: (mouse.containsMouse || root.hasCursor) && root.enabled
|
|
59
|
+
readonly property var _borderSpec: _showFocusRing
|
|
60
|
+
? Border.controlSpec("focus", hoverColor, hoverColor)
|
|
61
|
+
: (_hot && bordered
|
|
62
|
+
? Border.controlSpec("hover-cursor", hoverColor, hoverColor)
|
|
63
|
+
: (bordered ? Border.controlSpec("normal", foreground, Commons.Color.accent) : Border.none()))
|
|
64
|
+
|
|
65
|
+
color: _showFocusRing
|
|
66
|
+
? Style.focusFillFor(hoverColor, hoverColor)
|
|
67
|
+
: (_hot
|
|
68
|
+
? Style.hoverFillFor(hoverColor, hoverColor)
|
|
69
|
+
: "transparent")
|
|
70
|
+
borderSpec: _borderSpec
|
|
71
|
+
|
|
72
|
+
Behavior on color { ColorAnimation { duration: Style.duration(60) } }
|
|
73
|
+
|
|
74
|
+
Text {
|
|
75
|
+
textFormat: Text.PlainText
|
|
76
|
+
// Snap to whole pixels so the glyph doesn't round away from the fill's center.
|
|
77
|
+
x: Math.round((root.width - width) / 2)
|
|
78
|
+
y: Math.round((root.height - height) / 2)
|
|
79
|
+
text: root.iconText
|
|
80
|
+
color: root.enabled
|
|
81
|
+
? (root._hot ? root.hoverColor : root.foreground)
|
|
82
|
+
: Qt.darker(root.foreground, 2.0)
|
|
83
|
+
font.family: root.fontFamily
|
|
84
|
+
font.pixelSize: root.fontSize
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
MouseArea {
|
|
88
|
+
id: mouse
|
|
89
|
+
anchors.fill: parent
|
|
90
|
+
hoverEnabled: true
|
|
91
|
+
cursorShape: root.enabled ? Qt.PointingHandCursor : Qt.ArrowCursor
|
|
92
|
+
enabled: root.enabled
|
|
93
|
+
onContainsMouseChanged: root.hovered(containsMouse)
|
|
94
|
+
onClicked: {
|
|
95
|
+
if (root.focusable) root.forceActiveFocus()
|
|
96
|
+
root.clicked()
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
PanelToolTip {
|
|
101
|
+
visible: root.tooltipText !== "" && mouse.containsMouse
|
|
102
|
+
text: root.tooltipText
|
|
103
|
+
fontFamily: root.fontFamily
|
|
104
|
+
}
|
|
105
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import QtQuick
|
|
2
|
+
// Stores the open state for a shell panel. Panel owns the public lifecycle
|
|
3
|
+
// methods and IPC wiring; this object only keeps state separate from the
|
|
4
|
+
// panel implementation's own properties.
|
|
5
|
+
//
|
|
6
|
+
// Usage:
|
|
7
|
+
// PanelController { id: panelController }
|
|
8
|
+
QtObject {
|
|
9
|
+
id: root
|
|
10
|
+
|
|
11
|
+
property bool open: false
|
|
12
|
+
|
|
13
|
+
function toggle() { open = !open }
|
|
14
|
+
function show() { if (!open) open = true }
|
|
15
|
+
function hide() { open = false }
|
|
16
|
+
}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import QtQuick
|
|
2
|
+
import qs.Commons
|
|
3
|
+
import qs.Commons as Commons
|
|
4
|
+
|
|
5
|
+
Item {
|
|
6
|
+
id: root
|
|
7
|
+
|
|
8
|
+
property Component iconComponent: null
|
|
9
|
+
property string title: ""
|
|
10
|
+
property string meta: ""
|
|
11
|
+
property string detail: ""
|
|
12
|
+
property color foreground: Commons.Color.foreground
|
|
13
|
+
property string fontFamily: Style.font.family
|
|
14
|
+
property real iconSize: Style.font.display
|
|
15
|
+
property real iconOpacity: 1.0
|
|
16
|
+
property alias metaOpacity: metaText.opacity
|
|
17
|
+
|
|
18
|
+
// Optional control pinned to the trailing edge of the hero — a ToggleSwitch,
|
|
19
|
+
// a small button. The hero centers it against the labels and reserves the
|
|
20
|
+
// space itself, so callers never do the geometry.
|
|
21
|
+
property Component trailingControl: null
|
|
22
|
+
|
|
23
|
+
readonly property color dim: Qt.darker(foreground, 1.4)
|
|
24
|
+
readonly property real trailingInset: trailingLoader.item && trailingLoader.item.visible ? trailingLoader.width + Style.space(12) : 0
|
|
25
|
+
|
|
26
|
+
width: parent ? parent.width : implicitWidth
|
|
27
|
+
implicitHeight: Math.max(iconLoader.implicitHeight, heroLabels.implicitHeight, trailingLoader.implicitHeight)
|
|
28
|
+
|
|
29
|
+
Loader {
|
|
30
|
+
id: iconLoader
|
|
31
|
+
sourceComponent: root.iconComponent
|
|
32
|
+
anchors.left: parent.left
|
|
33
|
+
anchors.verticalCenter: parent.verticalCenter
|
|
34
|
+
opacity: root.iconOpacity
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
Column {
|
|
38
|
+
id: heroLabels
|
|
39
|
+
anchors.left: iconLoader.right
|
|
40
|
+
anchors.leftMargin: Style.space(14)
|
|
41
|
+
anchors.right: parent.right
|
|
42
|
+
anchors.rightMargin: root.trailingInset
|
|
43
|
+
anchors.verticalCenter: parent.verticalCenter
|
|
44
|
+
spacing: Style.space(2)
|
|
45
|
+
|
|
46
|
+
Row {
|
|
47
|
+
id: titleRow
|
|
48
|
+
visible: root.title !== "" || detailPill.visible
|
|
49
|
+
width: parent.width
|
|
50
|
+
|
|
51
|
+
Text {
|
|
52
|
+
textFormat: Text.PlainText
|
|
53
|
+
visible: root.title !== ""
|
|
54
|
+
text: root.title
|
|
55
|
+
width: Math.min(implicitWidth, Math.max(0, parent.width - (detailPill.visible ? detailPill.implicitWidth + Style.space(8) : 0)))
|
|
56
|
+
color: root.foreground
|
|
57
|
+
font.family: root.fontFamily
|
|
58
|
+
font.pixelSize: Style.font.title
|
|
59
|
+
font.bold: true
|
|
60
|
+
elide: Text.ElideRight
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
Item {
|
|
64
|
+
width: Math.max(0, parent.width - parent.children[0].width - detailPill.implicitWidth)
|
|
65
|
+
height: 1
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
BorderSurface {
|
|
69
|
+
id: detailPill
|
|
70
|
+
visible: root.detail !== ""
|
|
71
|
+
implicitWidth: detailText.implicitWidth + Style.space(10)
|
|
72
|
+
implicitHeight: detailText.implicitHeight + Style.space(4)
|
|
73
|
+
anchors.verticalCenter: parent.verticalCenter
|
|
74
|
+
color: "transparent"
|
|
75
|
+
borderSpec: Border.controlSpec("normal", root.foreground, Commons.Color.accent)
|
|
76
|
+
radius: Style.cornerRadius
|
|
77
|
+
|
|
78
|
+
Text {
|
|
79
|
+
id: detailText
|
|
80
|
+
textFormat: Text.PlainText
|
|
81
|
+
anchors.centerIn: parent
|
|
82
|
+
text: root.detail
|
|
83
|
+
color: root.dim
|
|
84
|
+
font.family: root.fontFamily
|
|
85
|
+
font.pixelSize: Style.font.body
|
|
86
|
+
font.bold: true
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
Text {
|
|
92
|
+
id: metaText
|
|
93
|
+
textFormat: Text.PlainText
|
|
94
|
+
width: parent.width
|
|
95
|
+
text: root.meta.toUpperCase()
|
|
96
|
+
visible: text !== ""
|
|
97
|
+
color: root.dim
|
|
98
|
+
font.family: root.fontFamily
|
|
99
|
+
font.pixelSize: Style.font.caption
|
|
100
|
+
font.bold: true
|
|
101
|
+
font.letterSpacing: 1.2
|
|
102
|
+
elide: Text.ElideRight
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
Loader {
|
|
107
|
+
id: trailingLoader
|
|
108
|
+
sourceComponent: root.trailingControl
|
|
109
|
+
anchors.right: parent.right
|
|
110
|
+
anchors.verticalCenter: parent.verticalCenter
|
|
111
|
+
}
|
|
112
|
+
}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import QtQuick
|
|
2
|
+
|
|
3
|
+
// Drop-in key dispatcher for keyboard-driven panels. Wraps panel content
|
|
4
|
+
// and emits semantic signals so each panel keeps its own state machine
|
|
5
|
+
// (focusSection, selectedIndex, action rules) while the boilerplate
|
|
6
|
+
// key handling lives here.
|
|
7
|
+
//
|
|
8
|
+
// Usage:
|
|
9
|
+
// Common.KeyboardPanel {
|
|
10
|
+
// ...
|
|
11
|
+
// PanelKeyCatcher {
|
|
12
|
+
// anchors.fill: parent
|
|
13
|
+
// onMoveRequested: function(dx, dy) { root.moveCursor(dx, dy) }
|
|
14
|
+
// onActivateRequested: root.activateCursor()
|
|
15
|
+
// onCloseRequested: root.close()
|
|
16
|
+
// onDeleteRequested: root.deleteSelected()
|
|
17
|
+
// onTextKey: function(t, modifiers) { if (t === "r") root.refresh() }
|
|
18
|
+
//
|
|
19
|
+
// Column { ... panel content ... }
|
|
20
|
+
// }
|
|
21
|
+
// }
|
|
22
|
+
//
|
|
23
|
+
// Keys.priority: Keys.BeforeItem means this handler gets keys first,
|
|
24
|
+
// even when a descendant has activeFocus. That's what lets Up/Down
|
|
25
|
+
// arrows drive the cursor instead of being consumed by an inner
|
|
26
|
+
// Flickable's built-in scroll handling. When a panel has an inline
|
|
27
|
+
// editor (wifi passphrase, gallery TextField demo) the panel must
|
|
28
|
+
// set `blocked: editor.activeFocus` so this handler short-circuits
|
|
29
|
+
// and the editor receives keys normally.
|
|
30
|
+
//
|
|
31
|
+
// blocked: when true, ALL keys are forwarded to descendants without
|
|
32
|
+
// triggering signals.
|
|
33
|
+
Item {
|
|
34
|
+
id: root
|
|
35
|
+
|
|
36
|
+
property bool blocked: false
|
|
37
|
+
// Panels that let items be reordered set this, and Ctrl+Up/Down (or
|
|
38
|
+
// Ctrl+k/j) then asks to move the current item instead of the cursor.
|
|
39
|
+
property bool reorderable: false
|
|
40
|
+
|
|
41
|
+
signal moveRequested(int dx, int dy)
|
|
42
|
+
signal reorderRequested(int dy)
|
|
43
|
+
signal activateRequested()
|
|
44
|
+
signal returnRequested()
|
|
45
|
+
signal closeRequested()
|
|
46
|
+
signal deleteRequested()
|
|
47
|
+
signal tabRequested(int direction)
|
|
48
|
+
// The held modifiers ride along, so a panel can tell Alt+T from T.
|
|
49
|
+
signal textKey(string text, int modifiers)
|
|
50
|
+
|
|
51
|
+
focus: true
|
|
52
|
+
Keys.priority: Keys.BeforeItem
|
|
53
|
+
Keys.onPressed: function(event) {
|
|
54
|
+
if (blocked) return
|
|
55
|
+
|
|
56
|
+
if (event.key === Qt.Key_Escape) {
|
|
57
|
+
closeRequested(); event.accepted = true; return
|
|
58
|
+
}
|
|
59
|
+
if (event.key === Qt.Key_Tab || event.key === Qt.Key_Backtab) {
|
|
60
|
+
tabRequested((event.modifiers & Qt.ShiftModifier) || event.key === Qt.Key_Backtab ? -1 : 1)
|
|
61
|
+
event.accepted = true
|
|
62
|
+
return
|
|
63
|
+
}
|
|
64
|
+
if (reorderable && (event.modifiers & Qt.ControlModifier)) {
|
|
65
|
+
var up = event.key === Qt.Key_Up || event.key === Qt.Key_K
|
|
66
|
+
var down = event.key === Qt.Key_Down || event.key === Qt.Key_J
|
|
67
|
+
if (up || down) {
|
|
68
|
+
reorderRequested(down ? 1 : -1); event.accepted = true; return
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
if (event.key === Qt.Key_Down || event.text === "j") {
|
|
72
|
+
moveRequested(0, 1); event.accepted = true; return
|
|
73
|
+
}
|
|
74
|
+
if (event.key === Qt.Key_Up || event.text === "k") {
|
|
75
|
+
moveRequested(0, -1); event.accepted = true; return
|
|
76
|
+
}
|
|
77
|
+
// In a mirrored (right-to-left) panel, Left moves forward along a row.
|
|
78
|
+
var right = event.key === Qt.Key_Right || event.text === "l"
|
|
79
|
+
var left = event.key === Qt.Key_Left || event.text === "h"
|
|
80
|
+
if (LayoutMirroring.enabled ? left : right) {
|
|
81
|
+
moveRequested(1, 0); event.accepted = true; return
|
|
82
|
+
}
|
|
83
|
+
if (LayoutMirroring.enabled ? right : left) {
|
|
84
|
+
moveRequested(-1, 0); event.accepted = true; return
|
|
85
|
+
}
|
|
86
|
+
if (event.key === Qt.Key_Return || event.key === Qt.Key_Enter) {
|
|
87
|
+
returnRequested()
|
|
88
|
+
activateRequested(); event.accepted = true; return
|
|
89
|
+
}
|
|
90
|
+
if (event.key === Qt.Key_Space) {
|
|
91
|
+
activateRequested(); event.accepted = true; return
|
|
92
|
+
}
|
|
93
|
+
if (event.key === Qt.Key_Delete || event.text === "x" || event.text === "X") {
|
|
94
|
+
deleteRequested(); event.accepted = true; return
|
|
95
|
+
}
|
|
96
|
+
if (event.text && event.text.length === 1) {
|
|
97
|
+
textKey(event.text, event.modifiers)
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import QtQuick
|
|
2
|
+
import qs.Commons
|
|
3
|
+
import qs.Commons as Commons
|
|
4
|
+
|
|
5
|
+
// Small-caps-style label that introduces a panel section ("DNS provider",
|
|
6
|
+
// "Wi-Fi networks", "Output device", "Paired devices"). Sits between a
|
|
7
|
+
// PanelSeparator and the content rows.
|
|
8
|
+
Text {
|
|
9
|
+
id: root
|
|
10
|
+
|
|
11
|
+
property color foreground: Commons.Color.foreground
|
|
12
|
+
property string fontFamily: Style.font.family
|
|
13
|
+
property real fontSize: Style.font.caption
|
|
14
|
+
|
|
15
|
+
// Callers bind `text` from outside this file, so the default has to be set
|
|
16
|
+
// here. AutoText would let a section title that happens to carry a device or
|
|
17
|
+
// network name promote itself to rich text.
|
|
18
|
+
textFormat: Text.PlainText
|
|
19
|
+
color: Qt.darker(foreground, 1.4)
|
|
20
|
+
font.family: fontFamily
|
|
21
|
+
font.pixelSize: fontSize
|
|
22
|
+
font.bold: true
|
|
23
|
+
|
|
24
|
+
// Glyphs can paint above the box Text reserves for them: JetBrainsMono Nerd
|
|
25
|
+
// Font's outlines run 10% of the em past its own ascent, and a patched or
|
|
26
|
+
// user-chosen family can be worse. That sliver is invisible in normal flow,
|
|
27
|
+
// but a header sitting at the top of a clipping list — bluetooth's device
|
|
28
|
+
// list, network's station list — loses it to the clip and renders beheaded.
|
|
29
|
+
// Reserve the overshoot here so every panel is covered at once.
|
|
30
|
+
topPadding: Math.ceil(fontSize * 0.15)
|
|
31
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import QtQuick
|
|
2
|
+
import qs.Commons
|
|
3
|
+
import qs.Commons as Commons
|
|
4
|
+
|
|
5
|
+
// 1px horizontal divider for panel sections. The alpha-on-foreground tint
|
|
6
|
+
// keeps the rule legible against the panel background without competing
|
|
7
|
+
// with text or borders.
|
|
8
|
+
Rectangle {
|
|
9
|
+
id: root
|
|
10
|
+
|
|
11
|
+
property color foreground: Commons.Color.foreground
|
|
12
|
+
property real strength: 0.12
|
|
13
|
+
|
|
14
|
+
width: parent ? parent.width : implicitWidth
|
|
15
|
+
implicitWidth: 100
|
|
16
|
+
implicitHeight: 1
|
|
17
|
+
height: 1
|
|
18
|
+
color: Qt.rgba(foreground.r, foreground.g, foreground.b, strength)
|
|
19
|
+
}
|