@visactor/vgrammar-core 0.14.0-alpha.2 → 0.14.0-alpha.4
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/cjs/component/axis.d.ts +2 -0
- package/cjs/component/axis.js +15 -1
- package/cjs/component/axis.js.map +1 -1
- package/cjs/component/grid.d.ts +2 -0
- package/cjs/component/grid.js +15 -1
- package/cjs/component/grid.js.map +1 -1
- package/cjs/component/index.d.ts +2 -2
- package/cjs/component/index.js +21 -1
- package/cjs/component/index.js.map +1 -1
- package/cjs/core/factory.d.ts +8 -1
- package/cjs/core/factory.js +8 -1
- package/cjs/core/factory.js.map +1 -1
- package/cjs/glyph/boxplot.js +5 -5
- package/cjs/glyph/boxplot.js.map +1 -1
- package/cjs/glyph/link-path.js +2 -2
- package/cjs/glyph/link-path.js.map +1 -1
- package/cjs/glyph/ripple.js +3 -2
- package/cjs/glyph/ripple.js.map +1 -1
- package/cjs/glyph/tree-path.js +2 -2
- package/cjs/glyph/tree-path.js.map +1 -1
- package/cjs/glyph/violin.js +4 -4
- package/cjs/glyph/violin.js.map +1 -1
- package/cjs/glyph/wave.js +3 -2
- package/cjs/glyph/wave.js.map +1 -1
- package/cjs/graph/animation/animation/update.js +2 -2
- package/cjs/graph/animation/animation/update.js.map +1 -1
- package/cjs/graph/animation/morph.d.ts +2 -12
- package/cjs/graph/animation/morph.js +76 -163
- package/cjs/graph/animation/morph.js.map +1 -1
- package/cjs/graph/attributes/line.d.ts +1 -0
- package/cjs/graph/attributes/line.js +17 -5
- package/cjs/graph/attributes/line.js.map +1 -1
- package/cjs/graph/canvas-renderer.d.ts +1 -1
- package/cjs/graph/canvas-renderer.js +4 -4
- package/cjs/graph/canvas-renderer.js.map +1 -1
- package/cjs/graph/constants.d.ts +1 -0
- package/cjs/graph/constants.js +2 -2
- package/cjs/graph/constants.js.map +1 -1
- package/cjs/graph/element.d.ts +1 -0
- package/cjs/graph/element.js +18 -11
- package/cjs/graph/element.js.map +1 -1
- package/cjs/graph/glyph-element.js +7 -6
- package/cjs/graph/glyph-element.js.map +1 -1
- package/cjs/graph/layout/layout.d.ts +1 -0
- package/cjs/graph/layout/layout.js +8 -2
- package/cjs/graph/layout/layout.js.map +1 -1
- package/cjs/graph/mark/graphic.js +14 -8
- package/cjs/graph/mark/graphic.js.map +1 -1
- package/cjs/graph/util/point.js +10 -26
- package/cjs/graph/util/point.js.map +1 -1
- package/cjs/graph/view-diff.d.ts +8 -0
- package/cjs/graph/view-diff.js +93 -0
- package/cjs/graph/view-diff.js.map +1 -0
- package/cjs/index.d.ts +8 -1
- package/cjs/index.js +66 -2
- package/cjs/index.js.map +1 -1
- package/cjs/interactions/brush-base.js +1 -2
- package/cjs/interactions/brush-filter.js +2 -1
- package/cjs/interactions/fish-eye.js +1 -2
- package/cjs/interactions/index.js +2 -1
- package/cjs/interactions/tooltip.js +1 -1
- package/cjs/parse/event.d.ts +0 -2
- package/cjs/parse/event.js +4 -10
- package/cjs/parse/event.js.map +1 -1
- package/cjs/parse/util.js.map +1 -1
- package/cjs/transforms/mark/mark-overlap.js +6 -6
- package/cjs/transforms/mark/mark-overlap.js.map +1 -1
- package/cjs/types/element.d.ts +1 -1
- package/cjs/types/element.js.map +1 -1
- package/cjs/types/morph.d.ts +1 -2
- package/cjs/types/morph.js.map +1 -1
- package/cjs/types/renderer.d.ts +6 -1
- package/cjs/types/renderer.js.map +1 -1
- package/cjs/view/View.d.ts +3 -6
- package/cjs/view/View.js +52 -105
- package/cjs/view/View.js.map +1 -1
- package/cjs/view/animate.js +2 -1
- package/cjs/view/animate.js.map +1 -1
- package/cjs/view/constants.d.ts +2 -0
- package/cjs/view/constants.js +3 -2
- package/cjs/view/constants.js.map +1 -1
- package/cjs/view/events.d.ts +0 -1
- package/cjs/view/events.js +3 -17
- package/cjs/view/events.js.map +1 -1
- package/cjs/view/glyph.d.ts +4 -0
- package/cjs/view/glyph.js +12 -3
- package/cjs/view/glyph.js.map +1 -1
- package/cjs/view/group.js +3 -3
- package/cjs/view/group.js.map +1 -1
- package/cjs/view/mark-animate-mixin.d.ts +1 -0
- package/cjs/view/mark-animate-mixin.js +29 -0
- package/cjs/view/mark-animate-mixin.js.map +1 -0
- package/cjs/view/mark.d.ts +2 -0
- package/cjs/view/mark.js +30 -23
- package/cjs/view/mark.js.map +1 -1
- package/cjs/view/view-animate-mixin.d.ts +1 -0
- package/cjs/view/view-animate-mixin.js +26 -0
- package/cjs/view/view-animate-mixin.js.map +1 -0
- package/cjs/view/view-event-mixin.d.ts +1 -0
- package/cjs/view/view-event-mixin.js +92 -0
- package/cjs/view/view-event-mixin.js.map +1 -0
- package/cjs/view/view-morph-mixin.d.ts +1 -0
- package/cjs/view/view-morph-mixin.js +32 -0
- package/cjs/view/view-morph-mixin.js.map +1 -0
- package/es/component/axis.d.ts +2 -0
- package/es/component/axis.js +10 -0
- package/es/component/axis.js.map +1 -1
- package/es/component/grid.d.ts +2 -0
- package/es/component/grid.js +10 -0
- package/es/component/grid.js.map +1 -1
- package/es/component/index.d.ts +2 -2
- package/es/component/index.js +2 -2
- package/es/component/index.js.map +1 -1
- package/es/core/factory.d.ts +8 -1
- package/es/core/factory.js +8 -1
- package/es/core/factory.js.map +1 -1
- package/es/glyph/boxplot.js +4 -2
- package/es/glyph/boxplot.js.map +1 -1
- package/es/glyph/link-path.js +4 -2
- package/es/glyph/link-path.js.map +1 -1
- package/es/glyph/ripple.js +3 -1
- package/es/glyph/ripple.js.map +1 -1
- package/es/glyph/tree-path.js +4 -2
- package/es/glyph/tree-path.js.map +1 -1
- package/es/glyph/violin.js +4 -2
- package/es/glyph/violin.js.map +1 -1
- package/es/glyph/wave.js +3 -1
- package/es/glyph/wave.js.map +1 -1
- package/es/graph/animation/animation/update.js +1 -3
- package/es/graph/animation/animation/update.js.map +1 -1
- package/es/graph/animation/morph.d.ts +2 -12
- package/es/graph/animation/morph.js +72 -159
- package/es/graph/animation/morph.js.map +1 -1
- package/es/graph/attributes/line.d.ts +1 -0
- package/es/graph/attributes/line.js +14 -3
- package/es/graph/attributes/line.js.map +1 -1
- package/es/graph/canvas-renderer.d.ts +1 -1
- package/es/graph/canvas-renderer.js +5 -5
- package/es/graph/canvas-renderer.js.map +1 -1
- package/es/graph/constants.d.ts +1 -0
- package/es/graph/constants.js +2 -0
- package/es/graph/constants.js.map +1 -1
- package/es/graph/element.d.ts +1 -0
- package/es/graph/element.js +18 -13
- package/es/graph/element.js.map +1 -1
- package/es/graph/glyph-element.js +6 -8
- package/es/graph/glyph-element.js.map +1 -1
- package/es/graph/layout/layout.d.ts +1 -0
- package/es/graph/layout/layout.js +6 -0
- package/es/graph/layout/layout.js.map +1 -1
- package/es/graph/mark/graphic.js +13 -7
- package/es/graph/mark/graphic.js.map +1 -1
- package/es/graph/util/point.js +10 -26
- package/es/graph/util/point.js.map +1 -1
- package/es/graph/view-diff.d.ts +8 -0
- package/es/graph/view-diff.js +89 -0
- package/es/graph/view-diff.js.map +1 -0
- package/es/index.d.ts +8 -1
- package/es/index.js +29 -1
- package/es/index.js.map +1 -1
- package/es/interactions/element-active.js +1 -2
- package/es/interactions/element-highlight-by-group.js +2 -1
- package/es/interactions/fish-eye.js +1 -1
- package/es/parse/event.d.ts +0 -2
- package/es/parse/event.js +3 -7
- package/es/parse/event.js.map +1 -1
- package/es/parse/option.js +1 -2
- package/es/parse/scale.js +2 -1
- package/es/parse/util.js.map +1 -1
- package/es/transforms/mark/mark-overlap.js +6 -6
- package/es/transforms/mark/mark-overlap.js.map +1 -1
- package/es/types/element.d.ts +1 -1
- package/es/types/element.js.map +1 -1
- package/es/types/morph.d.ts +1 -2
- package/es/types/morph.js.map +1 -1
- package/es/types/renderer.d.ts +6 -1
- package/es/types/renderer.js.map +1 -1
- package/es/view/View.d.ts +3 -6
- package/es/view/View.js +53 -114
- package/es/view/View.js.map +1 -1
- package/es/view/animate.js +2 -1
- package/es/view/animate.js.map +1 -1
- package/es/view/constants.d.ts +2 -0
- package/es/view/constants.js +4 -0
- package/es/view/constants.js.map +1 -1
- package/es/view/events.d.ts +0 -1
- package/es/view/events.js +1 -15
- package/es/view/events.js.map +1 -1
- package/es/view/glyph.d.ts +4 -0
- package/es/view/glyph.js +11 -0
- package/es/view/glyph.js.map +1 -1
- package/es/view/group.js +2 -4
- package/es/view/group.js.map +1 -1
- package/es/view/mark-animate-mixin.d.ts +1 -0
- package/es/view/mark-animate-mixin.js +25 -0
- package/es/view/mark-animate-mixin.js.map +1 -0
- package/es/view/mark.d.ts +2 -0
- package/es/view/mark.js +30 -25
- package/es/view/mark.js.map +1 -1
- package/es/view/view-animate-mixin.d.ts +1 -0
- package/es/view/view-animate-mixin.js +16 -0
- package/es/view/view-animate-mixin.js.map +1 -0
- package/es/view/view-event-mixin.d.ts +1 -0
- package/es/view/view-event-mixin.js +90 -0
- package/es/view/view-event-mixin.js.map +1 -0
- package/es/view/view-morph-mixin.d.ts +1 -0
- package/es/view/view-morph-mixin.js +22 -0
- package/es/view/view-morph-mixin.js.map +1 -0
- package/package.json +12 -12
- package/cjs/graph/util/element.d.ts +0 -2
- package/cjs/graph/util/element.js +0 -10
- package/cjs/graph/util/element.js.map +0 -1
- package/es/graph/util/element.d.ts +0 -2
- package/es/graph/util/element.js +0 -8
- package/es/graph/util/element.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/transforms/mark/mark-overlap.ts"],"names":[],"mappings":"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","file":"mark-overlap.js","sourcesContent":["import { isNil } from '@visactor/vutils';\nimport type { IElement, MarkOverlapTransformOptions } from '../../types';\n\nconst HIDE_KEY = '_mo_hide_';\n\nfunction reset(elements: IElement[]) {\n elements.forEach(element => {\n const hide = element.getGraphicAttribute(HIDE_KEY);\n\n if (hide) {\n element.setGraphicAttribute('visible', true);\n element.setGraphicAttribute(HIDE_KEY, false);\n }\n });\n return elements;\n}\n\nfunction overlapX(elements: IElement[], delta: number, deltaMul: number, useRadius: boolean) {\n if (useRadius) {\n let lastX = -Infinity;\n let lastR = 0;\n const useDeltaMul = isNil(delta);\n let itemDelta = delta;\n\n elements.forEach(element => {\n if (element.getGraphicAttribute('visible') === false) {\n // skip hidden points\n return;\n }\n\n const r = element.getGraphicAttribute('size') / 2;\n const currentX = element.getGraphicAttribute('x');\n if (useDeltaMul) {\n itemDelta = (r + lastR) * deltaMul;\n }\n if (Math.abs(currentX - lastX) < itemDelta + lastR + r) {\n if (!element.getGraphicAttribute('forceShow')) {\n element.setGraphicAttribute(HIDE_KEY, true);\n element.setGraphicAttribute('visible', false);\n }\n } else {\n lastX = currentX;\n }\n\n lastR = r;\n });\n }\n}\n\nfunction overlapY(elements: IElement[], delta: number, deltaMul: number, useRadius: boolean) {\n if (useRadius) {\n let lastY = -Infinity;\n let lastR = 0;\n const useDeltaMul = isNil(delta);\n let itemDelta = delta;\n\n elements.forEach(element => {\n if (element.getGraphicAttribute('visible') === false) {\n // skip hidden points\n return;\n }\n\n const r = element.getGraphicAttribute('size') / 2;\n const currentY = element.getGraphicAttribute('y');\n if (useDeltaMul) {\n itemDelta = (r + lastR) * deltaMul;\n }\n if (Math.abs(currentY - lastY) < itemDelta + lastR + r) {\n if (!element.getGraphicAttribute('forceShow')) {\n element.setGraphicAttribute(HIDE_KEY, true);\n element.setGraphicAttribute('visible', false);\n }\n } else {\n lastY = currentY;\n }\n\n lastR = r;\n });\n }\n}\n\nfunction overlapXY(elements: IElement[], delta: number, deltaMul: number, useRadius: boolean) {\n if (useRadius) {\n const lastX = -Infinity;\n let lastY = -Infinity;\n let lastR = 0;\n let dis = 0;\n const useDeltaMul = isNil(delta);\n let itemDelta = delta;\n\n elements.forEach(element => {\n if (element.getGraphicAttribute('visible') === false) {\n // skip hidden points\n return;\n }\n\n const r = element.getGraphicAttribute('size') / 2;\n const currentX = element.getGraphicAttribute('x');\n const currentY = element.getGraphicAttribute('y');\n\n if (useDeltaMul) {\n itemDelta = (r + lastR) * deltaMul;\n }\n dis = (lastX - currentX) ** 2 + (lastY - currentY) ** 2;\n if (dis < (itemDelta + lastR + r) ** 2) {\n if (!element.getGraphicAttribute('forceShow')) {\n element.setGraphicAttribute(HIDE_KEY, true);\n element.setGraphicAttribute('visible', false);\n }\n } else {\n lastY = currentY;\n }\n\n lastR = r;\n });\n }\n}\n\n/**\n * 针对mark的防重叠\n * @param {object} options - The parameters for this operator.\n * @param {data} [options.followMark]\n * @constructor\n */\nexport const transform = (options: MarkOverlapTransformOptions, upstreamData: IElement[]) => {\n if (!upstreamData || upstreamData.length === 0) {\n return;\n }\n let { radius } = options;\n if (isNil(radius)) {\n if (upstreamData[0].mark.markType === 'symbol') {\n radius = true;\n }\n }\n\n const { direction, delta, deltaMul = 1, groupBy } = options;\n\n const handleOverlap = (elements: IElement[]) => {\n reset(elements);\n\n const sortedElements = options.sort\n ? elements.slice().sort((a, b) => {\n return a.getGraphicAttribute('x') - b.getGraphicAttribute('x');\n })\n : elements;\n\n if (direction === 0) {\n overlapXY(sortedElements, delta, deltaMul, radius);\n } else if (direction === 1) {\n overlapX(sortedElements, delta, deltaMul, radius);\n } else {\n overlapY(sortedElements, delta, deltaMul, radius);\n }\n };\n\n if (!groupBy) {\n handleOverlap(upstreamData);\n } else {\n // 分组\n const map = upstreamData.reduce((res: { [key: string]: IElement[] }, element: IElement) => {\n const groupName = element.getDatum()[groupBy];\n\n if (res[groupName]) {\n res[groupName].push(element);\n } else {\n res[groupName] = [element];\n }\n\n return res;\n }, {});\n\n Object.keys(map).forEach(key => {\n handleOverlap(map[key]);\n });\n }\n\n return upstreamData;\n};\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/transforms/mark/mark-overlap.ts"],"names":[],"mappings":"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","file":"mark-overlap.js","sourcesContent":["import { isNil } from '@visactor/vutils';\nimport type { IElement, MarkOverlapTransformOptions } from '../../types';\nimport { MARK_OVERLAP_HIDE_KEY } from '../../graph/constants';\n\nfunction reset(elements: IElement[]) {\n elements.forEach(element => {\n const hide = element.getGraphicAttribute(MARK_OVERLAP_HIDE_KEY);\n\n if (hide) {\n element.setGraphicAttribute('visible', true);\n element.setGraphicAttribute(MARK_OVERLAP_HIDE_KEY, false);\n }\n });\n return elements;\n}\n\nfunction overlapX(elements: IElement[], delta: number, deltaMul: number, useRadius: boolean) {\n if (useRadius) {\n let lastX = -Infinity;\n let lastR = 0;\n const useDeltaMul = isNil(delta);\n let itemDelta = delta;\n\n elements.forEach(element => {\n if (element.getGraphicAttribute('visible') === false) {\n // skip hidden points\n return;\n }\n\n const r = element.getGraphicAttribute('size') / 2;\n const currentX = element.getGraphicAttribute('x');\n if (useDeltaMul) {\n itemDelta = (r + lastR) * deltaMul;\n }\n if (Math.abs(currentX - lastX) < itemDelta + lastR + r) {\n if (!element.getGraphicAttribute('forceShow')) {\n element.setGraphicAttribute(MARK_OVERLAP_HIDE_KEY, true);\n element.setGraphicAttribute('visible', false);\n }\n } else {\n lastX = currentX;\n }\n\n lastR = r;\n });\n }\n}\n\nfunction overlapY(elements: IElement[], delta: number, deltaMul: number, useRadius: boolean) {\n if (useRadius) {\n let lastY = -Infinity;\n let lastR = 0;\n const useDeltaMul = isNil(delta);\n let itemDelta = delta;\n\n elements.forEach(element => {\n if (element.getGraphicAttribute('visible') === false) {\n // skip hidden points\n return;\n }\n\n const r = element.getGraphicAttribute('size') / 2;\n const currentY = element.getGraphicAttribute('y');\n if (useDeltaMul) {\n itemDelta = (r + lastR) * deltaMul;\n }\n if (Math.abs(currentY - lastY) < itemDelta + lastR + r) {\n if (!element.getGraphicAttribute('forceShow')) {\n element.setGraphicAttribute(MARK_OVERLAP_HIDE_KEY, true);\n element.setGraphicAttribute('visible', false);\n }\n } else {\n lastY = currentY;\n }\n\n lastR = r;\n });\n }\n}\n\nfunction overlapXY(elements: IElement[], delta: number, deltaMul: number, useRadius: boolean) {\n if (useRadius) {\n const lastX = -Infinity;\n let lastY = -Infinity;\n let lastR = 0;\n let dis = 0;\n const useDeltaMul = isNil(delta);\n let itemDelta = delta;\n\n elements.forEach(element => {\n if (element.getGraphicAttribute('visible') === false) {\n // skip hidden points\n return;\n }\n\n const r = element.getGraphicAttribute('size') / 2;\n const currentX = element.getGraphicAttribute('x');\n const currentY = element.getGraphicAttribute('y');\n\n if (useDeltaMul) {\n itemDelta = (r + lastR) * deltaMul;\n }\n dis = (lastX - currentX) ** 2 + (lastY - currentY) ** 2;\n if (dis < (itemDelta + lastR + r) ** 2) {\n if (!element.getGraphicAttribute('forceShow')) {\n element.setGraphicAttribute(MARK_OVERLAP_HIDE_KEY, true);\n element.setGraphicAttribute('visible', false);\n }\n } else {\n lastY = currentY;\n }\n\n lastR = r;\n });\n }\n}\n\n/**\n * 针对mark的防重叠\n * @param {object} options - The parameters for this operator.\n * @param {data} [options.followMark]\n * @constructor\n */\nexport const transform = (options: MarkOverlapTransformOptions, upstreamData: IElement[]) => {\n if (!upstreamData || upstreamData.length === 0) {\n return;\n }\n let { radius } = options;\n if (isNil(radius)) {\n if (upstreamData[0].mark.markType === 'symbol') {\n radius = true;\n }\n }\n\n const { direction, delta, deltaMul = 1, groupBy } = options;\n\n const handleOverlap = (elements: IElement[]) => {\n reset(elements);\n\n const sortedElements = options.sort\n ? elements.slice().sort((a, b) => {\n return a.getGraphicAttribute('x') - b.getGraphicAttribute('x');\n })\n : elements;\n\n if (direction === 0) {\n overlapXY(sortedElements, delta, deltaMul, radius);\n } else if (direction === 1) {\n overlapX(sortedElements, delta, deltaMul, radius);\n } else {\n overlapY(sortedElements, delta, deltaMul, radius);\n }\n };\n\n if (!groupBy) {\n handleOverlap(upstreamData);\n } else {\n // 分组\n const map = upstreamData.reduce((res: { [key: string]: IElement[] }, element: IElement) => {\n const groupName = element.getDatum()[groupBy];\n\n if (res[groupName]) {\n res[groupName].push(element);\n } else {\n res[groupName] = [element];\n }\n\n return res;\n }, {});\n\n Object.keys(map).forEach(key => {\n handleOverlap(map[key]);\n });\n }\n\n return upstreamData;\n};\n"]}
|
package/es/types/element.d.ts
CHANGED
|
@@ -69,7 +69,7 @@ export interface IElement {
|
|
|
69
69
|
setItemAttributes: (attributes: {
|
|
70
70
|
[channel: string]: any;
|
|
71
71
|
} | any[]) => void;
|
|
72
|
-
updateData: (groupKey: string, data: any[], keyGenerator: MarkKeySpec
|
|
72
|
+
updateData: (groupKey: string, data: any[], keyGenerator: MarkKeySpec) => void;
|
|
73
73
|
state: (markState: MarkFunctionType<string | string[]>, parameters?: any) => void;
|
|
74
74
|
encodeItems: (items: MarkElementItem[], encoders: BaseEncodeSpec, isReentered?: boolean, parameters?: any) => void;
|
|
75
75
|
encodeGraphic: (attributes?: any) => void;
|
package/es/types/element.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/types/element.ts"],"names":[],"mappings":"","file":"element.js","sourcesContent":["import type {\n IArc,\n IArc3d,\n IArea,\n ICircle,\n IGlyph,\n IGraphic,\n IGroup,\n IImage,\n ILine,\n IPath,\n IPolygon,\n IPyramid3d,\n IRect,\n IRect3d,\n IRichText,\n ISymbol,\n IText\n} from '@visactor/vrender-core';\nimport type { DiffState } from '../graph/enums';\nimport type { IMark, IGlyphMark } from './grammar';\nimport type {\n BaseEncodeSpec,\n BaseSingleEncodeSpec,\n IMarkConfig,\n MarkFunctionType,\n MarkKeySpec,\n MarkType\n} from './mark';\n\nexport interface ElementGraphicMap {\n circle: ICircle;\n arc: IArc;\n area: IArea;\n image: IImage;\n line: ILine;\n path: IPath;\n rule: ILine;\n shape: IPath;\n symbol: ISymbol;\n text: IText;\n richtext: IRichText;\n polygon: IPolygon;\n cell: ISymbol;\n interval: IGraphic;\n rect: IRect;\n rect3d: IRect3d;\n arc3d: IArc3d;\n pyramid3d: IPyramid3d;\n group: IGroup;\n glyph: IGlyph;\n linkPath: IGlyph;\n treePath: IGlyph;\n wave: IGlyph;\n ripplePoint: IGlyph;\n barBoxplot: IGlyph;\n boxPlot: IGlyph;\n component: IGroup;\n axis: IGroup;\n legend: IGroup;\n corsshair: IGroup;\n slider: IGroup;\n datazoom: IGroup;\n label: IGroup;\n player: IGroup;\n}\n\nexport type GetGraphicByType<T> = T extends keyof ElementGraphicMap ? ElementGraphicMap[T] : IGraphic;\n\n/**\n * 保存graphicItem状态\n */\nexport interface MarkElementItem {\n /** 唯一key */\n key: string;\n /** 原始数据 */\n datum: any;\n /** VGrammar view */\n view: any;\n /** 当前渲染帧下graphicItem对应的最新属性 */\n nextAttrs?: any;\n /** 是否初始化过,用于解决collection mark对应的item,可能跳过enter状态的问题 */\n // hasEntered: boolean;\n}\nexport interface IElement {\n mark: IMark;\n isReserved: boolean;\n diffState: DiffState;\n key: string;\n groupKey?: string;\n data?: any[];\n /**\n * 不推荐使用,但是collection图元暂时可能回涉及到相关修改\n */\n items: MarkElementItem[];\n\n initGraphicItem: (attrs?: any) => void;\n updateGraphicItem: () => void;\n\n getDatum: () => any;\n getBounds: () => any;\n getGraphicItem: () => IGraphic;\n removeGraphicItem: () => void;\n resetGraphicItem: () => void;\n\n /**\n * 获取 graphic 视觉通道属性\n * @param channel 视觉通道\n * @param prev 是否从之前的 graphic 属性上获取,默认为 false\n * @returns 视觉通道值\n */\n getGraphicAttribute: (channel: string, prev?: boolean) => any;\n /**\n * 设置 graphic 视觉通道属性\n * @param channel 视觉通道\n * @param value 视觉通道属性\n * @param final 是否更新 graphic 最终变更的视觉通道结果,默认为 false\n */\n setGraphicAttribute: (channel: string, value: any, final?: boolean) => void;\n /**\n * 设置一系列 graphic 视觉通道属性\n * @param attributes 视觉通道键值对\n * @param final 是否更新 graphic 最终变更的视觉通道结果,默认为 false\n */\n setGraphicAttributes: (attributes: { [channel: string]: any }, final?: boolean) => void;\n\n /**\n * 【慎重使用】获取 VGrammar 自身的视觉通道属性\n * 只有在 'afterEncodeItems' 时机的mark transform中才能调用\n */\n getItemAttribute: (channel?: string) => any;\n /**\n * 【慎重使用】设置 VGrammar 自身的视觉通道\n * 只有在 'afterEncodeItems' 时机的mark transform中才能调用\n * @param attributes\n * @returns\n */\n setItemAttributes: (attributes: { [channel: string]: any } | any[]) => void;\n\n // element 执行流程相关接口\n updateData: (groupKey: string, data: any[], keyGenerator: MarkKeySpec
|
|
1
|
+
{"version":3,"sources":["../src/types/element.ts"],"names":[],"mappings":"","file":"element.js","sourcesContent":["import type {\n IArc,\n IArc3d,\n IArea,\n ICircle,\n IGlyph,\n IGraphic,\n IGroup,\n IImage,\n ILine,\n IPath,\n IPolygon,\n IPyramid3d,\n IRect,\n IRect3d,\n IRichText,\n ISymbol,\n IText\n} from '@visactor/vrender-core';\nimport type { DiffState } from '../graph/enums';\nimport type { IMark, IGlyphMark } from './grammar';\nimport type {\n BaseEncodeSpec,\n BaseSingleEncodeSpec,\n IMarkConfig,\n MarkFunctionType,\n MarkKeySpec,\n MarkType\n} from './mark';\n\nexport interface ElementGraphicMap {\n circle: ICircle;\n arc: IArc;\n area: IArea;\n image: IImage;\n line: ILine;\n path: IPath;\n rule: ILine;\n shape: IPath;\n symbol: ISymbol;\n text: IText;\n richtext: IRichText;\n polygon: IPolygon;\n cell: ISymbol;\n interval: IGraphic;\n rect: IRect;\n rect3d: IRect3d;\n arc3d: IArc3d;\n pyramid3d: IPyramid3d;\n group: IGroup;\n glyph: IGlyph;\n linkPath: IGlyph;\n treePath: IGlyph;\n wave: IGlyph;\n ripplePoint: IGlyph;\n barBoxplot: IGlyph;\n boxPlot: IGlyph;\n component: IGroup;\n axis: IGroup;\n legend: IGroup;\n corsshair: IGroup;\n slider: IGroup;\n datazoom: IGroup;\n label: IGroup;\n player: IGroup;\n}\n\nexport type GetGraphicByType<T> = T extends keyof ElementGraphicMap ? ElementGraphicMap[T] : IGraphic;\n\n/**\n * 保存graphicItem状态\n */\nexport interface MarkElementItem {\n /** 唯一key */\n key: string;\n /** 原始数据 */\n datum: any;\n /** VGrammar view */\n view: any;\n /** 当前渲染帧下graphicItem对应的最新属性 */\n nextAttrs?: any;\n /** 是否初始化过,用于解决collection mark对应的item,可能跳过enter状态的问题 */\n // hasEntered: boolean;\n}\nexport interface IElement {\n mark: IMark;\n isReserved: boolean;\n diffState: DiffState;\n key: string;\n groupKey?: string;\n data?: any[];\n /**\n * 不推荐使用,但是collection图元暂时可能回涉及到相关修改\n */\n items: MarkElementItem[];\n\n initGraphicItem: (attrs?: any) => void;\n updateGraphicItem: () => void;\n\n getDatum: () => any;\n getBounds: () => any;\n getGraphicItem: () => IGraphic;\n removeGraphicItem: () => void;\n resetGraphicItem: () => void;\n\n /**\n * 获取 graphic 视觉通道属性\n * @param channel 视觉通道\n * @param prev 是否从之前的 graphic 属性上获取,默认为 false\n * @returns 视觉通道值\n */\n getGraphicAttribute: (channel: string, prev?: boolean) => any;\n /**\n * 设置 graphic 视觉通道属性\n * @param channel 视觉通道\n * @param value 视觉通道属性\n * @param final 是否更新 graphic 最终变更的视觉通道结果,默认为 false\n */\n setGraphicAttribute: (channel: string, value: any, final?: boolean) => void;\n /**\n * 设置一系列 graphic 视觉通道属性\n * @param attributes 视觉通道键值对\n * @param final 是否更新 graphic 最终变更的视觉通道结果,默认为 false\n */\n setGraphicAttributes: (attributes: { [channel: string]: any }, final?: boolean) => void;\n\n /**\n * 【慎重使用】获取 VGrammar 自身的视觉通道属性\n * 只有在 'afterEncodeItems' 时机的mark transform中才能调用\n */\n getItemAttribute: (channel?: string) => any;\n /**\n * 【慎重使用】设置 VGrammar 自身的视觉通道\n * 只有在 'afterEncodeItems' 时机的mark transform中才能调用\n * @param attributes\n * @returns\n */\n setItemAttributes: (attributes: { [channel: string]: any } | any[]) => void;\n\n // element 执行流程相关接口\n updateData: (groupKey: string, data: any[], keyGenerator: MarkKeySpec) => void;\n state: (markState: MarkFunctionType<string | string[]>, parameters?: any) => void;\n encodeItems: (items: MarkElementItem[], encoders: BaseEncodeSpec, isReentered?: boolean, parameters?: any) => void;\n encodeGraphic: (attributes?: any) => void;\n transformElementItems: (items: MarkElementItem[], markType: MarkType, computePoints?: boolean) => Record<string, any>;\n remove: () => void;\n release: () => void;\n\n // 动画相关接口\n\n getFinalGraphicAttributes: () => { [key: string]: any };\n getPrevGraphicAttributes: () => { [key: string]: any };\n getNextGraphicAttributes: () => { [key: string]: any };\n getFinalAnimationAttribute: (channel: string) => any;\n getFinalAnimationAttributes: () => { [key: string]: any };\n clearChangedGraphicAttributes: () => void;\n clearGraphicAttributes: () => void;\n\n // state相关接口\n getStates: () => string[];\n hasState: (state: string) => boolean;\n clearStates: (noAnimation?: boolean) => void;\n addState: (state: string | string[], attrs?: any) => boolean;\n removeState: (state: string | string[]) => boolean;\n useStates: (states: string[], noAnimation?: boolean) => boolean;\n updateStates: (states: Record<string, boolean | BaseSingleEncodeSpec>) => any;\n}\n\nexport interface IGlyphElement<P = any> extends IElement {\n mark: IGlyphMark;\n\n getGlyphGraphicItems: () => { [markName: string]: any };\n\n getGraphicAttribute: (channel: string, prev?: boolean, markName?: any) => any;\n setGraphicAttribute: (channel: string, value: any, final?: boolean, markName?: any) => void;\n setGraphicAttributes: (attributes: { [channel: string]: any }, final?: boolean, markName?: any) => void;\n\n getFinalGraphicAttributes: (markName?: string) => { [key: string]: any };\n getPrevGraphicAttributes: (markName?: string) => { [key: string]: any };\n getNextGraphicAttributes: (markName?: string) => { [key: string]: any };\n\n encodeCustom: (nextAttrs?: any) => { [markName: string]: any };\n}\n"]}
|
package/es/types/morph.d.ts
CHANGED
|
@@ -22,8 +22,7 @@ export interface IMorphAnimationConfig {
|
|
|
22
22
|
oneByOne?: MorphFunctionValueType<boolean | number>;
|
|
23
23
|
splitPath?: MorphFunctionValueType<'clone' | Nil>;
|
|
24
24
|
}
|
|
25
|
-
export interface
|
|
25
|
+
export interface IViewDiff {
|
|
26
26
|
diffGrammar: <U extends IGrammarBase>(prevGrammars: U[], nextGrammars: U[]) => DiffResult<U, U>;
|
|
27
27
|
diffMark: (prevMarks: IMark[], nextMarks: IMark[], runningConfig: IRunningConfig) => DiffResult<IMark[], IMark[]>;
|
|
28
|
-
morph: (prevMarks: IMark[], nextMarks: IMark[], runningConfig: IRunningConfig) => void;
|
|
29
28
|
}
|
package/es/types/morph.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/types/morph.ts"],"names":[],"mappings":"","file":"morph.js","sourcesContent":["import type { EasingType } from '@visactor/vrender-core';\nimport type { DiffResult, Nil } from './base';\nimport type { IElement } from './element';\nimport type { IGrammarBase, IMark } from './grammar';\nimport type { GenericFunctionType } from './signal';\nimport type { IRunningConfig } from './view';\n\nexport type MorphData = { prev: any[]; next: any[] };\nexport type MorphElements = { prev: IElement[]; next: IElement[] };\n\nexport type MorphFunctionCallback<T> = (datum: MorphData, element: MorphElements, parameters: any) => T;\n\nexport type MorphFunctionType<T> = GenericFunctionType<MorphFunctionCallback<T>, T>;\n\nexport type MorphFunctionValueType<T> = MorphFunctionType<T> | T;\n\nexport interface IMorphAnimationConfig {\n easing?: EasingType;\n delay?: MorphFunctionValueType<number>;\n duration?: MorphFunctionValueType<number>;\n oneByOne?: MorphFunctionValueType<boolean | number>;\n splitPath?: MorphFunctionValueType<'clone' | Nil>;\n}\n\nexport interface
|
|
1
|
+
{"version":3,"sources":["../src/types/morph.ts"],"names":[],"mappings":"","file":"morph.js","sourcesContent":["import type { EasingType } from '@visactor/vrender-core';\nimport type { DiffResult, Nil } from './base';\nimport type { IElement } from './element';\nimport type { IGrammarBase, IMark } from './grammar';\nimport type { GenericFunctionType } from './signal';\nimport type { IRunningConfig } from './view';\n\nexport type MorphData = { prev: any[]; next: any[] };\nexport type MorphElements = { prev: IElement[]; next: IElement[] };\n\nexport type MorphFunctionCallback<T> = (datum: MorphData, element: MorphElements, parameters: any) => T;\n\nexport type MorphFunctionType<T> = GenericFunctionType<MorphFunctionCallback<T>, T>;\n\nexport type MorphFunctionValueType<T> = MorphFunctionType<T> | T;\n\nexport interface IMorphAnimationConfig {\n easing?: EasingType;\n delay?: MorphFunctionValueType<number>;\n duration?: MorphFunctionValueType<number>;\n oneByOne?: MorphFunctionValueType<boolean | number>;\n splitPath?: MorphFunctionValueType<'clone' | Nil>;\n}\n\nexport interface IViewDiff {\n diffGrammar: <U extends IGrammarBase>(prevGrammars: U[], nextGrammars: U[]) => DiffResult<U, U>;\n diffMark: (prevMarks: IMark[], nextMarks: IMark[], runningConfig: IRunningConfig) => DiffResult<IMark[], IMark[]>;\n}\n"]}
|
package/es/types/renderer.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { IBoundsLike } from '@visactor/vutils';
|
|
2
|
-
import type { IColor, Stage } from '@visactor/vrender-core';
|
|
2
|
+
import type { IColor, IEventTarget, Stage } from '@visactor/vrender-core';
|
|
3
3
|
import type { IViewEventConfig, IViewOptions } from './view';
|
|
4
4
|
export interface IRenderer {
|
|
5
5
|
initialize: (width: number, height: number, options: IViewOptions, eventConfig: IViewEventConfig) => this;
|
|
@@ -18,3 +18,8 @@ export interface IRenderer {
|
|
|
18
18
|
toCanvas: () => HTMLCanvasElement;
|
|
19
19
|
release: () => void;
|
|
20
20
|
}
|
|
21
|
+
export interface IStageEventPlugin<T> {
|
|
22
|
+
new (taget: IEventTarget, cfg?: T): {
|
|
23
|
+
release: () => void;
|
|
24
|
+
};
|
|
25
|
+
}
|
package/es/types/renderer.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/types/renderer.ts"],"names":[],"mappings":"","file":"renderer.js","sourcesContent":["import type { IBoundsLike } from '@visactor/vutils';\nimport type { IColor, Stage } from '@visactor/vrender-core';\nimport type { IViewEventConfig, IViewOptions } from './view';\n\nexport interface IRenderer {\n initialize: (width: number, height: number, options: IViewOptions, eventConfig: IViewEventConfig) => this;\n\n render: (immediately?: boolean) => this;\n renderNextFrame: () => this;\n resize: (width: number, height: number) => this;\n shouldResize: (width: number, height: number) => boolean;\n combineIncrementalLayers: () => this;\n preventRender: (tag: boolean) => void;\n\n setDpr: (resolution: number, redraw: boolean) => this;\n background: (color: IColor) => this;\n setViewBox: (viewBox: IBoundsLike, rerender: boolean) => this;\n\n stage: () => Stage;\n canvas: () => HTMLCanvasElement;\n context: () => CanvasRenderingContext2D;\n\n toCanvas: () => HTMLCanvasElement;\n // toImageData: () => Promise<ImageData | undefined>;\n\n release: () => void;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/types/renderer.ts"],"names":[],"mappings":"","file":"renderer.js","sourcesContent":["import type { IBoundsLike } from '@visactor/vutils';\nimport type { IColor, IEventTarget, Stage } from '@visactor/vrender-core';\nimport type { IViewEventConfig, IViewOptions } from './view';\n\nexport interface IRenderer {\n initialize: (width: number, height: number, options: IViewOptions, eventConfig: IViewEventConfig) => this;\n\n render: (immediately?: boolean) => this;\n renderNextFrame: () => this;\n resize: (width: number, height: number) => this;\n shouldResize: (width: number, height: number) => boolean;\n combineIncrementalLayers: () => this;\n preventRender: (tag: boolean) => void;\n\n setDpr: (resolution: number, redraw: boolean) => this;\n background: (color: IColor) => this;\n setViewBox: (viewBox: IBoundsLike, rerender: boolean) => this;\n\n stage: () => Stage;\n canvas: () => HTMLCanvasElement;\n context: () => CanvasRenderingContext2D;\n\n toCanvas: () => HTMLCanvasElement;\n // toImageData: () => Promise<ImageData | undefined>;\n\n release: () => void;\n}\n\nexport interface IStageEventPlugin<T> {\n new (taget: IEventTarget, cfg?: T): {\n release: () => void;\n };\n}\n"]}
|
package/es/view/View.d.ts
CHANGED
|
@@ -2,7 +2,7 @@ import type { IBounds, ILogger } from '@visactor/vutils';
|
|
|
2
2
|
import { EventEmitter } from '@visactor/vutils';
|
|
3
3
|
import type { IColor } from '@visactor/vrender-core';
|
|
4
4
|
import type { CoordinateType } from '@visactor/vgrammar-coordinate';
|
|
5
|
-
import type { IData, ISignal, ViewSpec, IView, IViewOptions, IViewThemeConfig, Hooks, IMark,
|
|
5
|
+
import type { IData, ISignal, ViewSpec, IView, IViewOptions, IViewThemeConfig, Hooks, IMark, MarkType, GrammarScaleType, SignalFunctionType, IScale, IGrammarBase, IGroupMark, IGlyphMark, ICoordinate, BaseEventHandler, IRecordedGrammars, IComponent, IRunningConfig, IViewAnimate, ITheme, InteractionSpec, IInteraction } from '../types/';
|
|
6
6
|
import type { IRenderer } from '../types/renderer';
|
|
7
7
|
import { LayoutState } from '../graph/enums';
|
|
8
8
|
import type { IAxis, IDatazoom, IGrid, ILabel, ILegend, IPlayer, IScrollbar, ISlider, ITitle } from '../types/component';
|
|
@@ -18,8 +18,7 @@ export default class View extends EventEmitter implements IView {
|
|
|
18
18
|
private _config;
|
|
19
19
|
private _options;
|
|
20
20
|
private _cachedGrammars;
|
|
21
|
-
private
|
|
22
|
-
private _morph;
|
|
21
|
+
private _differ;
|
|
23
22
|
private _eventConfig;
|
|
24
23
|
private _eventListeners;
|
|
25
24
|
private _theme;
|
|
@@ -28,7 +27,6 @@ export default class View extends EventEmitter implements IView {
|
|
|
28
27
|
private _layoutState?;
|
|
29
28
|
private _layoutMarks?;
|
|
30
29
|
private _background?;
|
|
31
|
-
private _eventCache;
|
|
32
30
|
private _progressiveMarks?;
|
|
33
31
|
private _progressiveRafId?;
|
|
34
32
|
private _observer;
|
|
@@ -122,11 +120,10 @@ export default class View extends EventEmitter implements IView {
|
|
|
122
120
|
private _onResize;
|
|
123
121
|
resize(width: number, height: number, render?: boolean): this;
|
|
124
122
|
private _resizeRenderer;
|
|
125
|
-
private bindEvents;
|
|
126
|
-
event(eventSpec: EventSpec): void;
|
|
127
123
|
interaction(type: string, spec: Partial<InteractionSpec>): IInteraction<any>;
|
|
128
124
|
removeInteraction(type: string | IInteraction, id?: string): this;
|
|
129
125
|
removeAllInteractions(): this;
|
|
126
|
+
initializeEventConfig(config: any): any;
|
|
130
127
|
private initEvent;
|
|
131
128
|
private releaseStageEvent;
|
|
132
129
|
private delegateEvent;
|
package/es/view/View.js
CHANGED
|
@@ -1,11 +1,9 @@
|
|
|
1
|
-
import { EventEmitter, debounce,
|
|
1
|
+
import { EventEmitter, debounce, isString, getContainerSize, Logger, array, isNil, isArray } from "@visactor/vutils";
|
|
2
2
|
|
|
3
3
|
import { vglobal } from "@visactor/vrender-core";
|
|
4
4
|
|
|
5
5
|
import { Data } from "./data";
|
|
6
6
|
|
|
7
|
-
import { initializeEventConfig, permit, prevent } from "./events";
|
|
8
|
-
|
|
9
7
|
import Dataflow from "./dataflow";
|
|
10
8
|
|
|
11
9
|
import { traverseMarkTree } from "../graph/mark-tree";
|
|
@@ -16,15 +14,13 @@ import CanvasRenderer from "../graph/canvas-renderer";
|
|
|
16
14
|
|
|
17
15
|
import getExtendedEvents from "../graph/util/events-extend";
|
|
18
16
|
|
|
19
|
-
import { BROWSER,
|
|
17
|
+
import { BROWSER, SIGNAL_WIDTH, SIGNAL_HEIGHT, SIGNAL_PADDING, SIGNAL_AUTOFIT, SIGNAL_VIEW_WIDTH, SIGNAL_VIEW_HEIGHT, EVENT_SOURCE_VIEW, SIGNAL_VIEW_BOX, ID_PREFIX, NAME_PREFIX, EVENT_SOURCE_WINDOW } from "./constants";
|
|
20
18
|
|
|
21
19
|
import { Signal } from "./signal";
|
|
22
20
|
|
|
23
21
|
import { BuiltInSignalID, builtInSignals, normalizeMarkTree, normalizeRunningConfig, normalizePadding } from "../parse/view";
|
|
24
22
|
|
|
25
|
-
import {
|
|
26
|
-
|
|
27
|
-
import { isGrammar, parseReference } from "../parse/util";
|
|
23
|
+
import { isGrammar } from "../parse/util";
|
|
28
24
|
|
|
29
25
|
import { configureEnvironment } from "../graph/util/env";
|
|
30
26
|
|
|
@@ -32,16 +28,8 @@ import { GroupMark } from "./group";
|
|
|
32
28
|
|
|
33
29
|
import { Mark } from "./mark";
|
|
34
30
|
|
|
35
|
-
import { defaultDoLayout } from "../graph/layout/layout";
|
|
36
|
-
|
|
37
|
-
import { GlyphMark } from "./glyph";
|
|
38
|
-
|
|
39
|
-
import { Morph } from "../graph/animation/morph";
|
|
40
|
-
|
|
41
31
|
import { RecordedGrammars, RecordedTreeGrammars } from "./grammar-record";
|
|
42
32
|
|
|
43
|
-
import { ViewAnimate } from "./animate";
|
|
44
|
-
|
|
45
33
|
import { ComponentEnum, HOOK_EVENT, LayoutState, GrammarMarkType } from "../graph/enums";
|
|
46
34
|
|
|
47
35
|
import { Text } from "../semantic-marks/text";
|
|
@@ -54,6 +42,8 @@ import { Component } from "./component";
|
|
|
54
42
|
|
|
55
43
|
import { isMarkType, removeGraphicItem } from "../graph/util/graphic";
|
|
56
44
|
|
|
45
|
+
import { ViewDiff } from "../graph/view-diff";
|
|
46
|
+
|
|
57
47
|
export default class View extends EventEmitter {
|
|
58
48
|
static useRegisters(comps) {
|
|
59
49
|
comps.forEach((fn => {
|
|
@@ -154,7 +144,8 @@ export default class View extends EventEmitter {
|
|
|
154
144
|
break;
|
|
155
145
|
|
|
156
146
|
case GrammarMarkType.glyph:
|
|
157
|
-
|
|
147
|
+
const GlyphMark = Factory.getMark(GrammarMarkType.glyph);
|
|
148
|
+
GlyphMark && (mark = new GlyphMark(this, null == markOptions ? void 0 : markOptions.glyphType, groupMark));
|
|
158
149
|
break;
|
|
159
150
|
|
|
160
151
|
case GrammarMarkType.component:
|
|
@@ -260,7 +251,7 @@ export default class View extends EventEmitter {
|
|
|
260
251
|
})), this;
|
|
261
252
|
}
|
|
262
253
|
parseSpec(spec) {
|
|
263
|
-
var _a, _b, _c, _d, _e, _f;
|
|
254
|
+
var _a, _b, _c, _d, _e, _f, _g, _h;
|
|
264
255
|
if (this.emit(HOOK_EVENT.BEFORE_PARSE_VIEW), this._spec = spec, normalizeMarkTree(spec),
|
|
265
256
|
spec.theme ? this.theme(spec.theme) : this.theme(ThemeManager.getDefaultTheme()),
|
|
266
257
|
spec.width && this.width(spec.width), spec.height && this.height(spec.height), this.padding(null !== (_b = null !== (_a = spec.padding) && void 0 !== _a ? _a : this._options.padding) && void 0 !== _b ? _b : this._theme.padding),
|
|
@@ -288,11 +279,13 @@ export default class View extends EventEmitter {
|
|
|
288
279
|
})), spec.marks && spec.marks.length && spec.marks.forEach((mark => {
|
|
289
280
|
this.parseMarkSpec(mark);
|
|
290
281
|
})), spec.events && spec.events.length && spec.events.forEach((eventConfig => {
|
|
291
|
-
|
|
282
|
+
var _b;
|
|
283
|
+
null === (_b = this.event) || void 0 === _b || _b.call(this, eventConfig);
|
|
292
284
|
})), spec.interactions && spec.interactions.length && spec.interactions.forEach((interaction => {
|
|
293
285
|
this.interaction(interaction.type, interaction);
|
|
294
|
-
})), !1 === spec.animation ? this.animate.disable() : this.animate
|
|
295
|
-
this._needBuildLayoutTree = !0, this._layoutState = LayoutState.before,
|
|
286
|
+
})), !1 === spec.animation ? null === (_g = this.animate) || void 0 === _g || _g.disable() : null === (_h = this.animate) || void 0 === _h || _h.enable(),
|
|
287
|
+
this.emit(HOOK_EVENT.AFTER_PARSE_VIEW), this._needBuildLayoutTree = !0, this._layoutState = LayoutState.before,
|
|
288
|
+
this;
|
|
296
289
|
}
|
|
297
290
|
updateSpec(spec) {
|
|
298
291
|
return this.removeAllInteractions(), this.removeAllGrammars(), this.parseSpec(spec);
|
|
@@ -412,7 +405,7 @@ export default class View extends EventEmitter {
|
|
|
412
405
|
}
|
|
413
406
|
doLayout() {
|
|
414
407
|
var _a;
|
|
415
|
-
const doLayout = this._options.doLayout ||
|
|
408
|
+
const doLayout = this._options.doLayout || Factory.getDefaultLayout();
|
|
416
409
|
doLayout && (null === (_a = this._layoutMarks) || void 0 === _a ? void 0 : _a.length) && (this.emit(HOOK_EVENT.BEFORE_DO_LAYOUT),
|
|
417
410
|
doLayout(this._layoutMarks, this._options, this), this.emit(HOOK_EVENT.AFTER_DO_LAYOUT));
|
|
418
411
|
}
|
|
@@ -435,11 +428,11 @@ export default class View extends EventEmitter {
|
|
|
435
428
|
return this.evaluate(runningConfig), this;
|
|
436
429
|
}
|
|
437
430
|
doRender(immediately) {
|
|
438
|
-
this.emit(HOOK_EVENT.BEFORE_DO_RENDER), this.renderer && (this._progressiveMarks
|
|
431
|
+
this.emit(HOOK_EVENT.BEFORE_DO_RENDER), this.renderer && (!this._progressiveMarks && this.animate && this.animate.animate(),
|
|
439
432
|
this.renderer.render(immediately), this.handleRenderEnd()), this.emit(HOOK_EVENT.AFTER_DO_RENDER);
|
|
440
433
|
}
|
|
441
434
|
evaluate(runningConfig) {
|
|
442
|
-
var _a,
|
|
435
|
+
var _a, _c;
|
|
443
436
|
const normalizedRunningConfig = normalizeRunningConfig(runningConfig), grammarWillDetach = this._cachedGrammars.size() > 0;
|
|
444
437
|
grammarWillDetach && (this.reuseCachedGrammars(normalizedRunningConfig), this.detachCachedGrammar());
|
|
445
438
|
const hasResize = this._resizeRenderer(), hasUpdate = this._dataflow.hasCommitted();
|
|
@@ -448,28 +441,28 @@ export default class View extends EventEmitter {
|
|
|
448
441
|
this._needBuildLayoutTree = !1), this._layoutState && (this._layoutState = LayoutState.layouting,
|
|
449
442
|
this.doLayout(), this._dataflow.hasCommitted() && (this._layoutState = LayoutState.reevaluate,
|
|
450
443
|
this._dataflow.evaluate()), this._layoutState = LayoutState.after, (null === (_a = this._layoutMarks) || void 0 === _a ? void 0 : _a.length) && this.handleLayoutEnd()),
|
|
451
|
-
this._layoutState = null, this.findProgressiveMarks(), this._resizeRenderer(), null === (
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
this.doRender(!0), this.doPreProgressive(), this) : this;
|
|
444
|
+
this._layoutState = null, this.findProgressiveMarks(), this._resizeRenderer(), null === (_c = this.morph) || void 0 === _c || _c.call(this, normalizedRunningConfig),
|
|
445
|
+
this.releaseCachedGrammars(normalizedRunningConfig), this.doRender(!0), this.doPreProgressive(),
|
|
446
|
+
this) : this;
|
|
455
447
|
}
|
|
456
448
|
reuseCachedGrammars(runningConfig) {
|
|
457
|
-
if (
|
|
449
|
+
if (runningConfig.reuse) {
|
|
458
450
|
const reuseDiffUpdate = diff => {
|
|
459
451
|
diff.next.reuse(diff.prev), diff.prev.detachAll(), diff.prev.clear(), this._cachedGrammars.unrecord(diff.prev);
|
|
460
452
|
};
|
|
461
|
-
this.
|
|
462
|
-
this.
|
|
463
|
-
this.
|
|
464
|
-
this.
|
|
453
|
+
this._differ.diffGrammar(this._cachedGrammars.getAllSignals(), this.grammars.getAllSignals().filter((signal => !BuiltInSignalID.includes(signal.id())))).update.forEach(reuseDiffUpdate);
|
|
454
|
+
this._differ.diffGrammar(this._cachedGrammars.getAllData(), this.grammars.getAllData()).update.forEach(reuseDiffUpdate);
|
|
455
|
+
this._differ.diffGrammar(this._cachedGrammars.getAllScales(), this.grammars.getAllScales()).update.forEach(reuseDiffUpdate);
|
|
456
|
+
this._differ.diffGrammar(this._cachedGrammars.getAllCoordinates(), this.grammars.getAllCoordinates()).update.forEach(reuseDiffUpdate);
|
|
465
457
|
}
|
|
466
|
-
this.
|
|
458
|
+
this._differ.diffMark(this._cachedGrammars.getAllMarks(), this.grammars.getAllMarks().filter((mark => "root" !== mark.id())), runningConfig).update.forEach((diff => {
|
|
459
|
+
var _b;
|
|
467
460
|
const matched = 1 === diff.prev.length && 1 === diff.next.length && diff.prev[0].markType === diff.next[0].markType, enableMarkMorphConfig = diff.prev.every((mark => mark.getMorphConfig().morph)) && diff.next.every((mark => mark.getMorphConfig().morph));
|
|
468
461
|
matched && runningConfig.reuse ? (diff.next[0].reuse(diff.prev[0]), diff.prev[0].detachAll(),
|
|
469
|
-
diff.prev[0].clear(), this._cachedGrammars.unrecord(diff.prev[0])) : (runningConfig.morph && enableMarkMorphConfig || runningConfig.morphAll) && this.
|
|
462
|
+
diff.prev[0].clear(), this._cachedGrammars.unrecord(diff.prev[0])) : (runningConfig.morph && enableMarkMorphConfig || runningConfig.morphAll) && (null === (_b = this.addMorphMarks) || void 0 === _b || _b.call(this, {
|
|
470
463
|
prev: diff.prev,
|
|
471
464
|
next: diff.next
|
|
472
|
-
});
|
|
465
|
+
}));
|
|
473
466
|
}));
|
|
474
467
|
}
|
|
475
468
|
detachCachedGrammar() {
|
|
@@ -487,10 +480,11 @@ export default class View extends EventEmitter {
|
|
|
487
480
|
}));
|
|
488
481
|
const markNodes = this._cachedGrammars.getAllMarkNodes();
|
|
489
482
|
markNodes.forEach((node => {
|
|
490
|
-
|
|
483
|
+
var _a;
|
|
484
|
+
null === (_a = node.mark.animate) || void 0 === _a || _a.stop(), runningConfig.enableExitAnimation && this.animate && this.animate.animateAddition(node.mark);
|
|
491
485
|
}));
|
|
492
486
|
const releaseUp = node => {
|
|
493
|
-
if (node.mark.view && 0 === node.mark.animate.getAnimatorCount() && (!node.children || 0 === node.children.length)) {
|
|
487
|
+
if (node.mark.view && (!node.mark.animate || 0 === node.mark.animate.getAnimatorCount()) && (!node.children || 0 === node.children.length)) {
|
|
494
488
|
node.mark.release();
|
|
495
489
|
const parent = node.parent;
|
|
496
490
|
parent && (node.parent.children = node.parent.children.filter((n => n !== node)),
|
|
@@ -499,8 +493,8 @@ export default class View extends EventEmitter {
|
|
|
499
493
|
};
|
|
500
494
|
markNodes.forEach((node => {
|
|
501
495
|
const mark = node.mark;
|
|
502
|
-
0 === mark.animate.getAnimatorCount() ? releaseUp(node) : mark.addEventListener("animationEnd", (() => {
|
|
503
|
-
0 === mark.animate.getAnimatorCount() && releaseUp(node);
|
|
496
|
+
mark.animate && 0 === mark.animate.getAnimatorCount() ? releaseUp(node) : mark.addEventListener("animationEnd", (() => {
|
|
497
|
+
mark.animate && 0 === mark.animate.getAnimatorCount() && releaseUp(node);
|
|
504
498
|
}));
|
|
505
499
|
})), this._cachedGrammars.clear();
|
|
506
500
|
}
|
|
@@ -568,73 +562,6 @@ export default class View extends EventEmitter {
|
|
|
568
562
|
height: height
|
|
569
563
|
}), !0);
|
|
570
564
|
}
|
|
571
|
-
bindEvents(eventSpec) {
|
|
572
|
-
if (this._eventConfig.disable) return;
|
|
573
|
-
const {type: evtType, filter: filter, callback: callback, throttle: throttle, debounce: debounce, consume: consume, target: target, dependency: dependency} = eventSpec, eventSelector = parseEventSelector(evtType);
|
|
574
|
-
if (!eventSelector) return;
|
|
575
|
-
const {source: source, type: type} = eventSelector, markFilter = generateFilterByMark(eventSelector), validateSignals = (Array.isArray(target) && target.length ? target.map((entry => ({
|
|
576
|
-
signal: this.getSignalById(entry.target),
|
|
577
|
-
callback: entry.callback
|
|
578
|
-
}))) : [ {
|
|
579
|
-
signal: isString(target) ? this.getSignalById(target) : null,
|
|
580
|
-
callback: callback
|
|
581
|
-
} ]).filter((entry => entry.signal || entry.callback)), refs = parseReference(dependency, this), send = parseHandler(((evt, element) => {
|
|
582
|
-
const needPreventDefault = source === EVENT_SOURCE_VIEW && prevent(this._eventConfig, type) || consume && (void 0 === evt.cancelable || evt.cancelable);
|
|
583
|
-
source === EVENT_SOURCE_WINDOW && (evt = getExtendedEvents(this, evt, element, type, EVENT_SOURCE_WINDOW));
|
|
584
|
-
let hasCommitted = !1;
|
|
585
|
-
if ((!filter || filter(evt)) && (!markFilter || markFilter(element)) && validateSignals.length) {
|
|
586
|
-
const params = refs.reduce(((params, ref) => (params[ref.id()] = ref.output(), params)), {});
|
|
587
|
-
validateSignals.forEach((entry => {
|
|
588
|
-
if (entry.callback && entry.signal) {
|
|
589
|
-
entry.signal.set(entry.callback(evt, params)) && (this.commit(entry.signal), hasCommitted = !0);
|
|
590
|
-
} else entry.callback ? entry.callback(evt, params) : (this.commit(entry.signal),
|
|
591
|
-
hasCommitted = !0);
|
|
592
|
-
}));
|
|
593
|
-
}
|
|
594
|
-
needPreventDefault && evt.preventDefault(), consume && evt.stopPropagation(), hasCommitted && this.run();
|
|
595
|
-
}), {
|
|
596
|
-
throttle: throttle,
|
|
597
|
-
debounce: debounce
|
|
598
|
-
});
|
|
599
|
-
if (source === EVENT_SOURCE_VIEW) {
|
|
600
|
-
if (permit(this._eventConfig, EVENT_SOURCE_VIEW, type)) return this.addEventListener(type, send, NO_TRAP),
|
|
601
|
-
() => {
|
|
602
|
-
this.removeEventListener(type, send);
|
|
603
|
-
};
|
|
604
|
-
} else if (source === EVENT_SOURCE_WINDOW) return vglobal.addEventListener(type, send),
|
|
605
|
-
this._eventListeners.push({
|
|
606
|
-
type: type,
|
|
607
|
-
source: vglobal,
|
|
608
|
-
handler: send
|
|
609
|
-
}), () => {
|
|
610
|
-
vglobal.removeEventListener(type, send);
|
|
611
|
-
const index = this._eventListeners.findIndex((entry => entry.type === type && entry.source === vglobal && entry.handler === send));
|
|
612
|
-
index >= 0 && this._eventListeners.splice(index, 1);
|
|
613
|
-
};
|
|
614
|
-
}
|
|
615
|
-
event(eventSpec) {
|
|
616
|
-
if ("between" in eventSpec) {
|
|
617
|
-
const [starEvent, endEvent] = eventSpec.between, id = `${starEvent.type}-${eventSpec.type}-${endEvent.type}`;
|
|
618
|
-
let unbindEndEvent;
|
|
619
|
-
this.bindEvents(Object.assign({}, starEvent, {
|
|
620
|
-
callback: () => {
|
|
621
|
-
if (this._eventCache || (this._eventCache = {}), !this._eventCache[id]) {
|
|
622
|
-
const unbindEvent = this.bindEvents(eventSpec);
|
|
623
|
-
this._eventCache[id] = unbindEvent;
|
|
624
|
-
}
|
|
625
|
-
unbindEndEvent || (unbindEndEvent = this.bindEvents(Object.assign({}, endEvent, {
|
|
626
|
-
callback: () => {
|
|
627
|
-
this._eventCache[id] && (this._eventCache[id](), this._eventCache[id] = null);
|
|
628
|
-
}
|
|
629
|
-
})));
|
|
630
|
-
}
|
|
631
|
-
}));
|
|
632
|
-
} else "merge" in eventSpec ? eventSpec.merge.forEach((entry => {
|
|
633
|
-
const singleEvent = Object.assign({}, eventSpec);
|
|
634
|
-
isString(entry) ? singleEvent.type = entry : isObject(entry) && Object.assign(singleEvent, entry),
|
|
635
|
-
singleEvent.debounce = 50, this.bindEvents(singleEvent);
|
|
636
|
-
})) : this.bindEvents(eventSpec);
|
|
637
|
-
}
|
|
638
565
|
interaction(type, spec) {
|
|
639
566
|
const interaction = Factory.createInteraction(type, this, spec);
|
|
640
567
|
return interaction && (interaction.bind(), this._boundInteractions || (this._boundInteractions = []),
|
|
@@ -657,6 +584,17 @@ export default class View extends EventEmitter {
|
|
|
657
584
|
instance.unbind();
|
|
658
585
|
})), this._boundInteractions = null), this;
|
|
659
586
|
}
|
|
587
|
+
initializeEventConfig(config) {
|
|
588
|
+
const eventsConfig = Object.assign({
|
|
589
|
+
defaults: {}
|
|
590
|
+
}, config), unpack = (obj, keys) => {
|
|
591
|
+
keys.forEach((k => {
|
|
592
|
+
isArray(obj[k]) && (obj[k] = obj[k].reduce(((set, key) => (set[key] = !0, set)), {}));
|
|
593
|
+
}));
|
|
594
|
+
};
|
|
595
|
+
return unpack(eventsConfig.defaults, [ "prevent", "allow" ]), unpack(eventsConfig, [ EVENT_SOURCE_VIEW, EVENT_SOURCE_WINDOW ]),
|
|
596
|
+
eventsConfig;
|
|
597
|
+
}
|
|
660
598
|
initEvent() {
|
|
661
599
|
const stage = this.renderer.stage();
|
|
662
600
|
stage && stage.on("*", this.delegateEvent);
|
|
@@ -679,15 +617,15 @@ export default class View extends EventEmitter {
|
|
|
679
617
|
this.renderer = new CanvasRenderer(this), this.renderer.initialize(width, height, this._options, this._eventConfig).background(this._background);
|
|
680
618
|
}
|
|
681
619
|
initialize() {
|
|
682
|
-
var _a;
|
|
620
|
+
var _a, _c;
|
|
683
621
|
this.grammars = new RecordedGrammars((grammar => grammar.id()), ((key, grammar) => this.logger.warn(`Grammar id '${key}' has been occupied`, grammar))),
|
|
684
622
|
this._cachedGrammars = new RecordedTreeGrammars((grammar => grammar.id())), this._options.logger && Logger.setInstance(this._options.logger),
|
|
685
623
|
this.logger = Logger.getInstance(null !== (_a = this._options.logLevel) && void 0 !== _a ? _a : 0),
|
|
686
|
-
this._dataflow = new Dataflow, this.animate =
|
|
687
|
-
this._options.hooks && (Object.keys(this._options.hooks).forEach((key => {
|
|
624
|
+
this._dataflow = new Dataflow, this.animate = null === (_c = this.initAnimate) || void 0 === _c ? void 0 : _c.call(this, this),
|
|
625
|
+
this._differ = new ViewDiff, this._options.hooks && (Object.keys(this._options.hooks).forEach((key => {
|
|
688
626
|
this.on(key, this._options.hooks[key]);
|
|
689
627
|
})), this.hooks = this._options.hooks), this.container = null, this.renderer = null,
|
|
690
|
-
this._eventListeners = [], this._eventConfig = initializeEventConfig(this._options.eventConfig),
|
|
628
|
+
this._eventListeners = [], this._eventConfig = this.initializeEventConfig(this._options.eventConfig),
|
|
691
629
|
this._theme = this._options.disableTheme ? null : ThemeManager.getDefaultTheme(),
|
|
692
630
|
this.parseBuiltIn(), configureEnvironment(this._options), this.initializeRenderer(),
|
|
693
631
|
this._eventConfig.disable || this.initEvent(), this._bindResizeEvent(), this._needBuildLayoutTree = !0,
|
|
@@ -725,13 +663,14 @@ export default class View extends EventEmitter {
|
|
|
725
663
|
})), this._progressiveMarks = null);
|
|
726
664
|
}
|
|
727
665
|
release() {
|
|
728
|
-
var _a, _b, _c;
|
|
666
|
+
var _a, _b, _c, _d;
|
|
729
667
|
this.removeAllInteractions(), this.releaseStageEvent(), this._unBindResizeEvent(),
|
|
730
668
|
this.clearProgressive(), Factory.unregisterRuntimeTransforms(), Logger.setInstance(null),
|
|
731
|
-
|
|
732
|
-
this.
|
|
669
|
+
null === (_a = this.animate) || void 0 === _a || _a.stop(), this.grammars.release(),
|
|
670
|
+
this._cachedGrammars.release(), this._dataflow.release(), this._dataflow = null,
|
|
671
|
+
null === (_c = null === (_b = this.renderer) || void 0 === _b ? void 0 : _b.release) || void 0 === _c || _c.call(_b),
|
|
733
672
|
this.renderer = null, this._boundInteractions = null, this.removeAllListeners(),
|
|
734
|
-
null === (
|
|
673
|
+
null === (_d = this._eventListeners) || void 0 === _d || _d.forEach((listener => {
|
|
735
674
|
listener.source.removeEventListener(listener.type, listener.handler);
|
|
736
675
|
})), this._eventListeners = null;
|
|
737
676
|
}
|