@genome-spy/core 0.73.0 → 0.74.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/dist/bundle/AbortablePromiseCache-3gHJdF3E.js +96 -0
- package/dist/bundle/browser-BTgw5ieH.js +126 -0
- package/dist/bundle/chunk-DmhlhrBa.js +11 -0
- package/dist/bundle/esm-BDFRLEuD.js +1248 -0
- package/dist/bundle/esm-BygJiwh0.js +573 -0
- package/dist/bundle/esm-CGX-qz1d.js +155 -0
- package/dist/bundle/esm-CgfVIRJ-.js +121 -0
- package/dist/bundle/esm-CuMSzCHy.js +298 -0
- package/dist/bundle/esm-DMXpJXM4.js +369 -0
- package/dist/bundle/esm-DQiq2Zhd.js +1426 -0
- package/dist/bundle/esm-DtE8VqAv.js +1015 -0
- package/dist/bundle/esm-sIoQYZ21.js +461 -0
- package/dist/bundle/index.es.js +21071 -25935
- package/dist/bundle/index.js +363 -379
- package/dist/bundle/parquetRead-DG_-F5j5.js +1609 -0
- package/dist/schema.json +13098 -7095
- package/dist/src/config/axisConfig.d.ts +16 -0
- package/dist/src/config/axisConfig.d.ts.map +1 -0
- package/dist/src/config/axisConfig.js +84 -0
- package/dist/src/config/defaultConfig.d.ts +3 -0
- package/dist/src/config/defaultConfig.d.ts.map +1 -0
- package/dist/src/config/defaultConfig.js +38 -0
- package/dist/src/config/defaults/axisDefaults.d.ts +5 -0
- package/dist/src/config/defaults/axisDefaults.d.ts.map +1 -0
- package/dist/src/config/defaults/axisDefaults.js +72 -0
- package/dist/src/config/defaults/markDefaults.d.ts +15 -0
- package/dist/src/config/defaults/markDefaults.d.ts.map +1 -0
- package/dist/src/config/defaults/markDefaults.js +121 -0
- package/dist/src/config/defaults/scaleDefaults.d.ts +5 -0
- package/dist/src/config/defaults/scaleDefaults.d.ts.map +1 -0
- package/dist/src/config/defaults/scaleDefaults.js +18 -0
- package/dist/src/config/defaults/titleDefaults.d.ts +5 -0
- package/dist/src/config/defaults/titleDefaults.d.ts.map +1 -0
- package/dist/src/config/defaults/titleDefaults.js +47 -0
- package/dist/src/config/defaults/viewDefaults.d.ts +3 -0
- package/dist/src/config/defaults/viewDefaults.d.ts.map +1 -0
- package/dist/src/config/defaults/viewDefaults.js +2 -0
- package/dist/src/config/markConfig.d.ts +8 -0
- package/dist/src/config/markConfig.d.ts.map +1 -0
- package/dist/src/config/markConfig.js +27 -0
- package/dist/src/config/mergeConfig.d.ts +8 -0
- package/dist/src/config/mergeConfig.d.ts.map +1 -0
- package/dist/src/config/mergeConfig.js +81 -0
- package/dist/src/config/resolveConfig.d.ts +22 -0
- package/dist/src/config/resolveConfig.d.ts.map +1 -0
- package/dist/src/config/resolveConfig.js +32 -0
- package/dist/src/config/scaleConfig.d.ts +40 -0
- package/dist/src/config/scaleConfig.d.ts.map +1 -0
- package/dist/src/config/scaleConfig.js +220 -0
- package/dist/src/config/styleUtils.d.ts +6 -0
- package/dist/src/config/styleUtils.d.ts.map +1 -0
- package/dist/src/config/styleUtils.js +10 -0
- package/dist/src/config/themes.d.ts +15 -0
- package/dist/src/config/themes.d.ts.map +1 -0
- package/dist/src/config/themes.js +293 -0
- package/dist/src/config/titleConfig.d.ts +12 -0
- package/dist/src/config/titleConfig.d.ts.map +1 -0
- package/dist/src/config/titleConfig.js +42 -0
- package/dist/src/config/viewConfig.d.ts +7 -0
- package/dist/src/config/viewConfig.d.ts.map +1 -0
- package/dist/src/config/viewConfig.js +29 -0
- package/dist/src/data/flowNode.d.ts +22 -1
- package/dist/src/data/flowNode.d.ts.map +1 -1
- package/dist/src/data/flowNode.js +37 -1
- package/dist/src/data/formats/bed.d.ts.map +1 -1
- package/dist/src/data/formats/bed.js +6 -1
- package/dist/src/data/formats/bedpe.d.ts.map +1 -1
- package/dist/src/data/formats/bedpe.js +4 -0
- package/dist/src/data/formats/fasta.d.ts.map +1 -1
- package/dist/src/data/formats/fasta.js +4 -0
- package/dist/src/data/formats/parquet.d.ts.map +1 -1
- package/dist/src/data/formats/parquet.js +4 -0
- package/dist/src/data/sources/dataSourceFactory.d.ts +2 -13
- package/dist/src/data/sources/dataSourceFactory.d.ts.map +1 -1
- package/dist/src/data/sources/dataSourceFactory.js +5 -141
- package/dist/src/data/sources/lazy/axisGenomeSource.d.ts.map +1 -1
- package/dist/src/data/sources/lazy/axisGenomeSource.js +11 -0
- package/dist/src/data/sources/lazy/axisTickSource.d.ts +1 -1
- package/dist/src/data/sources/lazy/axisTickSource.d.ts.map +1 -1
- package/dist/src/data/sources/lazy/axisTickSource.js +19 -8
- package/dist/src/data/sources/lazy/bamSource.d.ts.map +1 -1
- package/dist/src/data/sources/lazy/bamSource.js +11 -0
- package/dist/src/data/sources/lazy/bigBedSource.d.ts.map +1 -1
- package/dist/src/data/sources/lazy/bigBedSource.js +12 -1
- package/dist/src/data/sources/lazy/bigWigSource.d.ts.map +1 -1
- package/dist/src/data/sources/lazy/bigWigSource.js +11 -0
- package/dist/src/data/sources/lazy/gff3Source.d.ts.map +1 -1
- package/dist/src/data/sources/lazy/gff3Source.js +12 -1
- package/dist/src/data/sources/lazy/indexedFastaSource.d.ts.map +1 -1
- package/dist/src/data/sources/lazy/indexedFastaSource.js +11 -0
- package/dist/src/data/sources/lazy/lazyDataSourceRegistry.d.ts +27 -0
- package/dist/src/data/sources/lazy/lazyDataSourceRegistry.d.ts.map +1 -0
- package/dist/src/data/sources/lazy/lazyDataSourceRegistry.js +65 -0
- package/dist/src/data/sources/lazy/registerBuiltInLazySources.d.ts +2 -0
- package/dist/src/data/sources/lazy/registerBuiltInLazySources.d.ts.map +1 -0
- package/dist/src/data/sources/lazy/registerBuiltInLazySources.js +8 -0
- package/dist/src/data/sources/lazy/singleAxisLazySource.d.ts.map +1 -1
- package/dist/src/data/sources/lazy/singleAxisLazySource.js +11 -2
- package/dist/src/data/sources/lazy/vcfSource.d.ts.map +1 -1
- package/dist/src/data/sources/lazy/vcfSource.js +11 -0
- package/dist/src/data/sources/urlSource.d.ts.map +1 -1
- package/dist/src/data/sources/urlSource.js +5 -2
- package/dist/src/data/transforms/aggregate.d.ts +1 -0
- package/dist/src/data/transforms/aggregate.d.ts.map +1 -1
- package/dist/src/data/transforms/aggregate.js +30 -8
- package/dist/src/data/transforms/aggregateOps.d.ts.map +1 -1
- package/dist/src/data/transforms/aggregateOps.js +12 -1
- package/dist/src/data/transforms/coverage.js +2 -2
- package/dist/src/data/transforms/filter.js +1 -1
- package/dist/src/data/transforms/filterScoredLabels.d.ts +6 -0
- package/dist/src/data/transforms/filterScoredLabels.d.ts.map +1 -1
- package/dist/src/data/transforms/filterScoredLabels.js +9 -0
- package/dist/src/data/transforms/measureText.d.ts +1 -0
- package/dist/src/data/transforms/measureText.d.ts.map +1 -1
- package/dist/src/data/transforms/measureText.js +14 -5
- package/dist/src/data/transforms/pileup.d.ts.map +1 -1
- package/dist/src/data/transforms/pileup.js +1 -2
- package/dist/src/data/transforms/regexFold.d.ts.map +1 -1
- package/dist/src/data/transforms/regexFold.js +0 -1
- package/dist/src/embedFactory.d.ts +13 -0
- package/dist/src/embedFactory.d.ts.map +1 -0
- package/dist/src/embedFactory.js +127 -0
- package/dist/src/encoder/accessor.d.ts +3 -12
- package/dist/src/encoder/accessor.d.ts.map +1 -1
- package/dist/src/encoder/accessor.js +10 -65
- package/dist/src/encoder/encoder.d.ts +51 -8
- package/dist/src/encoder/encoder.d.ts.map +1 -1
- package/dist/src/encoder/encoder.js +179 -55
- package/dist/src/fonts/bmFontManager.js +1 -1
- package/dist/src/full.d.ts +2 -0
- package/dist/src/full.d.ts.map +1 -0
- package/dist/src/full.js +2 -0
- package/dist/src/genome/genome.d.ts +8 -0
- package/dist/src/genome/genome.d.ts.map +1 -1
- package/dist/src/genome/genome.js +16 -2
- package/dist/src/genome/genomeStore.js +1 -1
- package/dist/src/genome/rootGenomeConfig.d.ts.map +1 -1
- package/dist/src/genome/rootGenomeConfig.js +6 -2
- package/dist/src/genome/scaleLocus.d.ts.map +1 -1
- package/dist/src/genome/scaleLocus.js +26 -7
- package/dist/src/genomeSpy/cursorManager.d.ts +69 -0
- package/dist/src/genomeSpy/cursorManager.d.ts.map +1 -0
- package/dist/src/genomeSpy/cursorManager.js +131 -0
- package/dist/src/genomeSpy/headlessBootstrap.d.ts +113 -0
- package/dist/src/genomeSpy/headlessBootstrap.d.ts.map +1 -0
- package/dist/src/genomeSpy/headlessBootstrap.js +246 -0
- package/dist/src/genomeSpy/interactionController.d.ts +5 -0
- package/dist/src/genomeSpy/interactionController.d.ts.map +1 -1
- package/dist/src/genomeSpy/interactionController.js +212 -19
- package/dist/src/genomeSpy/interactionDispatcher.d.ts +50 -0
- package/dist/src/genomeSpy/interactionDispatcher.d.ts.map +1 -0
- package/dist/src/genomeSpy/interactionDispatcher.js +203 -0
- package/dist/src/genomeSpy/viewContextFactory.d.ts +4 -2
- package/dist/src/genomeSpy/viewContextFactory.d.ts.map +1 -1
- package/dist/src/genomeSpy/viewContextFactory.js +12 -4
- package/dist/src/genomeSpy/viewDataInit.d.ts.map +1 -1
- package/dist/src/genomeSpy/viewDataInit.js +7 -3
- package/dist/src/genomeSpy.d.ts +1 -124
- package/dist/src/genomeSpy.d.ts.map +1 -1
- package/dist/src/genomeSpy.js +7 -688
- package/dist/src/genomeSpyBase.d.ts +133 -0
- package/dist/src/genomeSpyBase.d.ts.map +1 -0
- package/dist/src/genomeSpyBase.js +719 -0
- package/dist/src/gl/arrayBuilder.d.ts.map +1 -1
- package/dist/src/gl/arrayBuilder.js +0 -3
- package/dist/src/gl/colorUtils.d.ts.map +1 -1
- package/dist/src/gl/colorUtils.js +3 -0
- package/dist/src/gl/dataToVertices.d.ts.map +1 -1
- package/dist/src/gl/dataToVertices.js +13 -8
- package/dist/src/gl/glslScaleGenerator.d.ts +2 -2
- package/dist/src/gl/glslScaleGenerator.d.ts.map +1 -1
- package/dist/src/gl/glslScaleGenerator.js +5 -7
- package/dist/src/index.d.ts +3 -9
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +5 -114
- package/dist/src/marks/__snapshots__/shaderSnapshot.test.js.snap +4462 -0
- package/dist/src/marks/link.d.ts.map +1 -1
- package/dist/src/marks/link.js +0 -23
- package/dist/src/marks/mark.d.ts +8 -1
- package/dist/src/marks/mark.d.ts.map +1 -1
- package/dist/src/marks/mark.js +61 -20
- package/dist/src/marks/markUtils.d.ts +18 -1
- package/dist/src/marks/markUtils.d.ts.map +1 -1
- package/dist/src/marks/markUtils.js +52 -4
- package/dist/src/marks/point.d.ts.map +1 -1
- package/dist/src/marks/point.js +6 -26
- package/dist/src/marks/rect.d.ts.map +1 -1
- package/dist/src/marks/rect.js +13 -21
- package/dist/src/marks/rule.d.ts +7 -2
- package/dist/src/marks/rule.d.ts.map +1 -1
- package/dist/src/marks/rule.js +125 -16
- package/dist/src/marks/text.d.ts.map +1 -1
- package/dist/src/marks/text.js +5 -47
- package/dist/src/minimal.d.ts +8 -0
- package/dist/src/minimal.d.ts.map +1 -0
- package/dist/src/minimal.js +21 -0
- package/dist/src/paramRuntime/viewParamRuntime.d.ts +19 -0
- package/dist/src/paramRuntime/viewParamRuntime.d.ts.map +1 -1
- package/dist/src/paramRuntime/viewParamRuntime.js +35 -0
- package/dist/src/scale/scale.d.ts.map +1 -1
- package/dist/src/scale/scale.js +13 -7
- package/dist/src/scales/axisResolution.d.ts.map +1 -1
- package/dist/src/scales/axisResolution.js +9 -5
- package/dist/src/scales/domainPlanner.d.ts +28 -8
- package/dist/src/scales/domainPlanner.d.ts.map +1 -1
- package/dist/src/scales/domainPlanner.js +207 -73
- package/dist/src/scales/indexLikeDomainUtils.d.ts +29 -0
- package/dist/src/scales/indexLikeDomainUtils.d.ts.map +1 -0
- package/dist/src/scales/indexLikeDomainUtils.js +67 -0
- package/dist/src/scales/resolutionMemberOrder.d.ts +15 -0
- package/dist/src/scales/resolutionMemberOrder.d.ts.map +1 -0
- package/dist/src/scales/resolutionMemberOrder.js +22 -0
- package/dist/src/scales/scaleInteractionController.d.ts.map +1 -1
- package/dist/src/scales/scaleInteractionController.js +43 -4
- package/dist/src/scales/scalePropsResolver.d.ts +3 -1
- package/dist/src/scales/scalePropsResolver.d.ts.map +1 -1
- package/dist/src/scales/scalePropsResolver.js +83 -6
- package/dist/src/scales/scaleResolution.d.ts +23 -0
- package/dist/src/scales/scaleResolution.d.ts.map +1 -1
- package/dist/src/scales/scaleResolution.js +220 -58
- package/dist/src/scales/scaleResolutionTestUtils.d.ts.map +1 -1
- package/dist/src/scales/scaleResolutionTestUtils.js +6 -2
- package/dist/src/scales/scaleRules.d.ts.map +1 -1
- package/dist/src/scales/scaleRules.js +16 -2
- package/dist/src/scales/selectionDomainUtils.d.ts +30 -0
- package/dist/src/scales/selectionDomainUtils.d.ts.map +1 -1
- package/dist/src/scales/selectionDomainUtils.js +116 -1
- package/dist/src/screenshotHarness.js +3 -4
- package/dist/src/spec/axis.d.ts +41 -30
- package/dist/src/spec/channel.d.ts +15 -9
- package/dist/src/spec/config.d.ts +264 -0
- package/dist/src/spec/data.d.ts +7 -0
- package/dist/src/spec/decoration.d.ts +51 -0
- package/dist/src/spec/exampleFiles.d.ts +12 -0
- package/dist/src/spec/exampleFiles.d.ts.map +1 -0
- package/dist/src/spec/exampleFiles.js +52 -0
- package/dist/src/spec/font.d.ts +1 -1
- package/dist/src/spec/mark.d.ts +97 -13
- package/dist/src/spec/parameter.d.ts +30 -10
- package/dist/src/spec/root.d.ts +14 -0
- package/dist/src/spec/scale.d.ts +18 -13
- package/dist/src/spec/title.d.ts +13 -2
- package/dist/src/spec/tooltip.d.ts +1 -1
- package/dist/src/spec/transform.d.ts +39 -4
- package/dist/src/spec/view.d.ts +67 -19
- package/dist/src/styles/genome-spy.css +55 -55
- package/dist/src/styles/genome-spy.css.d.ts +1 -1
- package/dist/src/styles/genome-spy.css.d.ts.map +1 -1
- package/dist/src/styles/genome-spy.css.js +23 -22
- package/dist/src/testSetup.d.ts +2 -0
- package/dist/src/testSetup.d.ts.map +1 -0
- package/dist/src/testSetup.js +5 -0
- package/dist/src/tooltip/dataTooltipHandler.js +8 -2
- package/dist/src/tooltip/tooltipContext.d.ts.map +1 -1
- package/dist/src/tooltip/tooltipContext.js +3 -2
- package/dist/src/types/embedApi.d.ts +7 -0
- package/dist/src/types/encoder.d.ts +17 -15
- package/dist/src/types/scaleResolutionApi.d.ts +20 -0
- package/dist/src/types/viewContext.d.ts +23 -1
- package/dist/src/utils/expression.d.ts +2 -2
- package/dist/src/utils/expression.d.ts.map +1 -1
- package/dist/src/utils/expression.js +63 -8
- package/dist/src/utils/field.d.ts.map +1 -1
- package/dist/src/utils/field.js +0 -1
- package/dist/src/utils/inertia.d.ts.map +1 -1
- package/dist/src/utils/inertia.js +0 -1
- package/dist/src/utils/inputBinding.d.ts +1 -1
- package/dist/src/utils/interaction.d.ts +109 -0
- package/dist/src/utils/interaction.d.ts.map +1 -0
- package/dist/src/utils/interaction.js +200 -0
- package/dist/src/utils/interactionEvent.d.ts +21 -42
- package/dist/src/utils/interactionEvent.d.ts.map +1 -1
- package/dist/src/utils/interactionEvent.js +43 -66
- package/dist/src/utils/kWayMerge.js +1 -1
- package/dist/src/utils/mergeObjects.d.ts.map +1 -1
- package/dist/src/utils/mergeObjects.js +0 -2
- package/dist/src/utils/radixSort.d.ts.map +1 -1
- package/dist/src/utils/radixSort.js +0 -2
- package/dist/src/utils/throttle.d.ts.map +1 -1
- package/dist/src/utils/throttle.js +0 -2
- package/dist/src/utils/ui/tooltip.d.ts +1 -0
- package/dist/src/utils/ui/tooltip.d.ts.map +1 -1
- package/dist/src/utils/ui/tooltip.js +1 -0
- package/dist/src/utils/url.js +1 -1
- package/dist/src/view/axisGridView.d.ts +1 -1
- package/dist/src/view/axisGridView.d.ts.map +1 -1
- package/dist/src/view/axisGridView.js +2 -47
- package/dist/src/view/axisView.d.ts +2 -3
- package/dist/src/view/axisView.d.ts.map +1 -1
- package/dist/src/view/axisView.js +251 -106
- package/dist/src/view/concatView.d.ts +2 -1
- package/dist/src/view/concatView.d.ts.map +1 -1
- package/dist/src/view/concatView.js +4 -2
- package/dist/src/view/containerMutationHelper.d.ts +3 -0
- package/dist/src/view/containerMutationHelper.d.ts.map +1 -1
- package/dist/src/view/containerMutationHelper.js +4 -1
- package/dist/src/view/facetView.d.ts +1 -1
- package/dist/src/view/facetView.js +3 -3
- package/dist/src/view/flowBuilder.js +2 -2
- package/dist/src/view/gridView/gridChild.d.ts +6 -0
- package/dist/src/view/gridView/gridChild.d.ts.map +1 -1
- package/dist/src/view/gridView/gridChild.js +72 -43
- package/dist/src/view/gridView/gridView.d.ts.map +1 -1
- package/dist/src/view/gridView/gridView.js +255 -101
- package/dist/src/view/gridView/keyboardZoomController.d.ts +2 -2
- package/dist/src/view/gridView/keyboardZoomController.d.ts.map +1 -1
- package/dist/src/view/gridView/keyboardZoomController.js +1 -1
- package/dist/src/view/gridView/scrollbar.d.ts.map +1 -1
- package/dist/src/view/gridView/scrollbar.js +4 -2
- package/dist/src/view/gridView/selectionRect.d.ts +4 -0
- package/dist/src/view/gridView/selectionRect.d.ts.map +1 -1
- package/dist/src/view/gridView/selectionRect.js +20 -1
- package/dist/src/view/gridView/separatorView.d.ts +1 -0
- package/dist/src/view/gridView/separatorView.d.ts.map +1 -1
- package/dist/src/view/gridView/separatorView.js +9 -0
- package/dist/src/view/interactionRouting.d.ts +20 -0
- package/dist/src/view/interactionRouting.d.ts.map +1 -0
- package/dist/src/view/interactionRouting.js +53 -0
- package/dist/src/view/layerView.d.ts.map +1 -1
- package/dist/src/view/layerView.js +12 -9
- package/dist/src/view/layout/grid.js +1 -1
- package/dist/src/view/renderingContext/bufferedViewRenderingContext.d.ts.map +1 -1
- package/dist/src/view/renderingContext/bufferedViewRenderingContext.js +0 -2
- package/dist/src/view/testUtils.d.ts +17 -3
- package/dist/src/view/testUtils.d.ts.map +1 -1
- package/dist/src/view/testUtils.js +62 -69
- package/dist/src/view/title.d.ts +8 -1
- package/dist/src/view/title.d.ts.map +1 -1
- package/dist/src/view/title.js +66 -76
- package/dist/src/view/unitView.d.ts +1 -1
- package/dist/src/view/unitView.d.ts.map +1 -1
- package/dist/src/view/unitView.js +67 -17
- package/dist/src/view/view.d.ts +76 -30
- package/dist/src/view/view.d.ts.map +1 -1
- package/dist/src/view/view.js +136 -47
- package/dist/src/view/viewFactory.d.ts +11 -3
- package/dist/src/view/viewFactory.d.ts.map +1 -1
- package/dist/src/view/viewFactory.js +37 -11
- package/dist/src/view/viewUtils.d.ts.map +1 -1
- package/dist/src/view/viewUtils.js +41 -5
- package/dist/src/view/zoom.d.ts +2 -2
- package/dist/src/view/zoom.d.ts.map +1 -1
- package/dist/src/view/zoom.js +21 -23
- package/package.json +18 -10
- package/dist/bundle/AbortablePromiseCache-Dj0vzLnp.js +0 -149
- package/dist/bundle/browser-0iNU5Wit.js +0 -138
- package/dist/bundle/index-BYsZN7b0.js +0 -1597
- package/dist/bundle/index-C3kClAEN.js +0 -1771
- package/dist/bundle/index-C7wOh6y1.js +0 -657
- package/dist/bundle/index-CRaQAuki.js +0 -326
- package/dist/bundle/index-D9v1PCj9.js +0 -507
- package/dist/bundle/index-GDOuv_D5.js +0 -266
- package/dist/bundle/index-Gt44EOIH.js +0 -628
- package/dist/bundle/inflate-GtwLkvSP.js +0 -1048
- package/dist/bundle/parquetRead-BnAGCa4_.js +0 -1663
- package/dist/bundle/unzip-Bac01w6X.js +0 -1492
- package/dist/src/config/scaleDefaults.d.ts +0 -8
- package/dist/src/config/scaleDefaults.d.ts.map +0 -1
- package/dist/src/config/scaleDefaults.js +0 -45
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
import UnitView from "../view/unitView.js";
|
|
2
2
|
import { VISIT_STOP } from "../view/view.js";
|
|
3
3
|
import { readPickingPixel } from "../gl/webGLHelper.js";
|
|
4
|
-
import InteractionEvent from "../utils/interactionEvent.js";
|
|
5
4
|
import Inertia, { makeEventTemplate } from "../utils/inertia.js";
|
|
6
5
|
import Point from "../view/layout/point.js";
|
|
7
6
|
import { isStillZooming } from "../view/zoom.js";
|
|
8
7
|
import createTooltipContext from "../tooltip/tooltipContext.js";
|
|
8
|
+
import { FREEZE_INTERACTION_CLASS_NAME } from "../utils/ui/tooltip.js";
|
|
9
|
+
import InteractionDispatcher from "./interactionDispatcher.js";
|
|
10
|
+
import CursorManager from "./cursorManager.js";
|
|
9
11
|
|
|
10
12
|
export default class InteractionController {
|
|
11
13
|
/** @type {import("../view/view.js").default} */
|
|
@@ -24,6 +26,10 @@ export default class InteractionController {
|
|
|
24
26
|
#renderPickingFramebuffer;
|
|
25
27
|
/** @type {() => number} */
|
|
26
28
|
#getDevicePixelRatio;
|
|
29
|
+
/** @type {InteractionDispatcher} */
|
|
30
|
+
#interactionDispatcher;
|
|
31
|
+
/** @type {CursorManager} */
|
|
32
|
+
#cursorManager;
|
|
27
33
|
/**
|
|
28
34
|
* @type {{ mark: import("../marks/mark.js").default, datum: import("../data/flowNode.js").Datum, uniqueId: number }}
|
|
29
35
|
*/
|
|
@@ -32,8 +38,14 @@ export default class InteractionController {
|
|
|
32
38
|
#wheelInertia;
|
|
33
39
|
/** @type {Point} */
|
|
34
40
|
#mouseDownCoords;
|
|
41
|
+
/** @type {Point | undefined} */
|
|
42
|
+
#lastPointerPoint;
|
|
35
43
|
/** @type {boolean} */
|
|
36
44
|
#tooltipUpdateRequested;
|
|
45
|
+
/** @type {number} */
|
|
46
|
+
#hoverTrackingSuspensionCount;
|
|
47
|
+
/** @type {boolean} */
|
|
48
|
+
#postRenderHoverRefreshRequested;
|
|
37
49
|
/**
|
|
38
50
|
* @param {object} options
|
|
39
51
|
* @param {import("../view/view.js").default} options.viewRoot
|
|
@@ -63,6 +75,8 @@ export default class InteractionController {
|
|
|
63
75
|
this.#tooltipHandlers = tooltipHandlers;
|
|
64
76
|
this.#renderPickingFramebuffer = renderPickingFramebuffer;
|
|
65
77
|
this.#getDevicePixelRatio = getDevicePixelRatio;
|
|
78
|
+
this.#interactionDispatcher = new InteractionDispatcher({ viewRoot });
|
|
79
|
+
this.#cursorManager = new CursorManager({ canvas: glHelper.canvas });
|
|
66
80
|
|
|
67
81
|
/**
|
|
68
82
|
* Currently hovered mark and datum
|
|
@@ -74,14 +88,72 @@ export default class InteractionController {
|
|
|
74
88
|
|
|
75
89
|
/** @type {Point} */
|
|
76
90
|
this.#mouseDownCoords = undefined;
|
|
91
|
+
this.#lastPointerPoint = undefined;
|
|
77
92
|
|
|
78
93
|
this.#tooltipUpdateRequested = false;
|
|
94
|
+
this.#hoverTrackingSuspensionCount = 0;
|
|
95
|
+
this.#postRenderHoverRefreshRequested = false;
|
|
79
96
|
}
|
|
80
97
|
|
|
81
98
|
getCurrentHover() {
|
|
82
99
|
return this.#currentHover;
|
|
83
100
|
}
|
|
84
101
|
|
|
102
|
+
suspendHoverTracking() {
|
|
103
|
+
this.#hoverTrackingSuspensionCount++;
|
|
104
|
+
this.#tooltip.clear();
|
|
105
|
+
this.#tooltipUpdateRequested = false;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* @param {MouseEvent} [mouseEvent]
|
|
110
|
+
*/
|
|
111
|
+
resumeHoverTracking(mouseEvent) {
|
|
112
|
+
if (this.#hoverTrackingSuspensionCount <= 0) {
|
|
113
|
+
return;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
this.#hoverTrackingSuspensionCount--;
|
|
117
|
+
if (this.#hoverTrackingSuspensionCount > 0) {
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
this.#tooltip.clear();
|
|
122
|
+
this.#tooltipUpdateRequested = false;
|
|
123
|
+
|
|
124
|
+
if (this.#isInteractionFrozen()) {
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
if (mouseEvent) {
|
|
129
|
+
const point = this.#toCanvasPoint(mouseEvent);
|
|
130
|
+
this.#lastPointerPoint = point;
|
|
131
|
+
if (this.#isInsideCanvas(point)) {
|
|
132
|
+
this.#refreshHover(point);
|
|
133
|
+
this.#cursorManager.update({
|
|
134
|
+
target: this.#interactionDispatcher.getCurrentTarget(),
|
|
135
|
+
hover: this.#currentHover,
|
|
136
|
+
});
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
this.#interactionDispatcher.handlePointerLeave(mouseEvent);
|
|
141
|
+
} else if (
|
|
142
|
+
this.#lastPointerPoint &&
|
|
143
|
+
this.#isInsideCanvas(this.#lastPointerPoint)
|
|
144
|
+
) {
|
|
145
|
+
this.#refreshHover(this.#lastPointerPoint);
|
|
146
|
+
this.#cursorManager.update({
|
|
147
|
+
target: this.#interactionDispatcher.getCurrentTarget(),
|
|
148
|
+
hover: this.#currentHover,
|
|
149
|
+
});
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
this.#currentHover = null;
|
|
154
|
+
this.#cursorManager.clear();
|
|
155
|
+
}
|
|
156
|
+
|
|
85
157
|
registerInteractionEvents() {
|
|
86
158
|
const canvas = this.#glHelper.canvas;
|
|
87
159
|
|
|
@@ -93,17 +165,26 @@ export default class InteractionController {
|
|
|
93
165
|
/**
|
|
94
166
|
* @param {Point} point
|
|
95
167
|
* @param {import("../utils/interactionEvent.js").InteractionUiEvent} uiEvent
|
|
96
|
-
* @returns {
|
|
168
|
+
* @returns {import("../utils/interaction.js").default}
|
|
97
169
|
*/
|
|
98
|
-
const
|
|
99
|
-
const
|
|
100
|
-
|
|
170
|
+
const dispatchInteraction = (point, uiEvent) => {
|
|
171
|
+
const interaction = this.#interactionDispatcher.dispatch(
|
|
172
|
+
point,
|
|
173
|
+
uiEvent
|
|
174
|
+
);
|
|
101
175
|
|
|
102
176
|
if (!this.#tooltipUpdateRequested) {
|
|
103
177
|
this.#tooltip.clear();
|
|
104
178
|
}
|
|
105
179
|
|
|
106
|
-
|
|
180
|
+
if (uiEvent instanceof MouseEvent && uiEvent.type !== "mouseout") {
|
|
181
|
+
this.#cursorManager.update({
|
|
182
|
+
target: interaction.target,
|
|
183
|
+
hover: this.#currentHover,
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
return interaction;
|
|
107
188
|
};
|
|
108
189
|
|
|
109
190
|
/** @param {Event} event */
|
|
@@ -112,13 +193,21 @@ export default class InteractionController {
|
|
|
112
193
|
const wheeling = now - lastWheelEvent < 200;
|
|
113
194
|
|
|
114
195
|
if (event instanceof MouseEvent) {
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
196
|
+
if (
|
|
197
|
+
event.type !== "contextmenu" &&
|
|
198
|
+
this.#isInteractionFrozen()
|
|
199
|
+
) {
|
|
200
|
+
return;
|
|
201
|
+
}
|
|
120
202
|
|
|
121
|
-
|
|
203
|
+
const point = this.#toCanvasPoint(event);
|
|
204
|
+
this.#lastPointerPoint = point;
|
|
205
|
+
|
|
206
|
+
if (
|
|
207
|
+
event.type == "mousemove" &&
|
|
208
|
+
!wheeling &&
|
|
209
|
+
this.#hoverTrackingSuspensionCount === 0
|
|
210
|
+
) {
|
|
122
211
|
this.#tooltip.handleMouseMove(event);
|
|
123
212
|
this.#tooltipUpdateRequested = false;
|
|
124
213
|
|
|
@@ -135,7 +224,7 @@ export default class InteractionController {
|
|
|
135
224
|
* @param {MouseEvent} dispatchedEvent
|
|
136
225
|
*/
|
|
137
226
|
const dispatchEvent = (dispatchedEvent) => {
|
|
138
|
-
|
|
227
|
+
dispatchInteraction(point, dispatchedEvent);
|
|
139
228
|
};
|
|
140
229
|
|
|
141
230
|
if (event.type != "wheel") {
|
|
@@ -174,7 +263,7 @@ export default class InteractionController {
|
|
|
174
263
|
// wheel ownership without running real wheel side
|
|
175
264
|
// effects first. Inertia is layered on top of that
|
|
176
265
|
// decision and is not the reason for the probe.
|
|
177
|
-
const probeEvent =
|
|
266
|
+
const probeEvent = dispatchInteraction(point, {
|
|
178
267
|
type: "wheelclaimprobe",
|
|
179
268
|
});
|
|
180
269
|
|
|
@@ -239,7 +328,17 @@ export default class InteractionController {
|
|
|
239
328
|
this.#mouseDownCoords?.subtract(Point.fromMouseEvent(event))
|
|
240
329
|
.length < 3
|
|
241
330
|
) {
|
|
242
|
-
|
|
331
|
+
const interaction = dispatchInteraction(point, event);
|
|
332
|
+
|
|
333
|
+
if (
|
|
334
|
+
event.type == "dblclick" &&
|
|
335
|
+
this.#hoverTrackingSuspensionCount === 0 &&
|
|
336
|
+
this.#isInsideCanvas(point)
|
|
337
|
+
) {
|
|
338
|
+
this.#scheduleHoverRefreshAfterRender();
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
return interaction;
|
|
243
342
|
}
|
|
244
343
|
}
|
|
245
344
|
};
|
|
@@ -313,7 +412,7 @@ export default class InteractionController {
|
|
|
313
412
|
zDelta
|
|
314
413
|
) => {
|
|
315
414
|
const point = toCanvasPoint(x, y);
|
|
316
|
-
|
|
415
|
+
dispatchInteraction(point, {
|
|
317
416
|
type: "touchgesture",
|
|
318
417
|
phase,
|
|
319
418
|
pointerCount,
|
|
@@ -428,7 +527,10 @@ export default class InteractionController {
|
|
|
428
527
|
document.addEventListener(
|
|
429
528
|
"mouseup",
|
|
430
529
|
() => this.#tooltip.popEnabledState(),
|
|
431
|
-
{
|
|
530
|
+
{
|
|
531
|
+
once: true,
|
|
532
|
+
capture: true,
|
|
533
|
+
}
|
|
432
534
|
);
|
|
433
535
|
this.#tooltip.pushEnabledState(false);
|
|
434
536
|
};
|
|
@@ -454,12 +556,103 @@ export default class InteractionController {
|
|
|
454
556
|
event.stopPropagation()
|
|
455
557
|
);
|
|
456
558
|
|
|
457
|
-
canvas.addEventListener("mouseout", () => {
|
|
559
|
+
canvas.addEventListener("mouseout", (event) => {
|
|
560
|
+
if (this.#isInteractionFrozen()) {
|
|
561
|
+
return;
|
|
562
|
+
}
|
|
563
|
+
|
|
564
|
+
if (this.#hoverTrackingSuspensionCount > 0) {
|
|
565
|
+
this.#tooltip.clear();
|
|
566
|
+
this.#tooltipUpdateRequested = false;
|
|
567
|
+
return;
|
|
568
|
+
}
|
|
569
|
+
|
|
570
|
+
this.#interactionDispatcher.handlePointerLeave(
|
|
571
|
+
/** @type {MouseEvent} */ (event)
|
|
572
|
+
);
|
|
573
|
+
this.#cursorManager.clear();
|
|
458
574
|
this.#tooltip.clear();
|
|
459
575
|
this.#currentHover = null;
|
|
460
576
|
});
|
|
461
577
|
}
|
|
462
578
|
|
|
579
|
+
/**
|
|
580
|
+
* @param {MouseEvent} event
|
|
581
|
+
*/
|
|
582
|
+
#toCanvasPoint(event) {
|
|
583
|
+
const canvas = this.#glHelper.canvas;
|
|
584
|
+
const rect = canvas.getBoundingClientRect();
|
|
585
|
+
return new Point(
|
|
586
|
+
event.clientX - rect.left - canvas.clientLeft,
|
|
587
|
+
event.clientY - rect.top - canvas.clientTop
|
|
588
|
+
);
|
|
589
|
+
}
|
|
590
|
+
|
|
591
|
+
/**
|
|
592
|
+
* @param {Point} point
|
|
593
|
+
*/
|
|
594
|
+
#isInsideCanvas(point) {
|
|
595
|
+
const canvas = this.#glHelper.canvas;
|
|
596
|
+
return (
|
|
597
|
+
point.x >= 0 &&
|
|
598
|
+
point.y >= 0 &&
|
|
599
|
+
point.x <= canvas.clientWidth &&
|
|
600
|
+
point.y <= canvas.clientHeight
|
|
601
|
+
);
|
|
602
|
+
}
|
|
603
|
+
|
|
604
|
+
/**
|
|
605
|
+
* @param {Point} point
|
|
606
|
+
*/
|
|
607
|
+
#refreshHover(point) {
|
|
608
|
+
if (!isStillZooming()) {
|
|
609
|
+
this.#renderPickingFramebuffer();
|
|
610
|
+
this.#handlePicking(point.x, point.y);
|
|
611
|
+
}
|
|
612
|
+
}
|
|
613
|
+
|
|
614
|
+
#scheduleHoverRefreshAfterRender() {
|
|
615
|
+
if (this.#postRenderHoverRefreshRequested) {
|
|
616
|
+
return;
|
|
617
|
+
}
|
|
618
|
+
|
|
619
|
+
this.#postRenderHoverRefreshRequested = true;
|
|
620
|
+
this.#animator.requestRender();
|
|
621
|
+
window.requestAnimationFrame(() => {
|
|
622
|
+
this.#postRenderHoverRefreshRequested = false;
|
|
623
|
+
|
|
624
|
+
if (
|
|
625
|
+
this.#hoverTrackingSuspensionCount > 0 ||
|
|
626
|
+
this.#isInteractionFrozen()
|
|
627
|
+
) {
|
|
628
|
+
return;
|
|
629
|
+
}
|
|
630
|
+
|
|
631
|
+
const point = this.#lastPointerPoint;
|
|
632
|
+
if (!point || !this.#isInsideCanvas(point)) {
|
|
633
|
+
this.#currentHover = null;
|
|
634
|
+
this.#cursorManager.clear();
|
|
635
|
+
return;
|
|
636
|
+
}
|
|
637
|
+
|
|
638
|
+
this.#tooltip.clear();
|
|
639
|
+
this.#tooltipUpdateRequested = false;
|
|
640
|
+
this.#refreshHover(point);
|
|
641
|
+
this.#cursorManager.update({
|
|
642
|
+
target: this.#interactionDispatcher.getCurrentTarget(),
|
|
643
|
+
hover: this.#currentHover,
|
|
644
|
+
});
|
|
645
|
+
});
|
|
646
|
+
}
|
|
647
|
+
|
|
648
|
+
#isInteractionFrozen() {
|
|
649
|
+
return (
|
|
650
|
+
typeof document !== "undefined" &&
|
|
651
|
+
!!document.body &&
|
|
652
|
+
document.body.classList.contains(FREEZE_INTERACTION_CLASS_NAME)
|
|
653
|
+
);
|
|
654
|
+
}
|
|
655
|
+
|
|
463
656
|
/**
|
|
464
657
|
* @param {number} x
|
|
465
658
|
* @param {number} y
|
|
@@ -520,7 +713,7 @@ export default class InteractionController {
|
|
|
520
713
|
|
|
521
714
|
const tooltipProps = mark.properties.tooltip;
|
|
522
715
|
|
|
523
|
-
if (tooltipProps !== null) {
|
|
716
|
+
if (tooltipProps !== null && tooltipProps !== false) {
|
|
524
717
|
const handlerName = tooltipProps?.handler ?? "default";
|
|
525
718
|
const handler = this.#tooltipHandlers[handlerName];
|
|
526
719
|
if (!handler) {
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dispatches `Interaction` objects through the view hierarchy and synthesizes
|
|
3
|
+
* subtree-level pointer transition events.
|
|
4
|
+
*
|
|
5
|
+
* The dispatcher keeps track of the previously hovered target path and
|
|
6
|
+
* compares it with the current one on every `mousemove`. From that diff it
|
|
7
|
+
* emits:
|
|
8
|
+
* - `mouseleave` for views that are no longer in the pointed subtree
|
|
9
|
+
* - `mouseenter` for views that have newly entered the pointed subtree
|
|
10
|
+
*
|
|
11
|
+
* This is intentionally closer to `mouseenter` / `mouseleave` semantics than
|
|
12
|
+
* DOM `mouseover` / `mouseout`. Moving between descendants inside the same
|
|
13
|
+
* subtree does not cause the ancestor to leave and re-enter.
|
|
14
|
+
*
|
|
15
|
+
* `dispatch()` handles ordinary event propagation and updates the current
|
|
16
|
+
* pointed target. `handlePointerLeave()` is used when the pointer leaves the
|
|
17
|
+
* canvas entirely, in which case the dispatcher emits `mouseleave` for the
|
|
18
|
+
* whole previously hovered path and clears its tracked state.
|
|
19
|
+
*
|
|
20
|
+
* The dispatcher does not do hit testing itself. It relies on views to route
|
|
21
|
+
* the incoming interaction and set `interaction.target` during propagation.
|
|
22
|
+
*/
|
|
23
|
+
export default class InteractionDispatcher {
|
|
24
|
+
/**
|
|
25
|
+
* @param {object} options
|
|
26
|
+
* @param {import("../view/view.js").default} options.viewRoot
|
|
27
|
+
*/
|
|
28
|
+
constructor({ viewRoot }: {
|
|
29
|
+
viewRoot: import("../view/view.js").default;
|
|
30
|
+
});
|
|
31
|
+
/**
|
|
32
|
+
* Dispatches an interaction through the view tree and updates the tracked
|
|
33
|
+
* hover path for transition synthesis.
|
|
34
|
+
*
|
|
35
|
+
* @param {import("../view/layout/point.js").default} point
|
|
36
|
+
* @param {import("../utils/interactionEvent.js").InteractionUiEvent} uiEvent
|
|
37
|
+
* @returns {Interaction}
|
|
38
|
+
*/
|
|
39
|
+
dispatch(point: import("../view/layout/point.js").default, uiEvent: import("../utils/interactionEvent.js").InteractionUiEvent): Interaction;
|
|
40
|
+
/**
|
|
41
|
+
* Dispatches mouseleave transitions when the pointer leaves the canvas.
|
|
42
|
+
*
|
|
43
|
+
* @param {import("../utils/interactionEvent.js").InteractionUiEvent} uiEvent
|
|
44
|
+
*/
|
|
45
|
+
handlePointerLeave(uiEvent: import("../utils/interactionEvent.js").InteractionUiEvent): void;
|
|
46
|
+
getCurrentTarget(): import("../view/view.js").default<import("../spec/view.js").ViewSpec>;
|
|
47
|
+
#private;
|
|
48
|
+
}
|
|
49
|
+
import Interaction from "../utils/interaction.js";
|
|
50
|
+
//# sourceMappingURL=interactionDispatcher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interactionDispatcher.d.ts","sourceRoot":"","sources":["../../../src/genomeSpy/interactionDispatcher.js"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH;IAUI;;;OAGG;IACH,0BAFG;QAAmD,QAAQ,EAAnD,OAAO,iBAAiB,EAAE,OAAO;KAC3C,EAGA;IAED;;;;;;;OAOG;IACH,gBAJW,OAAO,yBAAyB,EAAE,OAAO,WACzC,OAAO,8BAA8B,EAAE,kBAAkB,GACvD,WAAW,CAavB;IAED;;;;OAIG;IACH,4BAFW,OAAO,8BAA8B,EAAE,kBAAkB,QAiBnE;IAED,0FAEC;;CAmHJ;wBA1MuB,yBAAyB"}
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
import Interaction from "../utils/interaction.js";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Dispatches `Interaction` objects through the view hierarchy and synthesizes
|
|
5
|
+
* subtree-level pointer transition events.
|
|
6
|
+
*
|
|
7
|
+
* The dispatcher keeps track of the previously hovered target path and
|
|
8
|
+
* compares it with the current one on every `mousemove`. From that diff it
|
|
9
|
+
* emits:
|
|
10
|
+
* - `mouseleave` for views that are no longer in the pointed subtree
|
|
11
|
+
* - `mouseenter` for views that have newly entered the pointed subtree
|
|
12
|
+
*
|
|
13
|
+
* This is intentionally closer to `mouseenter` / `mouseleave` semantics than
|
|
14
|
+
* DOM `mouseover` / `mouseout`. Moving between descendants inside the same
|
|
15
|
+
* subtree does not cause the ancestor to leave and re-enter.
|
|
16
|
+
*
|
|
17
|
+
* `dispatch()` handles ordinary event propagation and updates the current
|
|
18
|
+
* pointed target. `handlePointerLeave()` is used when the pointer leaves the
|
|
19
|
+
* canvas entirely, in which case the dispatcher emits `mouseleave` for the
|
|
20
|
+
* whole previously hovered path and clears its tracked state.
|
|
21
|
+
*
|
|
22
|
+
* The dispatcher does not do hit testing itself. It relies on views to route
|
|
23
|
+
* the incoming interaction and set `interaction.target` during propagation.
|
|
24
|
+
*/
|
|
25
|
+
export default class InteractionDispatcher {
|
|
26
|
+
/** @type {import("../view/view.js").default} */
|
|
27
|
+
#viewRoot;
|
|
28
|
+
/** @type {import("../view/layout/point.js").default | undefined} */
|
|
29
|
+
#lastPoint;
|
|
30
|
+
/** @type {import("../view/view.js").default | undefined} */
|
|
31
|
+
#lastTarget;
|
|
32
|
+
/** @type {import("../view/view.js").default[]} */
|
|
33
|
+
#previousPath = [];
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* @param {object} options
|
|
37
|
+
* @param {import("../view/view.js").default} options.viewRoot
|
|
38
|
+
*/
|
|
39
|
+
constructor({ viewRoot }) {
|
|
40
|
+
this.#viewRoot = viewRoot;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Dispatches an interaction through the view tree and updates the tracked
|
|
45
|
+
* hover path for transition synthesis.
|
|
46
|
+
*
|
|
47
|
+
* @param {import("../view/layout/point.js").default} point
|
|
48
|
+
* @param {import("../utils/interactionEvent.js").InteractionUiEvent} uiEvent
|
|
49
|
+
* @returns {Interaction}
|
|
50
|
+
*/
|
|
51
|
+
dispatch(point, uiEvent) {
|
|
52
|
+
this.#lastPoint = point;
|
|
53
|
+
const interaction = new Interaction(point, uiEvent);
|
|
54
|
+
this.#viewRoot.propagateInteraction(interaction);
|
|
55
|
+
this.#lastTarget = interaction.target;
|
|
56
|
+
|
|
57
|
+
if (interaction.type === "mousemove") {
|
|
58
|
+
this.#dispatchPointerTransitions(interaction);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
return interaction;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Dispatches mouseleave transitions when the pointer leaves the canvas.
|
|
66
|
+
*
|
|
67
|
+
* @param {import("../utils/interactionEvent.js").InteractionUiEvent} uiEvent
|
|
68
|
+
*/
|
|
69
|
+
handlePointerLeave(uiEvent) {
|
|
70
|
+
if (!this.#lastPoint || this.#previousPath.length === 0) {
|
|
71
|
+
this.#previousPath = [];
|
|
72
|
+
this.#lastTarget = undefined;
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
const interaction = new Interaction(
|
|
77
|
+
this.#lastPoint,
|
|
78
|
+
uiEvent,
|
|
79
|
+
"mouseleave"
|
|
80
|
+
);
|
|
81
|
+
this.#dispatchLeaveEvents(interaction, this.#previousPath, undefined);
|
|
82
|
+
this.#previousPath = [];
|
|
83
|
+
this.#lastTarget = undefined;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
getCurrentTarget() {
|
|
87
|
+
return this.#lastTarget;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* Diffs the old and new pointed paths and emits synthetic subtree
|
|
92
|
+
* transitions.
|
|
93
|
+
*
|
|
94
|
+
* @param {Interaction} interaction
|
|
95
|
+
*/
|
|
96
|
+
#dispatchPointerTransitions(interaction) {
|
|
97
|
+
const currentPath = this.#toRootPath(interaction.target);
|
|
98
|
+
const previousPath = this.#previousPath;
|
|
99
|
+
|
|
100
|
+
let commonLength = 0;
|
|
101
|
+
while (
|
|
102
|
+
commonLength < previousPath.length &&
|
|
103
|
+
commonLength < currentPath.length &&
|
|
104
|
+
previousPath[commonLength] === currentPath[commonLength]
|
|
105
|
+
) {
|
|
106
|
+
commonLength++;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
if (commonLength < previousPath.length) {
|
|
110
|
+
this.#dispatchLeaveEvents(
|
|
111
|
+
interaction,
|
|
112
|
+
previousPath.slice(commonLength),
|
|
113
|
+
currentPath.at(-1)
|
|
114
|
+
);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
if (commonLength < currentPath.length) {
|
|
118
|
+
this.#dispatchEnterEvents(
|
|
119
|
+
interaction,
|
|
120
|
+
currentPath.slice(commonLength),
|
|
121
|
+
previousPath.at(-1)
|
|
122
|
+
);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
this.#previousPath = currentPath;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* @param {Interaction} baseInteraction
|
|
130
|
+
* @param {import("../view/view.js").default[]} leavingViews
|
|
131
|
+
* @param {import("../view/view.js").default | undefined} relatedTarget
|
|
132
|
+
*/
|
|
133
|
+
#dispatchLeaveEvents(baseInteraction, leavingViews, relatedTarget) {
|
|
134
|
+
for (let i = leavingViews.length - 1; i >= 0; i--) {
|
|
135
|
+
const interaction = new Interaction(
|
|
136
|
+
baseInteraction.point,
|
|
137
|
+
baseInteraction.uiEvent,
|
|
138
|
+
"mouseleave"
|
|
139
|
+
);
|
|
140
|
+
const view = leavingViews[i];
|
|
141
|
+
interaction.target = view;
|
|
142
|
+
interaction.currentTarget = view;
|
|
143
|
+
interaction.relatedTarget = relatedTarget;
|
|
144
|
+
this.#dispatchDirect(view, interaction);
|
|
145
|
+
|
|
146
|
+
if (interaction.stopped) {
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
/**
|
|
153
|
+
* @param {Interaction} baseInteraction
|
|
154
|
+
* @param {import("../view/view.js").default[]} enteringViews
|
|
155
|
+
* @param {import("../view/view.js").default | undefined} relatedTarget
|
|
156
|
+
*/
|
|
157
|
+
#dispatchEnterEvents(baseInteraction, enteringViews, relatedTarget) {
|
|
158
|
+
for (const view of enteringViews) {
|
|
159
|
+
const interaction = new Interaction(
|
|
160
|
+
baseInteraction.point,
|
|
161
|
+
baseInteraction.uiEvent,
|
|
162
|
+
"mouseenter"
|
|
163
|
+
);
|
|
164
|
+
interaction.target = view;
|
|
165
|
+
interaction.currentTarget = view;
|
|
166
|
+
interaction.relatedTarget = relatedTarget;
|
|
167
|
+
this.#dispatchDirect(view, interaction);
|
|
168
|
+
|
|
169
|
+
if (interaction.stopped) {
|
|
170
|
+
return;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
/**
|
|
176
|
+
* @param {import("../view/view.js").default | undefined} target
|
|
177
|
+
* @returns {import("../view/view.js").default[]}
|
|
178
|
+
*/
|
|
179
|
+
#toRootPath(target) {
|
|
180
|
+
return target ? target.getLayoutAncestors().reverse() : [];
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
/**
|
|
184
|
+
* Dispatches a synthetic transition directly on a single view.
|
|
185
|
+
*
|
|
186
|
+
* Unlike ordinary routed propagation, enter/leave transitions are already
|
|
187
|
+
* resolved to a specific view. Therefore the dispatcher invokes that
|
|
188
|
+
* view's capture listeners first and bubble listeners second without
|
|
189
|
+
* re-entering container routing.
|
|
190
|
+
*
|
|
191
|
+
* @param {import("../view/view.js").default} view
|
|
192
|
+
* @param {Interaction} interaction
|
|
193
|
+
*/
|
|
194
|
+
#dispatchDirect(view, interaction) {
|
|
195
|
+
view.handleInteraction(interaction, true);
|
|
196
|
+
|
|
197
|
+
if (interaction.stopped) {
|
|
198
|
+
return;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
view.handleInteraction(interaction, false);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
@@ -7,12 +7,14 @@
|
|
|
7
7
|
* what they need while keeping production usage explicit.
|
|
8
8
|
*
|
|
9
9
|
* @param {Partial<ViewContext> & {
|
|
10
|
-
* createOrImportViewWithContext?: (context: ViewContext, spec: import("../spec/view.js").ViewSpec | import("../spec/view.js").ImportSpec, layoutParent?: import("../view/containerView.js").default, dataParent?: import("../view/view.js").default, defaultName?: string, validator?: (spec: import("../spec/view.js").ViewSpec) => void) => Promise<import("../view/view.js").default>
|
|
10
|
+
* createOrImportViewWithContext?: (context: ViewContext, spec: import("../spec/view.js").ViewSpec | import("../spec/view.js").ImportSpec, layoutParent?: import("../view/containerView.js").default, dataParent?: import("../view/view.js").default, defaultName?: string, validator?: (spec: import("../spec/view.js").ViewSpec) => void, options?: import("../types/viewContext.js").CreateViewOptions) => Promise<import("../view/view.js").default>
|
|
11
|
+
* allowMissingGlHelper?: boolean
|
|
11
12
|
* }} options
|
|
12
13
|
* @returns {ViewContext}
|
|
13
14
|
*/
|
|
14
15
|
export function createViewContext(options: Partial<ViewContext> & {
|
|
15
|
-
createOrImportViewWithContext?: (context: ViewContext, spec: import("../spec/view.js").ViewSpec | import("../spec/view.js").ImportSpec, layoutParent?: import("../view/containerView.js").default, dataParent?: import("../view/view.js").default, defaultName?: string, validator?: (spec: import("../spec/view.js").ViewSpec) => void) => Promise<import("../view/view.js").default>;
|
|
16
|
+
createOrImportViewWithContext?: (context: ViewContext, spec: import("../spec/view.js").ViewSpec | import("../spec/view.js").ImportSpec, layoutParent?: import("../view/containerView.js").default, dataParent?: import("../view/view.js").default, defaultName?: string, validator?: (spec: import("../spec/view.js").ViewSpec) => void, options?: import("../types/viewContext.js").CreateViewOptions) => Promise<import("../view/view.js").default>;
|
|
17
|
+
allowMissingGlHelper?: boolean;
|
|
16
18
|
}): ViewContext;
|
|
17
19
|
export type ViewContext = import("../types/viewContext.js").default;
|
|
18
20
|
//# sourceMappingURL=viewContextFactory.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"viewContextFactory.d.ts","sourceRoot":"","sources":["../../../src/genomeSpy/viewContextFactory.js"],"names":[],"mappings":"AAAA;;GAEG;AAEH
|
|
1
|
+
{"version":3,"file":"viewContextFactory.d.ts","sourceRoot":"","sources":["../../../src/genomeSpy/viewContextFactory.js"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;;;;;;;;GAUG;AACH,2CANW,OAAO,CAAC,WAAW,CAAC,GAAG;IAC7B,6BAA6B,CAAC,EAAE,CAAC,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,iBAAiB,EAAE,QAAQ,GAAG,OAAO,iBAAiB,EAAE,UAAU,EAAE,YAAY,CAAC,EAAE,OAAO,0BAA0B,EAAE,OAAO,EAAE,UAAU,CAAC,EAAE,OAAO,iBAAiB,EAAE,OAAO,EAAE,WAAW,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,iBAAiB,EAAE,QAAQ,KAAK,IAAI,EAAE,OAAO,CAAC,EAAE,OAAO,yBAAyB,EAAE,iBAAiB,KAAK,OAAO,CAAC,OAAO,iBAAiB,EAAE,OAAO,CAAC,CAAA;IACrb,oBAAoB,CAAC,EAAE,OAAO,CAAA;CAC/B,GACS,WAAW,CAwEvB;0BApFY,OAAO,yBAAyB,EAAE,OAAO"}
|