@genome-spy/core 0.65.0 → 0.67.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/browser-BRemItdO.js +138 -0
- package/dist/bundle/{index-CD7FLu9x.js → index-BatuyGAI.js} +23 -21
- package/dist/bundle/{index-C0llXMqm.js → index-ByuE8dvu.js} +140 -88
- package/dist/bundle/index-Cq3QFUxX.js +1781 -0
- package/dist/bundle/index-D28m8tSW.js +1607 -0
- package/dist/bundle/index-DbJ0oeYM.js +631 -0
- package/dist/bundle/index.es.js +15821 -14601
- package/dist/bundle/index.js +214 -212
- package/dist/bundle/{inflate-DRgHi_KK.js → inflate-GtwLkvSP.js} +222 -224
- package/dist/bundle/unzip-NywezaRR.js +1492 -0
- package/dist/schema.json +13 -3
- package/dist/src/config/scaleDefaults.d.ts +8 -0
- package/dist/src/config/scaleDefaults.d.ts.map +1 -0
- package/dist/src/config/scaleDefaults.js +45 -0
- package/dist/src/data/flowHandle.d.ts +2 -0
- package/dist/src/data/flowHandle.d.ts.map +1 -1
- package/dist/src/data/flowHandle.js +1 -0
- package/dist/src/data/flowInit.d.ts +12 -4
- package/dist/src/data/flowInit.d.ts.map +1 -1
- package/dist/src/data/flowInit.js +115 -16
- package/dist/src/data/sources/lazy/axisTickSource.js +1 -1
- package/dist/src/data/sources/lazy/singleAxisLazySource.d.ts +1 -1
- package/dist/src/data/sources/lazy/singleAxisLazySource.d.ts.map +1 -1
- package/dist/src/data/sources/lazy/singleAxisLazySource.js +10 -3
- package/dist/src/data/sources/lazy/singleAxisWindowedSource.d.ts.map +1 -1
- package/dist/src/data/sources/lazy/singleAxisWindowedSource.js +5 -1
- package/dist/src/data/transforms/filterScoredLabels.d.ts +1 -1
- package/dist/src/data/transforms/filterScoredLabels.d.ts.map +1 -1
- package/dist/src/data/transforms/filterScoredLabels.js +1 -1
- package/dist/src/data/transforms/linearizeGenomicCoordinate.d.ts.map +1 -1
- package/dist/src/data/transforms/linearizeGenomicCoordinate.js +2 -1
- package/dist/src/encoder/encoder.d.ts +1 -1
- package/dist/src/encoder/encoder.d.ts.map +1 -1
- package/dist/src/encoder/encoder.js +1 -1
- package/dist/src/genome/scaleLocus.d.ts +39 -0
- package/dist/src/genome/scaleLocus.d.ts.map +1 -1
- package/dist/src/genome/scaleLocus.js +76 -0
- package/dist/src/genomeSpy/canvasExport.d.ts +19 -0
- package/dist/src/genomeSpy/canvasExport.d.ts.map +1 -0
- package/dist/src/genomeSpy/canvasExport.js +66 -0
- package/dist/src/genomeSpy/containerUi.d.ts +17 -0
- package/dist/src/genomeSpy/containerUi.d.ts.map +1 -0
- package/dist/src/genomeSpy/containerUi.js +78 -0
- package/dist/src/genomeSpy/eventListenerRegistry.d.ts +19 -0
- package/dist/src/genomeSpy/eventListenerRegistry.d.ts.map +1 -0
- package/dist/src/genomeSpy/eventListenerRegistry.js +38 -0
- package/dist/src/genomeSpy/inputBindingManager.d.ts +14 -0
- package/dist/src/genomeSpy/inputBindingManager.d.ts.map +1 -0
- package/dist/src/genomeSpy/inputBindingManager.js +63 -0
- package/dist/src/genomeSpy/interactionController.d.ts +40 -0
- package/dist/src/genomeSpy/interactionController.d.ts.map +1 -0
- package/dist/src/genomeSpy/interactionController.js +371 -0
- package/dist/src/genomeSpy/keyboardListenerManager.d.ts +10 -0
- package/dist/src/genomeSpy/keyboardListenerManager.d.ts.map +1 -0
- package/dist/src/genomeSpy/keyboardListenerManager.js +31 -0
- package/dist/src/genomeSpy/loadingIndicatorManager.d.ts +15 -0
- package/dist/src/genomeSpy/loadingIndicatorManager.d.ts.map +1 -0
- package/dist/src/genomeSpy/loadingIndicatorManager.js +92 -0
- package/dist/src/genomeSpy/renderCoordinator.d.ts +22 -0
- package/dist/src/genomeSpy/renderCoordinator.d.ts.map +1 -0
- package/dist/src/genomeSpy/renderCoordinator.js +118 -0
- package/dist/src/genomeSpy/viewContextFactory.d.ts +18 -0
- package/dist/src/genomeSpy/viewContextFactory.d.ts.map +1 -0
- package/dist/src/genomeSpy/viewContextFactory.js +79 -0
- package/dist/src/genomeSpy/viewDataInit.d.ts +22 -0
- package/dist/src/genomeSpy/viewDataInit.d.ts.map +1 -0
- package/dist/src/genomeSpy/viewDataInit.js +160 -0
- package/dist/src/genomeSpy/viewDataInit.test.d.ts +2 -0
- package/dist/src/genomeSpy/viewDataInit.test.d.ts.map +1 -0
- package/dist/src/genomeSpy/viewHierarchyConfig.d.ts +14 -0
- package/dist/src/genomeSpy/viewHierarchyConfig.d.ts.map +1 -0
- package/dist/src/genomeSpy/viewHierarchyConfig.js +24 -0
- package/dist/src/genomeSpy/viewHighlight.d.ts +5 -0
- package/dist/src/genomeSpy/viewHighlight.d.ts.map +1 -0
- package/dist/src/genomeSpy/viewHighlight.js +30 -0
- package/dist/src/genomeSpy.d.ts +17 -71
- package/dist/src/genomeSpy.d.ts.map +1 -1
- package/dist/src/genomeSpy.js +197 -741
- package/dist/src/gl/dataToVertices.d.ts.map +1 -1
- package/dist/src/gl/dataToVertices.js +16 -4
- package/dist/src/gl/glslScaleGenerator.d.ts +1 -1
- package/dist/src/gl/webGLHelper.d.ts +2 -2
- package/dist/src/gl/webGLHelper.d.ts.map +1 -1
- package/dist/src/gl/webGLHelper.js +4 -4
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +2 -12
- package/dist/src/marks/mark.d.ts.map +1 -1
- package/dist/src/marks/mark.js +4 -2
- package/dist/src/{view → scales}/axisResolution.d.ts +9 -16
- package/dist/src/scales/axisResolution.d.ts.map +1 -0
- package/dist/src/{view → scales}/axisResolution.js +29 -18
- package/dist/src/scales/axisResolution.test.d.ts.map +1 -0
- package/dist/src/scales/scaleDomainAggregator.d.ts +57 -0
- package/dist/src/scales/scaleDomainAggregator.d.ts.map +1 -0
- package/dist/src/scales/scaleDomainAggregator.js +167 -0
- package/dist/src/scales/scaleDomainAggregator.test.d.ts +2 -0
- package/dist/src/scales/scaleDomainAggregator.test.d.ts.map +1 -0
- package/dist/src/scales/scaleInstanceManager.d.ts +40 -0
- package/dist/src/scales/scaleInstanceManager.d.ts.map +1 -0
- package/dist/src/scales/scaleInstanceManager.js +317 -0
- package/dist/src/scales/scaleInstanceManager.test.d.ts +2 -0
- package/dist/src/scales/scaleInstanceManager.test.d.ts.map +1 -0
- package/dist/src/scales/scaleInteractionController.d.ts +73 -0
- package/dist/src/scales/scaleInteractionController.d.ts.map +1 -0
- package/dist/src/scales/scaleInteractionController.js +336 -0
- package/dist/src/scales/scaleInteractionController.test.d.ts +2 -0
- package/dist/src/scales/scaleInteractionController.test.d.ts.map +1 -0
- package/dist/src/scales/scalePropsResolver.d.ts +23 -0
- package/dist/src/scales/scalePropsResolver.d.ts.map +1 -0
- package/dist/src/scales/scalePropsResolver.js +74 -0
- package/dist/src/{view → scales}/scaleResolution.d.ts +53 -35
- package/dist/src/scales/scaleResolution.d.ts.map +1 -0
- package/dist/src/scales/scaleResolution.js +732 -0
- package/dist/src/scales/scaleResolution.test.d.ts.map +1 -0
- package/dist/src/scales/scaleResolutionConstants.d.ts +6 -0
- package/dist/src/scales/scaleResolutionConstants.d.ts.map +1 -0
- package/dist/src/scales/scaleResolutionConstants.js +5 -0
- package/dist/src/scales/scaleRules.d.ts +16 -0
- package/dist/src/scales/scaleRules.d.ts.map +1 -0
- package/dist/src/scales/scaleRules.js +103 -0
- package/dist/src/scales/scaleRules.test.d.ts +2 -0
- package/dist/src/scales/scaleRules.test.d.ts.map +1 -0
- package/dist/src/spec/channel.d.ts +13 -18
- package/dist/src/spec/scale.d.ts +6 -0
- package/dist/src/types/embedApi.d.ts +5 -0
- package/dist/src/types/scaleResolutionApi.d.ts +1 -1
- package/dist/src/utils/domainArray.d.ts.map +1 -1
- package/dist/src/utils/domainArray.js +3 -0
- package/dist/src/utils/indexer.d.ts +3 -0
- package/dist/src/utils/indexer.d.ts.map +1 -1
- package/dist/src/utils/indexer.js +3 -0
- package/dist/src/view/concatView.d.ts +18 -0
- package/dist/src/view/concatView.d.ts.map +1 -1
- package/dist/src/view/concatView.js +73 -0
- package/dist/src/view/concatView.test.d.ts +2 -0
- package/dist/src/view/concatView.test.d.ts.map +1 -0
- package/dist/src/view/containerMutationHelper.d.ts +74 -0
- package/dist/src/view/containerMutationHelper.d.ts.map +1 -0
- package/dist/src/view/containerMutationHelper.js +118 -0
- package/dist/src/view/containerView.d.ts +0 -7
- package/dist/src/view/containerView.d.ts.map +1 -1
- package/dist/src/view/containerView.js +0 -10
- package/dist/src/view/facetView.d.ts.map +1 -1
- package/dist/src/view/facetView.js +0 -15
- package/dist/src/view/flowBuilder.d.ts +5 -3
- package/dist/src/view/flowBuilder.d.ts.map +1 -1
- package/dist/src/view/flowBuilder.js +69 -6
- package/dist/src/view/gridView/gridChild.d.ts +11 -0
- package/dist/src/view/gridView/gridChild.d.ts.map +1 -1
- package/dist/src/view/gridView/gridChild.js +32 -6
- package/dist/src/view/gridView/gridView.d.ts +39 -1
- package/dist/src/view/gridView/gridView.d.ts.map +1 -1
- package/dist/src/view/gridView/gridView.js +106 -48
- package/dist/src/view/gridView/gridView.test.d.ts +2 -0
- package/dist/src/view/gridView/gridView.test.d.ts.map +1 -0
- package/dist/src/view/gridView/scrollbar.d.ts +39 -8
- package/dist/src/view/gridView/scrollbar.d.ts.map +1 -1
- package/dist/src/view/gridView/scrollbar.js +184 -69
- package/dist/src/view/layerView.d.ts +14 -0
- package/dist/src/view/layerView.d.ts.map +1 -1
- package/dist/src/view/layerView.js +66 -0
- package/dist/src/view/layerView.test.d.ts +2 -0
- package/dist/src/view/layerView.test.d.ts.map +1 -0
- package/dist/src/view/testUtils.d.ts.map +1 -1
- package/dist/src/view/testUtils.js +7 -1
- package/dist/src/view/unitView.d.ts.map +1 -1
- package/dist/src/view/unitView.js +41 -36
- package/dist/src/view/view.d.ts +18 -6
- package/dist/src/view/view.d.ts.map +1 -1
- package/dist/src/view/view.js +30 -4
- package/package.json +2 -2
- package/dist/bundle/browser-txUcLy2H.js +0 -123
- package/dist/bundle/index-BQpbYrv4.js +0 -1712
- package/dist/bundle/index-BhtHKLUo.js +0 -73
- package/dist/bundle/index-CCe8rnZz.js +0 -716
- package/dist/bundle/index-DhcU-Gk-.js +0 -1487
- package/dist/src/data/collector.test.js +0 -138
- package/dist/src/data/dataFlow.test.js +0 -38
- package/dist/src/data/flow.test.js +0 -81
- package/dist/src/data/flowInit.test.js +0 -413
- package/dist/src/data/flowNode.test.js +0 -50
- package/dist/src/data/flowOptimizer.test.js +0 -209
- package/dist/src/data/formats/fasta.test.js +0 -27
- package/dist/src/data/sources/inlineSource.test.js +0 -63
- package/dist/src/data/sources/sequenceSource.test.js +0 -81
- package/dist/src/data/transforms/aggregate.test.js +0 -134
- package/dist/src/data/transforms/clone.test.js +0 -11
- package/dist/src/data/transforms/coverage.test.js +0 -238
- package/dist/src/data/transforms/filter.test.js +0 -20
- package/dist/src/data/transforms/flatten.test.js +0 -96
- package/dist/src/data/transforms/flattenDelimited.test.js +0 -90
- package/dist/src/data/transforms/flattenSequence.test.js +0 -34
- package/dist/src/data/transforms/formula.test.js +0 -25
- package/dist/src/data/transforms/identifier.test.js +0 -92
- package/dist/src/data/transforms/pileup.test.js +0 -70
- package/dist/src/data/transforms/project.test.js +0 -32
- package/dist/src/data/transforms/regexExtract.test.js +0 -70
- package/dist/src/data/transforms/regexFold.test.js +0 -201
- package/dist/src/data/transforms/sample.test.js +0 -38
- package/dist/src/data/transforms/stack.test.js +0 -91
- package/dist/src/encoder/accessor.test.js +0 -162
- package/dist/src/encoder/encoder.test.js +0 -105
- package/dist/src/genome/genome.test.js +0 -268
- package/dist/src/genome/genomes.test.js +0 -8
- package/dist/src/genome/scaleIndex.test.js +0 -78
- package/dist/src/genome/scaleLocus.test.js +0 -4
- package/dist/src/scale/scale.test.js +0 -326
- package/dist/src/scale/ticks.test.js +0 -46
- package/dist/src/selection/selection.test.js +0 -14
- package/dist/src/utils/addBaseUrl.test.js +0 -30
- package/dist/src/utils/binnedIndex.test.js +0 -201
- package/dist/src/utils/cloner.test.js +0 -35
- package/dist/src/utils/coalesce.test.js +0 -16
- package/dist/src/utils/concatIterables.test.js +0 -8
- package/dist/src/utils/domainArray.test.js +0 -130
- package/dist/src/utils/indexer.test.js +0 -49
- package/dist/src/utils/interactionEvent.test.js +0 -35
- package/dist/src/utils/iterateNestedMaps.test.js +0 -33
- package/dist/src/utils/kWayMerge.test.js +0 -30
- package/dist/src/utils/mergeObjects.test.js +0 -42
- package/dist/src/utils/numberExtractor.test.js +0 -6
- package/dist/src/utils/propertyCacher.test.js +0 -89
- package/dist/src/utils/propertyCoalescer.test.js +0 -25
- package/dist/src/utils/radixSort.test.js +0 -51
- package/dist/src/utils/reservationMap.test.js +0 -20
- package/dist/src/utils/ringBuffer.test.js +0 -39
- package/dist/src/utils/topK.test.js +0 -54
- package/dist/src/utils/trees.test.js +0 -135
- package/dist/src/utils/url.test.js +0 -28
- package/dist/src/utils/variableTools.test.js +0 -13
- package/dist/src/view/axisResolution.d.ts.map +0 -1
- package/dist/src/view/axisResolution.test.d.ts.map +0 -1
- package/dist/src/view/axisResolution.test.js +0 -206
- package/dist/src/view/flowBuilder.test.js +0 -125
- package/dist/src/view/gridView/selectionRect.test.js +0 -87
- package/dist/src/view/layout/flexLayout.test.js +0 -323
- package/dist/src/view/layout/grid.test.js +0 -71
- package/dist/src/view/layout/rectangle.test.js +0 -192
- package/dist/src/view/paramMediator.test.js +0 -282
- package/dist/src/view/scaleResolution.d.ts.map +0 -1
- package/dist/src/view/scaleResolution.js +0 -1059
- package/dist/src/view/scaleResolution.test.d.ts.map +0 -1
- package/dist/src/view/scaleResolution.test.js +0 -645
- package/dist/src/view/view.test.js +0 -245
- package/dist/src/view/viewDispose.test.js +0 -110
- package/dist/src/view/viewFactory.test.js +0 -25
- package/dist/src/view/viewUtils.test.js +0 -87
- /package/dist/src/{view → scales}/axisResolution.test.d.ts +0 -0
- /package/dist/src/{view → scales}/scaleResolution.test.d.ts +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scrollbar.d.ts","sourceRoot":"","sources":["../../../../src/view/gridView/scrollbar.js"],"names":[],"mappings":"AAKA
|
|
1
|
+
{"version":3,"file":"scrollbar.d.ts","sourceRoot":"","sources":["../../../../src/view/gridView/scrollbar.js"],"names":[],"mappings":"AAKA;;;;;GAKG;AACH;IAwBI;;;;OAIG;IACH,uBAJW,OAAO,gBAAgB,EAAE,OAAO,mBAChC,eAAe,YACf;QAAE,sBAAsB,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAA;KAAE,EAwH/D;IAvID;;;;;;OAMG;IACH,uBAAmB;IAiDf;;;;MAAoB;IAiFxB,2BAEC;IAED;;;OAGG;IACH,yBAHW,MAAM,6BACN;QAAE,MAAM,CAAC,EAAE,OAAO,CAAC;QAAC,YAAY,CAAC,EAAE,OAAO,CAAA;KAAE,QAYtD;IAqFD;;;;;;;;;OASG;IACH,gCAHW,SAAS,iBACT,SAAS,QASnB;IAMG;;;;MAWC;;CAER;;;;;8BAlSY,YAAY,GAAG,UAAU;qBANjB,gBAAgB;sBADf,wBAAwB"}
|
|
@@ -4,37 +4,57 @@ import Rectangle from "../layout/rectangle.js";
|
|
|
4
4
|
import UnitView from "../unitView.js";
|
|
5
5
|
|
|
6
6
|
/**
|
|
7
|
+
* This class represents a scrollbar thumb that can be used within a grid view
|
|
8
|
+
* to provide scrolling functionality for overflowing content.
|
|
9
|
+
*
|
|
7
10
|
* @typedef {"horizontal" | "vertical"} ScrollDirection
|
|
8
11
|
*/
|
|
9
12
|
export default class Scrollbar extends UnitView {
|
|
10
13
|
/** @type {ScrollDirection} */
|
|
11
14
|
#scrollDirection;
|
|
12
15
|
|
|
16
|
+
// NOTE: Keep this Rectangle instance stable. Buffered rendering caches
|
|
17
|
+
// a reference to coords; replacing it breaks dynamic updates.
|
|
13
18
|
#scrollbarCoords = Rectangle.ZERO;
|
|
14
19
|
|
|
15
|
-
#
|
|
20
|
+
#viewportCoords = Rectangle.ZERO;
|
|
16
21
|
|
|
17
|
-
#
|
|
22
|
+
#contentCoords = Rectangle.ZERO;
|
|
18
23
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
24
|
+
/**
|
|
25
|
+
* The actual state of the scrollbar.
|
|
26
|
+
*
|
|
27
|
+
* It's better to keep track of the viewport offset rather than the
|
|
28
|
+
* scrollbar offset because the former is more stable when the
|
|
29
|
+
* viewport size changes.
|
|
30
|
+
*/
|
|
22
31
|
viewportOffset = 0;
|
|
23
32
|
|
|
33
|
+
/** @type {(offset: number) => void} */
|
|
34
|
+
#onViewportOffsetChange;
|
|
35
|
+
|
|
24
36
|
/**
|
|
25
37
|
* @param {import("./gridChild.js").default} gridChild
|
|
26
38
|
* @param {ScrollDirection} scrollDirection
|
|
39
|
+
* @param {{ onViewportOffsetChange?: (offset: number) => void }} [options]
|
|
27
40
|
*/
|
|
28
|
-
constructor(gridChild, scrollDirection) {
|
|
29
|
-
// TODO: Configurable
|
|
41
|
+
constructor(gridChild, scrollDirection, options = {}) {
|
|
42
|
+
// TODO: Configurable per view
|
|
30
43
|
const config = {
|
|
31
44
|
scrollbarSize: 8,
|
|
32
45
|
scrollbarPadding: 2,
|
|
33
|
-
|
|
46
|
+
scrollbarMinLength: 20,
|
|
34
47
|
};
|
|
35
48
|
|
|
36
49
|
super(
|
|
37
50
|
{
|
|
51
|
+
params: [
|
|
52
|
+
{
|
|
53
|
+
name: "scrollbarOpacity",
|
|
54
|
+
value: 1,
|
|
55
|
+
},
|
|
56
|
+
],
|
|
57
|
+
opacity: { expr: "scrollbarOpacity" },
|
|
38
58
|
data: { values: [{}] },
|
|
39
59
|
mark: {
|
|
40
60
|
type: "rect",
|
|
@@ -59,22 +79,41 @@ export default class Scrollbar extends UnitView {
|
|
|
59
79
|
|
|
60
80
|
this.config = config;
|
|
61
81
|
this.#scrollDirection = scrollDirection;
|
|
82
|
+
this.#onViewportOffsetChange = options.onViewportOffsetChange;
|
|
62
83
|
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
84
|
+
const sPad = this.config.scrollbarPadding;
|
|
85
|
+
const sSize = this.config.scrollbarSize;
|
|
86
|
+
|
|
87
|
+
this.#scrollbarCoords =
|
|
88
|
+
this.#scrollDirection == "vertical"
|
|
89
|
+
? new Rectangle(
|
|
90
|
+
() =>
|
|
91
|
+
this.#viewportCoords.x +
|
|
92
|
+
this.#viewportCoords.width -
|
|
93
|
+
sSize -
|
|
94
|
+
sPad,
|
|
95
|
+
() => this.#viewportCoords.y + sPad + this.scrollOffset,
|
|
96
|
+
() => sSize,
|
|
97
|
+
() => this.#getScrollLength()
|
|
98
|
+
)
|
|
99
|
+
: new Rectangle(
|
|
100
|
+
() => this.#viewportCoords.x + sPad + this.scrollOffset,
|
|
101
|
+
() =>
|
|
102
|
+
this.#viewportCoords.y +
|
|
103
|
+
this.#viewportCoords.height -
|
|
104
|
+
sSize -
|
|
105
|
+
sPad,
|
|
106
|
+
() => this.#getScrollLength(),
|
|
107
|
+
() => sSize
|
|
108
|
+
);
|
|
109
|
+
|
|
110
|
+
// Smooth viewport offset updates
|
|
111
|
+
this.#initViewportOffsetSmoother(this.viewportOffset);
|
|
73
112
|
|
|
74
113
|
this.addInteractionEventListener("mousedown", (coords, event) => {
|
|
75
114
|
event.stopPropagation();
|
|
76
115
|
|
|
77
|
-
if (this.#
|
|
116
|
+
if (this.#getMaxScrollOffset() <= 0) {
|
|
78
117
|
return;
|
|
79
118
|
}
|
|
80
119
|
|
|
@@ -91,18 +130,21 @@ export default class Scrollbar extends UnitView {
|
|
|
91
130
|
const onMousemove = /** @param {MouseEvent} moveEvent */ (
|
|
92
131
|
moveEvent
|
|
93
132
|
) => {
|
|
133
|
+
const maxScrollOffset = this.#getMaxScrollOffset();
|
|
134
|
+
if (maxScrollOffset <= 0) {
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
|
|
94
138
|
const scrollOffset = clamp(
|
|
95
139
|
getMouseOffset(moveEvent) -
|
|
96
140
|
initialOffset +
|
|
97
141
|
initialScrollOffset,
|
|
98
142
|
0,
|
|
99
|
-
|
|
143
|
+
maxScrollOffset
|
|
100
144
|
);
|
|
101
145
|
|
|
102
146
|
this.interpolateViewportOffset({
|
|
103
|
-
x:
|
|
104
|
-
(scrollOffset / this.#maxScrollOffset) *
|
|
105
|
-
this.#maxViewportOffset,
|
|
147
|
+
x: this.#getViewportOffsetFromScrollOffset(scrollOffset),
|
|
106
148
|
});
|
|
107
149
|
};
|
|
108
150
|
|
|
@@ -117,9 +159,95 @@ export default class Scrollbar extends UnitView {
|
|
|
117
159
|
}
|
|
118
160
|
|
|
119
161
|
get scrollOffset() {
|
|
120
|
-
return (
|
|
121
|
-
|
|
122
|
-
|
|
162
|
+
return this.#getScrollOffsetFromViewportOffset(this.viewportOffset);
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
/**
|
|
166
|
+
* @param {number} value
|
|
167
|
+
* @param {{ notify?: boolean, syncSmoother?: boolean }} [options]
|
|
168
|
+
*/
|
|
169
|
+
setViewportOffset(value, { notify = true, syncSmoother = false } = {}) {
|
|
170
|
+
this.viewportOffset = clamp(value, 0, this.#getMaxViewportOffset());
|
|
171
|
+
|
|
172
|
+
if (syncSmoother) {
|
|
173
|
+
this.#initViewportOffsetSmoother(this.viewportOffset);
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
if (notify && this.#onViewportOffsetChange) {
|
|
177
|
+
this.#onViewportOffsetChange(this.viewportOffset);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
#getVisibleFraction() {
|
|
182
|
+
const dimension =
|
|
183
|
+
this.#scrollDirection == "horizontal" ? "width" : "height";
|
|
184
|
+
|
|
185
|
+
const viewportSize = this.#viewportCoords[dimension];
|
|
186
|
+
const contentSize = this.#contentCoords[dimension];
|
|
187
|
+
|
|
188
|
+
return contentSize > 0 ? Math.min(1, viewportSize / contentSize) : 1;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
#getMaxScrollLength() {
|
|
192
|
+
const dimension =
|
|
193
|
+
this.#scrollDirection == "horizontal" ? "width" : "height";
|
|
194
|
+
|
|
195
|
+
return Math.max(
|
|
196
|
+
0,
|
|
197
|
+
this.#viewportCoords[dimension] - 2 * this.config.scrollbarPadding
|
|
198
|
+
);
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
#getScrollLength() {
|
|
202
|
+
const maxScrollLength = this.#getMaxScrollLength();
|
|
203
|
+
const scrollLength = this.#getVisibleFraction() * maxScrollLength;
|
|
204
|
+
const minLength = this.config.scrollbarMinLength;
|
|
205
|
+
|
|
206
|
+
return Math.min(maxScrollLength, Math.max(minLength, scrollLength));
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
#getMaxScrollOffset() {
|
|
210
|
+
return Math.max(
|
|
211
|
+
0,
|
|
212
|
+
this.#getMaxScrollLength() - this.#getScrollLength()
|
|
213
|
+
);
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
/**
|
|
217
|
+
* @param {number} viewportOffset
|
|
218
|
+
*/
|
|
219
|
+
#getScrollOffsetFromViewportOffset(viewportOffset) {
|
|
220
|
+
const maxViewportOffset = this.#getMaxViewportOffset();
|
|
221
|
+
const maxScrollOffset = this.#getMaxScrollOffset();
|
|
222
|
+
|
|
223
|
+
if (maxViewportOffset <= 0 || maxScrollOffset <= 0) {
|
|
224
|
+
return 0;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
return (viewportOffset / maxViewportOffset) * maxScrollOffset;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
/**
|
|
231
|
+
* @param {number} scrollOffset
|
|
232
|
+
*/
|
|
233
|
+
#getViewportOffsetFromScrollOffset(scrollOffset) {
|
|
234
|
+
const maxViewportOffset = this.#getMaxViewportOffset();
|
|
235
|
+
const maxScrollOffset = this.#getMaxScrollOffset();
|
|
236
|
+
|
|
237
|
+
if (maxViewportOffset <= 0 || maxScrollOffset <= 0) {
|
|
238
|
+
return 0;
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
return (scrollOffset / maxScrollOffset) * maxViewportOffset;
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
#getMaxViewportOffset() {
|
|
245
|
+
const dimension =
|
|
246
|
+
this.#scrollDirection == "horizontal" ? "width" : "height";
|
|
247
|
+
|
|
248
|
+
return Math.max(
|
|
249
|
+
0,
|
|
250
|
+
this.#contentCoords[dimension] - this.#viewportCoords[dimension]
|
|
123
251
|
);
|
|
124
252
|
}
|
|
125
253
|
|
|
@@ -129,57 +257,44 @@ export default class Scrollbar extends UnitView {
|
|
|
129
257
|
* @param {import("../../types/rendering.js").RenderingOptions} [options]
|
|
130
258
|
*/
|
|
131
259
|
render(context, coords, options) {
|
|
260
|
+
// NOTE: This only records layout coordinates for buffered rendering.
|
|
132
261
|
super.render(context, this.#scrollbarCoords, options);
|
|
133
262
|
}
|
|
134
263
|
|
|
135
264
|
/**
|
|
265
|
+
* Updates the scrollbar with the latest viewport and content rectangles.
|
|
266
|
+
*
|
|
267
|
+
* Viewport coords are flattened to stay stable between layout passes, while
|
|
268
|
+
* content coords may be dynamic (e.g., peek transitions) and are evaluated
|
|
269
|
+
* on demand via accessors.
|
|
136
270
|
*
|
|
137
271
|
* @param {Rectangle} viewportCoords
|
|
138
|
-
* @param {Rectangle}
|
|
272
|
+
* @param {Rectangle} contentCoords
|
|
139
273
|
*/
|
|
140
|
-
updateScrollbar(viewportCoords,
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
1,
|
|
149
|
-
viewportCoords[dimension] / coords[dimension]
|
|
150
|
-
);
|
|
151
|
-
const maxScrollLength = viewportCoords[dimension] - 2 * sPad;
|
|
152
|
-
const scrollLength = visibleFraction * maxScrollLength;
|
|
274
|
+
updateScrollbar(viewportCoords, contentCoords) {
|
|
275
|
+
this.#viewportCoords = viewportCoords.flatten();
|
|
276
|
+
this.#contentCoords = contentCoords;
|
|
277
|
+
this.setViewportOffset(this.viewportOffset, {
|
|
278
|
+
notify: false,
|
|
279
|
+
syncSmoother: true,
|
|
280
|
+
});
|
|
281
|
+
}
|
|
153
282
|
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
this
|
|
283
|
+
/**
|
|
284
|
+
* @param {number} value
|
|
285
|
+
*/
|
|
286
|
+
#initViewportOffsetSmoother(value) {
|
|
287
|
+
this.interpolateViewportOffset = makeLerpSmoother(
|
|
288
|
+
this.context.animator,
|
|
289
|
+
(current) => {
|
|
290
|
+
this.setViewportOffset(current.x, {
|
|
291
|
+
notify: true,
|
|
292
|
+
syncSmoother: false,
|
|
293
|
+
});
|
|
294
|
+
},
|
|
295
|
+
35,
|
|
296
|
+
0.4,
|
|
297
|
+
{ x: value }
|
|
160
298
|
);
|
|
161
|
-
|
|
162
|
-
this.#scrollbarCoords =
|
|
163
|
-
this.#scrollDirection == "vertical"
|
|
164
|
-
? new Rectangle(
|
|
165
|
-
() =>
|
|
166
|
-
viewportCoords.x +
|
|
167
|
-
viewportCoords.width -
|
|
168
|
-
sSize -
|
|
169
|
-
sPad,
|
|
170
|
-
() => viewportCoords.y + sPad + this.scrollOffset,
|
|
171
|
-
() => sSize,
|
|
172
|
-
() => scrollLength
|
|
173
|
-
)
|
|
174
|
-
: new Rectangle(
|
|
175
|
-
() => viewportCoords.x + sPad + this.scrollOffset,
|
|
176
|
-
() =>
|
|
177
|
-
viewportCoords.y +
|
|
178
|
-
viewportCoords.height -
|
|
179
|
-
sSize -
|
|
180
|
-
sPad,
|
|
181
|
-
() => scrollLength,
|
|
182
|
-
() => sSize
|
|
183
|
-
);
|
|
184
299
|
}
|
|
185
300
|
}
|
|
@@ -10,6 +10,20 @@ export default class LayerView extends ContainerView {
|
|
|
10
10
|
*/
|
|
11
11
|
constructor(spec: import("../spec/view.js").LayerSpec, context: import("../types/viewContext.js").default, layoutParent: ContainerView, dataParent: import("./view.js").default, name: string, options?: import("./view.js").ViewOptions);
|
|
12
12
|
spec: import("../spec/view.js").LayerSpec;
|
|
13
|
+
/**
|
|
14
|
+
* Adds a child spec dynamically. Intended for post-initialization updates.
|
|
15
|
+
*
|
|
16
|
+
* @param {import("../spec/view.js").LayerSpec | import("../spec/view.js").UnitSpec | import("../spec/view.js").ImportSpec} childSpec
|
|
17
|
+
* @param {number} [index]
|
|
18
|
+
* @returns {Promise<LayerView | import("./unitView.js").default>}
|
|
19
|
+
*/
|
|
20
|
+
addChildSpec(childSpec: import("../spec/view.js").LayerSpec | import("../spec/view.js").UnitSpec | import("../spec/view.js").ImportSpec, index?: number): Promise<LayerView | import("./unitView.js").default>;
|
|
21
|
+
/**
|
|
22
|
+
* Removes a child by index. Intended for post-initialization updates.
|
|
23
|
+
*
|
|
24
|
+
* @param {number} index
|
|
25
|
+
*/
|
|
26
|
+
removeChildAt(index: number): Promise<void>;
|
|
13
27
|
get children(): (import("./unitView.js").default | LayerView)[];
|
|
14
28
|
#private;
|
|
15
29
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"layerView.d.ts","sourceRoot":"","sources":["../../../src/view/layerView.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"layerView.d.ts","sourceRoot":"","sources":["../../../src/view/layerView.js"],"names":[],"mappings":"AAKA;IAQI;;;;;;;;OAQG;IACH,kBAPW,OAAO,iBAAiB,EAAE,SAAS,WACnC,OAAO,yBAAyB,EAAE,OAAO,gBACzC,aAAa,cACb,OAAO,WAAW,EAAE,OAAO,QAC3B,MAAM,YACN,OAAO,WAAW,EAAE,WAAW,EAWzC;IAHG,0CAAgB;IAoCpB;;;;;;OAMG;IACH,wBAJW,OAAO,iBAAiB,EAAE,SAAS,GAAG,OAAO,iBAAiB,EAAE,QAAQ,GAAG,OAAO,iBAAiB,EAAE,UAAU,UAC/G,MAAM,GACJ,OAAO,CAAC,SAAS,GAAG,OAAO,eAAe,EAAE,OAAO,CAAC,CAMhE;IAED;;;;OAIG;IACH,qBAFW,MAAM,iBAIhB;IA6CD,gEAEC;;CA6CJ;0BA/KyB,oBAAoB"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { isLayerSpec, isUnitSpec } from "./viewFactory.js";
|
|
2
2
|
import ContainerView from "./containerView.js";
|
|
3
3
|
import ViewError from "./viewError.js";
|
|
4
|
+
import ContainerMutationHelper from "./containerMutationHelper.js";
|
|
4
5
|
|
|
5
6
|
export default class LayerView extends ContainerView {
|
|
6
7
|
/**
|
|
@@ -61,6 +62,71 @@ export default class LayerView extends ContainerView {
|
|
|
61
62
|
);
|
|
62
63
|
}
|
|
63
64
|
|
|
65
|
+
/**
|
|
66
|
+
* Adds a child spec dynamically. Intended for post-initialization updates.
|
|
67
|
+
*
|
|
68
|
+
* @param {import("../spec/view.js").LayerSpec | import("../spec/view.js").UnitSpec | import("../spec/view.js").ImportSpec} childSpec
|
|
69
|
+
* @param {number} [index]
|
|
70
|
+
* @returns {Promise<LayerView | import("./unitView.js").default>}
|
|
71
|
+
*/
|
|
72
|
+
async addChildSpec(childSpec, index) {
|
|
73
|
+
return /** @type {Promise<LayerView | import("./unitView.js").default>} */ (
|
|
74
|
+
this.#getMutationHelper().addChildSpec(childSpec, index)
|
|
75
|
+
);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Removes a child by index. Intended for post-initialization updates.
|
|
80
|
+
*
|
|
81
|
+
* @param {number} index
|
|
82
|
+
*/
|
|
83
|
+
async removeChildAt(index) {
|
|
84
|
+
await this.#getMutationHelper().removeChildAt(index);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* @returns {ContainerMutationHelper}
|
|
89
|
+
*/
|
|
90
|
+
#getMutationHelper() {
|
|
91
|
+
return new ContainerMutationHelper(this, {
|
|
92
|
+
getChildSpecs: () => ({
|
|
93
|
+
specs: this.spec.layer,
|
|
94
|
+
insertAt: (index, spec) => {
|
|
95
|
+
this.spec.layer.splice(
|
|
96
|
+
index,
|
|
97
|
+
0,
|
|
98
|
+
/** @type {import("../spec/view.js").LayerSpec | import("../spec/view.js").UnitSpec | import("../spec/view.js").ImportSpec} */ (
|
|
99
|
+
spec
|
|
100
|
+
)
|
|
101
|
+
);
|
|
102
|
+
},
|
|
103
|
+
removeAt: (index) => {
|
|
104
|
+
this.spec.layer.splice(index, 1);
|
|
105
|
+
},
|
|
106
|
+
}),
|
|
107
|
+
insertView: (view, index) => {
|
|
108
|
+
view.layoutParent ??= this;
|
|
109
|
+
this.#children.splice(
|
|
110
|
+
index,
|
|
111
|
+
0,
|
|
112
|
+
/** @type {LayerView | import("./unitView.js").default} */ (
|
|
113
|
+
view
|
|
114
|
+
)
|
|
115
|
+
);
|
|
116
|
+
return view;
|
|
117
|
+
},
|
|
118
|
+
removeView: (index) => {
|
|
119
|
+
const view = this.#children[index];
|
|
120
|
+
if (!view) {
|
|
121
|
+
throw new Error("Child index out of range!");
|
|
122
|
+
}
|
|
123
|
+
view.disposeSubtree();
|
|
124
|
+
this.#children.splice(index, 1);
|
|
125
|
+
},
|
|
126
|
+
defaultName: (index) => "layer" + index,
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
|
|
64
130
|
get children() {
|
|
65
131
|
return this.#children.slice();
|
|
66
132
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"layerView.test.d.ts","sourceRoot":"","sources":["../../../src/view/layerView.test.js"],"names":[],"mappings":""}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"testUtils.d.ts","sourceRoot":"","sources":["../../../src/view/testUtils.js"],"names":[],"mappings":"AAoBA;;;GAGG;AACH,2DAHW,OAAO,kBAAkB,EAAE,kBAAkB,
|
|
1
|
+
{"version":3,"file":"testUtils.d.ts","sourceRoot":"","sources":["../../../src/view/testUtils.js"],"names":[],"mappings":"AAoBA;;;GAGG;AACH,2DAHW,OAAO,kBAAkB,EAAE,kBAAkB,6CA+DvD;AAGS,uBAAC,CAAC,SAAS,OAAO,WAAW,EAAE,OAAO,QAAQ,QAAQ,aAAa;IAAE,KAAI,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,CAAA;CAAE,uBAAuB,OAAO,kBAAkB,EAAE,kBAAkB,GAAK,OAAO,CAAC,CAAC,CAAC,CAAA;AAgBhL,oCAAC,CAAC,SAAS,OAAO,WAAW,EAAE,OAAO,QAAQ,QAAQ,aAAa;IAAE,KAAI,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,CAAA;CAAE,YAAY,WAAW,YAAY;IAAC,MAAM,EAAE,OAAO,CAAC;IAAC,YAAY,EAAE,OAAO,CAAA;CAAC,GAAK,OAAO,CAAC,CAAC,CAAC,CAAA;;;;;uBAnGpL,OAAO,iBAAiB,EAAE,QAAQ;;;;;0BAClC,OAAO,yBAAyB,EAAE,OAAO"}
|
|
@@ -66,9 +66,16 @@ export function createTestViewContext(viewFactoryOptions = {}) {
|
|
|
66
66
|
/** @type {(callback: () => void) => void} */ (
|
|
67
67
|
(callback) => callback()
|
|
68
68
|
),
|
|
69
|
+
transition: (/** @type {any} */ options) => {
|
|
70
|
+
const to = typeof options.to === "number" ? options.to : 1;
|
|
71
|
+
options.onUpdate(to);
|
|
72
|
+
return Promise.resolve();
|
|
73
|
+
},
|
|
69
74
|
})
|
|
70
75
|
),
|
|
71
76
|
|
|
77
|
+
requestLayoutReflow: () => undefined,
|
|
78
|
+
|
|
72
79
|
isViewConfiguredVisible: () => true,
|
|
73
80
|
|
|
74
81
|
//...partialContext,
|
|
@@ -100,7 +107,6 @@ export async function createAndInitialize(spec, viewClass) {
|
|
|
100
107
|
const view = await create(spec, viewClass);
|
|
101
108
|
|
|
102
109
|
checkForDuplicateScaleNames(view);
|
|
103
|
-
|
|
104
110
|
if (view instanceof UnitView) {
|
|
105
111
|
view.mark.initializeEncoders();
|
|
106
112
|
} else if (view instanceof ContainerView) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"unitView.d.ts","sourceRoot":"","sources":["../../../src/view/unitView.js"],"names":[],"mappings":"AA6BA;;;;GAIG;AACH,wBAHU,MAAM,CAAC,OAAO,iBAAiB,EAAE,QAAQ,EAAE,cAAc,kBAAkB,EAAE,OAAO,CAAC,CAc7F;AAEF;IAeI;;;;;;;;OAQG;IACH,kBAPW,OAAO,iBAAiB,EAAE,QAAQ,WAClC,OAAO,yBAAyB,EAAE,OAAO,gBACzC,OAAO,oBAAoB,EAAE,OAAO,cACpC,OAAO,WAAW,EAAE,OAAO,QAC3B,MAAM,YACN,OAAO,WAAW,EAAE,WAAW,EAyCzC;IApCG,yCAAgB;IAIZ,iDAAiD;IACjD,MADW,OAAO,kBAAkB,EAAE,OAAO,CACnB;IAoKlC,2DAIC;IAgBD;;;;;OAKG;IAEH,
|
|
1
|
+
{"version":3,"file":"unitView.d.ts","sourceRoot":"","sources":["../../../src/view/unitView.js"],"names":[],"mappings":"AA6BA;;;;GAIG;AACH,wBAHU,MAAM,CAAC,OAAO,iBAAiB,EAAE,QAAQ,EAAE,cAAc,kBAAkB,EAAE,OAAO,CAAC,CAc7F;AAEF;IAeI;;;;;;;;OAQG;IACH,kBAPW,OAAO,iBAAiB,EAAE,QAAQ,WAClC,OAAO,yBAAyB,EAAE,OAAO,gBACzC,OAAO,oBAAoB,EAAE,OAAO,cACpC,OAAO,WAAW,EAAE,OAAO,QAC3B,MAAM,YACN,OAAO,WAAW,EAAE,WAAW,EAyCzC;IApCG,yCAAgB;IAIZ,iDAAiD;IACjD,MADW,OAAO,kBAAkB,EAAE,OAAO,CACnB;IAoKlC,2DAIC;IAgBD;;;;;OAKG;IAEH,iEAyJC;IAUD;;;;;OAKG;IACH,4IAMC;IAkBD;;OAEG;IACH,uDAEC;IAED;;;;;;;;;;;;;OAaG;IACH,uEAHW,OAAO,oBAAoB,EAAE,IAAI,iDAqB3C;IAED,uBAQC;IAgBD;;;;OAIG;IACH,8BAJW,MAAM,+DAEJ,OAAO,iBAAiB,EAAE,kBAAkB,CAKxD;;CACJ;iBAvgBgB,WAAW"}
|
|
@@ -4,7 +4,7 @@ import RuleMark from "../marks/rule.js";
|
|
|
4
4
|
import LinkMark from "../marks/link.js";
|
|
5
5
|
import TextMark from "../marks/text.js";
|
|
6
6
|
|
|
7
|
-
import ScaleResolution from "
|
|
7
|
+
import ScaleResolution from "../scales/scaleResolution.js";
|
|
8
8
|
import {
|
|
9
9
|
isPositionalChannel,
|
|
10
10
|
isChannelDefWithScale,
|
|
@@ -15,7 +15,7 @@ import {
|
|
|
15
15
|
isValueDefWithCondition,
|
|
16
16
|
} from "../encoder/encoder.js";
|
|
17
17
|
import createDomain from "../utils/domainArray.js";
|
|
18
|
-
import AxisResolution from "
|
|
18
|
+
import AxisResolution from "../scales/axisResolution.js";
|
|
19
19
|
import View from "./view.js";
|
|
20
20
|
import {
|
|
21
21
|
asSelectionConfig,
|
|
@@ -348,22 +348,47 @@ export default class UnitView extends View {
|
|
|
348
348
|
targetChannel
|
|
349
349
|
);
|
|
350
350
|
}
|
|
351
|
-
view.resolutions[type][targetChannel]
|
|
351
|
+
const resolution = view.resolutions[type][targetChannel];
|
|
352
|
+
const unregister = resolution.registerMember({
|
|
352
353
|
view: this,
|
|
353
354
|
channel,
|
|
354
355
|
channelDef: channelDefWithScale,
|
|
355
356
|
});
|
|
357
|
+
this.registerDisposer(() => {
|
|
358
|
+
// Unregister returns true when it removed the last member.
|
|
359
|
+
if (
|
|
360
|
+
unregister() &&
|
|
361
|
+
view.resolutions[type][targetChannel] === resolution
|
|
362
|
+
) {
|
|
363
|
+
delete view.resolutions[type][targetChannel];
|
|
364
|
+
}
|
|
365
|
+
});
|
|
356
366
|
} else if (type == "scale" && isChannelWithScale(channel)) {
|
|
357
367
|
if (!view.resolutions[type][targetChannel]) {
|
|
358
368
|
const resolution = new ScaleResolution(targetChannel);
|
|
359
369
|
view.resolutions[type][targetChannel] = resolution;
|
|
360
370
|
|
|
361
|
-
|
|
362
|
-
|
|
371
|
+
const updateRangeTexture = (
|
|
372
|
+
/** @type {import("../types/scaleResolutionApi.js").ScaleResolutionEvent} */ event
|
|
373
|
+
) => {
|
|
374
|
+
// Create if WebGLHelper is available, i.e., if not running in headless mode.
|
|
375
|
+
// Domain changes can alter discrete texture sizes as well.
|
|
363
376
|
this.context.glHelper?.createRangeTexture(
|
|
364
377
|
event.scaleResolution,
|
|
365
378
|
true
|
|
366
379
|
);
|
|
380
|
+
};
|
|
381
|
+
resolution.addEventListener("range", updateRangeTexture);
|
|
382
|
+
resolution.addEventListener("domain", updateRangeTexture);
|
|
383
|
+
this.registerDisposer(() => {
|
|
384
|
+
resolution.removeEventListener(
|
|
385
|
+
"range",
|
|
386
|
+
updateRangeTexture
|
|
387
|
+
);
|
|
388
|
+
resolution.removeEventListener(
|
|
389
|
+
"domain",
|
|
390
|
+
updateRangeTexture
|
|
391
|
+
);
|
|
367
392
|
});
|
|
368
393
|
}
|
|
369
394
|
|
|
@@ -378,12 +403,22 @@ export default class UnitView extends View {
|
|
|
378
403
|
? undefined
|
|
379
404
|
: this.extractDataDomain.bind(this);
|
|
380
405
|
|
|
381
|
-
view.resolutions[type][targetChannel]
|
|
406
|
+
const resolution = view.resolutions[type][targetChannel];
|
|
407
|
+
const unregister = resolution.registerMember({
|
|
382
408
|
view: this,
|
|
383
409
|
channel,
|
|
384
410
|
channelDef: channelDefWithScale,
|
|
385
411
|
dataDomainSource,
|
|
386
412
|
});
|
|
413
|
+
this.registerDisposer(() => {
|
|
414
|
+
// Unregister returns true when it removed the last member.
|
|
415
|
+
if (
|
|
416
|
+
unregister() &&
|
|
417
|
+
view.resolutions[type][targetChannel] === resolution
|
|
418
|
+
) {
|
|
419
|
+
delete view.resolutions[type][targetChannel];
|
|
420
|
+
}
|
|
421
|
+
});
|
|
387
422
|
}
|
|
388
423
|
}
|
|
389
424
|
}
|
|
@@ -393,39 +428,9 @@ export default class UnitView extends View {
|
|
|
393
428
|
*/
|
|
394
429
|
dispose() {
|
|
395
430
|
super.dispose();
|
|
396
|
-
|
|
397
|
-
this.#unresolve();
|
|
398
431
|
this.mark.dispose();
|
|
399
432
|
}
|
|
400
433
|
|
|
401
|
-
#unresolve() {
|
|
402
|
-
for (const view of this.getDataAncestors()) {
|
|
403
|
-
for (const [channel, resolution] of Object.entries(
|
|
404
|
-
view.resolutions.scale
|
|
405
|
-
)) {
|
|
406
|
-
if (
|
|
407
|
-
resolution &&
|
|
408
|
-
resolution.removeMembersByView(this) &&
|
|
409
|
-
resolution.members.length === 0
|
|
410
|
-
) {
|
|
411
|
-
delete view.resolutions.scale[channel];
|
|
412
|
-
}
|
|
413
|
-
}
|
|
414
|
-
|
|
415
|
-
for (const [channel, resolution] of Object.entries(
|
|
416
|
-
view.resolutions.axis
|
|
417
|
-
)) {
|
|
418
|
-
if (
|
|
419
|
-
resolution &&
|
|
420
|
-
resolution.removeMembersByView(this) &&
|
|
421
|
-
resolution.members.length === 0
|
|
422
|
-
) {
|
|
423
|
-
delete view.resolutions.axis[channel];
|
|
424
|
-
}
|
|
425
|
-
}
|
|
426
|
-
}
|
|
427
|
-
}
|
|
428
|
-
|
|
429
434
|
/**
|
|
430
435
|
* Returns an accessor that accesses a field or an evaluated expression,
|
|
431
436
|
* if there is one.
|