@visactor/vrender-core 1.1.10-alpha.0 → 1.1.11-alpha.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/cjs/graphic/glyph.d.ts +23 -11
- package/cjs/graphic/glyph.js +79 -58
- package/cjs/graphic/glyph.js.map +1 -1
- package/cjs/graphic/graphic.d.ts +7 -2
- package/cjs/graphic/graphic.js +43 -12
- package/cjs/graphic/graphic.js.map +1 -1
- package/cjs/graphic/state/state-definition.d.ts +1 -0
- package/cjs/graphic/state/state-definition.js.map +1 -1
- package/cjs/graphic/state/state-engine.d.ts +1 -0
- package/cjs/graphic/state/state-engine.js +2 -1
- package/cjs/graphic/state/state-engine.js.map +1 -1
- package/cjs/interface/graphic/glyph.d.ts +3 -1
- package/cjs/interface/graphic/glyph.js.map +1 -1
- package/dist/index.es.js +179 -102
- package/es/graphic/glyph.d.ts +23 -11
- package/es/graphic/glyph.js +81 -57
- package/es/graphic/glyph.js.map +1 -1
- package/es/graphic/graphic.d.ts +7 -2
- package/es/graphic/graphic.js +43 -12
- package/es/graphic/graphic.js.map +1 -1
- package/es/graphic/state/state-definition.d.ts +1 -0
- package/es/graphic/state/state-definition.js.map +1 -1
- package/es/graphic/state/state-engine.d.ts +1 -0
- package/es/graphic/state/state-engine.js +2 -1
- package/es/graphic/state/state-engine.js.map +1 -1
- package/es/interface/graphic/glyph.d.ts +3 -1
- package/es/interface/graphic/glyph.js.map +1 -1
- package/package.json +3 -3
|
@@ -37,5 +37,6 @@ export type StateDefinitionsInput<T extends Record<string, any> = Record<string,
|
|
|
37
37
|
export interface IStateEngineOptions<T extends Record<string, any> = Record<string, any>> {
|
|
38
38
|
compiledDefinitions: Map<string, CompiledStateDefinition<T>>;
|
|
39
39
|
stateSort?: (a: string, b: string) => number;
|
|
40
|
+
stateOrder?: 'input';
|
|
40
41
|
mergeMode?: StateMergeMode;
|
|
41
42
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/graphic/state/state-definition.ts"],"names":[],"mappings":"","file":"state-definition.js","sourcesContent":["export interface StateDefinition<T extends Record<string, any> = Record<string, any>> {\n name: string;\n priority?: number;\n patch?: Partial<T>;\n resolver?: (ctx: StateResolveContext<T>) => Partial<T> | void;\n declaredAffectedKeys?: string[] | Set<string>;\n exclude?: string[];\n suppress?: string[];\n}\n\nexport type StateMergeMode = 'shallow' | 'deep';\n\nexport interface CompiledStateDefinition<T extends Record<string, any> = Record<string, any>> {\n name: string;\n priority: number;\n rank: number;\n patch?: Partial<T>;\n resolver?: (ctx: StateResolveContext<T>) => Partial<T> | void;\n declaredAffectedKeys?: Set<string>;\n exclude: Set<string>;\n suppress: Set<string>;\n hasResolver: boolean;\n affectedKeys: Set<string>;\n}\n\nexport interface StateResolveContext<T extends Record<string, any> = Record<string, any>> {\n graphic: any;\n activeStates: ReadonlyArray<string>;\n effectiveStates: ReadonlyArray<string>;\n baseAttributes: Partial<T>;\n resolvedPatch: Partial<T>;\n}\n\nexport interface StateTransitionResult {\n changed: boolean;\n activeStates: string[];\n effectiveStates: string[];\n suppressed: string[];\n}\n\nexport type StateDefinitionsInput<T extends Record<string, any> = Record<string, any>> = Record<\n string,\n Partial<T> | StateDefinition<T>\n>;\n\nexport interface IStateEngineOptions<T extends Record<string, any> = Record<string, any>> {\n compiledDefinitions: Map<string, CompiledStateDefinition<T>>;\n stateSort?: (a: string, b: string) => number;\n mergeMode?: StateMergeMode;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/graphic/state/state-definition.ts"],"names":[],"mappings":"","file":"state-definition.js","sourcesContent":["export interface StateDefinition<T extends Record<string, any> = Record<string, any>> {\n name: string;\n priority?: number;\n patch?: Partial<T>;\n resolver?: (ctx: StateResolveContext<T>) => Partial<T> | void;\n declaredAffectedKeys?: string[] | Set<string>;\n exclude?: string[];\n suppress?: string[];\n}\n\nexport type StateMergeMode = 'shallow' | 'deep';\n\nexport interface CompiledStateDefinition<T extends Record<string, any> = Record<string, any>> {\n name: string;\n priority: number;\n rank: number;\n patch?: Partial<T>;\n resolver?: (ctx: StateResolveContext<T>) => Partial<T> | void;\n declaredAffectedKeys?: Set<string>;\n exclude: Set<string>;\n suppress: Set<string>;\n hasResolver: boolean;\n affectedKeys: Set<string>;\n}\n\nexport interface StateResolveContext<T extends Record<string, any> = Record<string, any>> {\n graphic: any;\n activeStates: ReadonlyArray<string>;\n effectiveStates: ReadonlyArray<string>;\n baseAttributes: Partial<T>;\n resolvedPatch: Partial<T>;\n}\n\nexport interface StateTransitionResult {\n changed: boolean;\n activeStates: string[];\n effectiveStates: string[];\n suppressed: string[];\n}\n\nexport type StateDefinitionsInput<T extends Record<string, any> = Record<string, any>> = Record<\n string,\n Partial<T> | StateDefinition<T>\n>;\n\nexport interface IStateEngineOptions<T extends Record<string, any> = Record<string, any>> {\n compiledDefinitions: Map<string, CompiledStateDefinition<T>>;\n stateSort?: (a: string, b: string) => number;\n /** @internal Legacy Glyph inputs merge in requested order, after stateSort. */\n stateOrder?: 'input';\n mergeMode?: StateMergeMode;\n}\n"]}
|
|
@@ -2,6 +2,7 @@ import type { IStateEngineOptions, StateTransitionResult } from './state-definit
|
|
|
2
2
|
export declare class StateEngine<T extends Record<string, any> = Record<string, any>> {
|
|
3
3
|
private readonly compiledDefinitions;
|
|
4
4
|
private readonly stateSort?;
|
|
5
|
+
private readonly stateOrder?;
|
|
5
6
|
private readonly mergeMode;
|
|
6
7
|
private _activeStates;
|
|
7
8
|
private _effectiveStates;
|
|
@@ -31,7 +31,7 @@ class StateEngine {
|
|
|
31
31
|
this._activeStates = [], this._effectiveStates = [], this._suppressed = [], this._resolvedPatch = {},
|
|
32
32
|
this.resolverPatchCache = new Map, this.resolverCacheKey = "", this.resolverCacheValid = !1,
|
|
33
33
|
this.baseAttributes = {}, this.compiledDefinitions = options.compiledDefinitions,
|
|
34
|
-
this.stateSort = options.stateSort, this.mergeMode = null !== (_a = options.mergeMode) && void 0 !== _a ? _a : "shallow";
|
|
34
|
+
this.stateSort = options.stateSort, this.stateOrder = options.stateOrder, this.mergeMode = null !== (_a = options.mergeMode) && void 0 !== _a ? _a : "shallow";
|
|
35
35
|
}
|
|
36
36
|
get activeStates() {
|
|
37
37
|
return this._activeStates;
|
|
@@ -106,6 +106,7 @@ class StateEngine {
|
|
|
106
106
|
return !!this._activeStates.length && (null == stateName || this._activeStates.includes(stateName));
|
|
107
107
|
}
|
|
108
108
|
sortStates(states) {
|
|
109
|
+
if ("input" === this.stateOrder) return this.stateSort ? states.sort(this.stateSort) : states;
|
|
109
110
|
const withDefinition = [], withoutDefinition = [];
|
|
110
111
|
return states.forEach((stateName => {
|
|
111
112
|
this.compiledDefinitions.has(stateName) ? withDefinition.push(stateName) : withoutDefinition.push(stateName);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/graphic/state/state-engine.ts"],"names":[],"mappings":"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","file":"state-engine.js","sourcesContent":["import type { CompiledStateDefinition, IStateEngineOptions, StateTransitionResult } from './state-definition';\n\nfunction isPlainObject(value: unknown): value is Record<string, any> {\n return value != null && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction cloneValue<T>(value: T): T {\n if (!isPlainObject(value)) {\n return value;\n }\n\n const clone: Record<string, any> = {};\n Object.keys(value).forEach(key => {\n clone[key] = cloneValue((value as Record<string, any>)[key]);\n });\n return clone as T;\n}\n\nfunction deepMerge(base: Record<string, any>, value: Record<string, any>): Record<string, any> {\n const result: Record<string, any> = cloneValue(base) ?? {};\n\n Object.keys(value).forEach(key => {\n const nextValue = value[key];\n const previousValue = result[key];\n\n if (isPlainObject(previousValue) && isPlainObject(nextValue)) {\n result[key] = deepMerge(previousValue, nextValue);\n return;\n }\n\n result[key] = cloneValue(nextValue);\n });\n\n return result;\n}\n\nexport class StateEngine<T extends Record<string, any> = Record<string, any>> {\n private readonly compiledDefinitions: Map<string, CompiledStateDefinition<T>>;\n private readonly stateSort?: (a: string, b: string) => number;\n private readonly mergeMode: 'shallow' | 'deep';\n\n private _activeStates: string[] = [];\n private _effectiveStates: string[] = [];\n private _suppressed: string[] = [];\n private _resolvedPatch: Partial<T> = {};\n private resolverPatchCache = new Map<string, Partial<T>>();\n private resolverCacheKey = '';\n private resolverCacheValid = false;\n private graphic: any;\n private baseAttributes: Partial<T> = {};\n\n constructor(options: IStateEngineOptions<T>) {\n this.compiledDefinitions = options.compiledDefinitions;\n this.stateSort = options.stateSort;\n this.mergeMode = options.mergeMode ?? 'shallow';\n }\n\n get activeStates(): ReadonlyArray<string> {\n return this._activeStates;\n }\n\n get effectiveStates(): ReadonlyArray<string> {\n return this._effectiveStates;\n }\n\n get resolvedPatch(): Partial<T> {\n return this._resolvedPatch;\n }\n\n get suppressed(): ReadonlyArray<string> {\n return this._suppressed;\n }\n\n setResolveContext(graphic: any, baseAttributes: Partial<T>): void {\n if (this.graphic !== graphic || this.baseAttributes !== baseAttributes) {\n this.invalidateResolverCache();\n }\n this.graphic = graphic;\n this.baseAttributes = baseAttributes;\n }\n\n applyStates(stateNames: string[]): StateTransitionResult {\n const uniqueStates = Array.from(new Set(stateNames));\n const sortedStates = this.sortStates(uniqueStates);\n const adjudicated = this.adjudicate(sortedStates);\n const activeStates = adjudicated.active;\n const effectiveStates = activeStates.filter(stateName => !adjudicated.suppressedSet.has(stateName));\n const suppressed = activeStates.filter(stateName => adjudicated.suppressedSet.has(stateName));\n\n const changed =\n !this.sameArray(this._activeStates, activeStates) ||\n !this.sameArray(this._effectiveStates, effectiveStates) ||\n !this.sameArray(this._suppressed, suppressed);\n\n this._activeStates = activeStates;\n this._effectiveStates = effectiveStates;\n this._suppressed = suppressed;\n\n if (changed || !this.resolverCacheValid) {\n this.recomputePatch(effectiveStates);\n }\n\n return {\n changed,\n activeStates: [...this._activeStates],\n effectiveStates: [...this._effectiveStates],\n suppressed: [...this._suppressed]\n };\n }\n\n addState(stateName: string, keepCurrentStates?: boolean): StateTransitionResult {\n if (this._activeStates.includes(stateName) && (keepCurrentStates || this._activeStates.length === 1)) {\n return {\n changed: false,\n activeStates: [...this._activeStates],\n effectiveStates: [...this._effectiveStates],\n suppressed: [...this._suppressed]\n };\n }\n\n const nextStates =\n keepCurrentStates && this._activeStates.length ? this._activeStates.concat([stateName]) : [stateName];\n\n return this.applyStates(nextStates);\n }\n\n removeState(stateNames: string | string[]): StateTransitionResult {\n if (!this._activeStates.length) {\n return {\n changed: false,\n activeStates: [],\n effectiveStates: [],\n suppressed: []\n };\n }\n\n const filteredNames = Array.isArray(stateNames)\n ? this._activeStates.filter(stateName => !stateNames.includes(stateName))\n : this._activeStates.filter(stateName => stateName !== stateNames);\n\n if (filteredNames.length === this._activeStates.length) {\n return {\n changed: false,\n activeStates: [...this._activeStates],\n effectiveStates: [...this._effectiveStates],\n suppressed: [...this._suppressed]\n };\n }\n\n return this.applyStates(filteredNames);\n }\n\n toggleState(stateName: string): StateTransitionResult {\n if (this.hasState(stateName)) {\n return this.removeState(stateName);\n }\n\n return this.applyStates(this._activeStates.concat([stateName]));\n }\n\n clearStates(): StateTransitionResult {\n const changed = this._activeStates.length > 0 || this._effectiveStates.length > 0 || this._suppressed.length > 0;\n this._activeStates = [];\n this._effectiveStates = [];\n this._suppressed = [];\n this._resolvedPatch = {};\n this.resolverPatchCache.clear();\n this.resolverCacheKey = '';\n this.resolverCacheValid = false;\n\n return {\n changed,\n activeStates: [],\n effectiveStates: [],\n suppressed: []\n };\n }\n\n invalidateResolverCache(): void {\n this.resolverPatchCache.clear();\n this.resolverCacheKey = '';\n this.resolverCacheValid = false;\n }\n\n hasState(stateName?: string): boolean {\n if (!this._activeStates.length) {\n return false;\n }\n\n if (stateName == null) {\n return true;\n }\n\n return this._activeStates.includes(stateName);\n }\n\n private sortStates(states: string[]): string[] {\n const withDefinition: string[] = [];\n const withoutDefinition: string[] = [];\n\n states.forEach(stateName => {\n if (this.compiledDefinitions.has(stateName)) {\n withDefinition.push(stateName);\n } else {\n withoutDefinition.push(stateName);\n }\n });\n\n withDefinition.sort((left, right) => {\n const leftDefinition = this.compiledDefinitions.get(left);\n const rightDefinition = this.compiledDefinitions.get(right);\n if (!leftDefinition || !rightDefinition) {\n return 0;\n }\n if (leftDefinition.priority !== rightDefinition.priority) {\n return leftDefinition.priority - rightDefinition.priority;\n }\n return leftDefinition.rank - rightDefinition.rank;\n });\n\n if (this.stateSort && withoutDefinition.length > 1) {\n withoutDefinition.sort(this.stateSort);\n }\n\n return withDefinition.concat(withoutDefinition);\n }\n\n private adjudicate(sortedStates: string[]): { active: string[]; suppressedSet: Set<string> } {\n const candidate = sortedStates.slice();\n const suppressedSet = new Set<string>();\n\n for (let index = candidate.length - 1; index >= 0; index--) {\n const stateName = candidate[index];\n const definition = this.compiledDefinitions.get(stateName);\n if (!definition) {\n continue;\n }\n\n definition.exclude.forEach(excludedState => {\n const excludedIndex = candidate.indexOf(excludedState);\n if (excludedIndex === -1) {\n return;\n }\n\n candidate.splice(excludedIndex, 1);\n if (excludedIndex < index) {\n index -= 1;\n }\n });\n\n definition.suppress.forEach(suppressedState => {\n suppressedSet.add(suppressedState);\n });\n }\n\n return {\n active: candidate,\n suppressedSet\n };\n }\n\n private recomputePatch(effectiveStates: string[]): void {\n const cacheKey = effectiveStates.join(',');\n const nextPatch: Partial<T> = {};\n const useResolverCache = this.resolverCacheValid && this.resolverCacheKey === cacheKey;\n\n if (!useResolverCache) {\n this.resolverPatchCache.clear();\n this.resolverCacheKey = cacheKey;\n }\n\n effectiveStates.forEach(stateName => {\n const definition = this.compiledDefinitions.get(stateName);\n if (!definition) {\n return;\n }\n\n if (definition.patch) {\n this.mergeInto(nextPatch, definition.patch);\n }\n\n if (definition.hasResolver) {\n const resolverPatch = useResolverCache\n ? this.resolverPatchCache.get(stateName)\n : definition.resolver?.({\n graphic: this.graphic,\n activeStates: this._activeStates,\n effectiveStates: this._effectiveStates,\n baseAttributes: this.baseAttributes,\n resolvedPatch: nextPatch\n });\n\n if (resolverPatch) {\n if (!useResolverCache) {\n this.resolverPatchCache.set(stateName, resolverPatch);\n }\n this.mergeInto(nextPatch, resolverPatch);\n }\n }\n });\n\n if (!useResolverCache) {\n this.resolverCacheValid = true;\n }\n\n this._resolvedPatch = nextPatch;\n }\n\n private mergeInto(target: Partial<T>, patch: Partial<T>): void {\n if (this.mergeMode === 'deep') {\n Object.keys(patch).forEach(key => {\n const nextValue = (patch as Record<string, any>)[key];\n const previousValue = (target as Record<string, any>)[key];\n const baseValue = (this.baseAttributes as Record<string, any>)?.[key];\n\n if (isPlainObject(previousValue) && isPlainObject(nextValue)) {\n (target as Record<string, any>)[key] = deepMerge(previousValue, nextValue);\n return;\n }\n\n if (!isPlainObject(previousValue) && isPlainObject(baseValue) && isPlainObject(nextValue)) {\n (target as Record<string, any>)[key] = deepMerge(baseValue, nextValue);\n return;\n }\n\n (target as Record<string, any>)[key] = cloneValue(nextValue);\n });\n return;\n }\n\n Object.keys(patch).forEach(key => {\n (target as Record<string, any>)[key] = cloneValue((patch as Record<string, any>)[key]);\n });\n }\n\n private sameArray(left: readonly string[], right: readonly string[]): boolean {\n if (left.length !== right.length) {\n return false;\n }\n\n for (let index = 0; index < left.length; index++) {\n if (left[index] !== right[index]) {\n return false;\n }\n }\n\n return true;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/graphic/state/state-engine.ts"],"names":[],"mappings":"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","file":"state-engine.js","sourcesContent":["import type { CompiledStateDefinition, IStateEngineOptions, StateTransitionResult } from './state-definition';\n\nfunction isPlainObject(value: unknown): value is Record<string, any> {\n return value != null && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction cloneValue<T>(value: T): T {\n if (!isPlainObject(value)) {\n return value;\n }\n\n const clone: Record<string, any> = {};\n Object.keys(value).forEach(key => {\n clone[key] = cloneValue((value as Record<string, any>)[key]);\n });\n return clone as T;\n}\n\nfunction deepMerge(base: Record<string, any>, value: Record<string, any>): Record<string, any> {\n const result: Record<string, any> = cloneValue(base) ?? {};\n\n Object.keys(value).forEach(key => {\n const nextValue = value[key];\n const previousValue = result[key];\n\n if (isPlainObject(previousValue) && isPlainObject(nextValue)) {\n result[key] = deepMerge(previousValue, nextValue);\n return;\n }\n\n result[key] = cloneValue(nextValue);\n });\n\n return result;\n}\n\nexport class StateEngine<T extends Record<string, any> = Record<string, any>> {\n private readonly compiledDefinitions: Map<string, CompiledStateDefinition<T>>;\n private readonly stateSort?: (a: string, b: string) => number;\n private readonly stateOrder?: 'input';\n private readonly mergeMode: 'shallow' | 'deep';\n\n private _activeStates: string[] = [];\n private _effectiveStates: string[] = [];\n private _suppressed: string[] = [];\n private _resolvedPatch: Partial<T> = {};\n private resolverPatchCache = new Map<string, Partial<T>>();\n private resolverCacheKey = '';\n private resolverCacheValid = false;\n private graphic: any;\n private baseAttributes: Partial<T> = {};\n\n constructor(options: IStateEngineOptions<T>) {\n this.compiledDefinitions = options.compiledDefinitions;\n this.stateSort = options.stateSort;\n this.stateOrder = options.stateOrder;\n this.mergeMode = options.mergeMode ?? 'shallow';\n }\n\n get activeStates(): ReadonlyArray<string> {\n return this._activeStates;\n }\n\n get effectiveStates(): ReadonlyArray<string> {\n return this._effectiveStates;\n }\n\n get resolvedPatch(): Partial<T> {\n return this._resolvedPatch;\n }\n\n get suppressed(): ReadonlyArray<string> {\n return this._suppressed;\n }\n\n setResolveContext(graphic: any, baseAttributes: Partial<T>): void {\n if (this.graphic !== graphic || this.baseAttributes !== baseAttributes) {\n this.invalidateResolverCache();\n }\n this.graphic = graphic;\n this.baseAttributes = baseAttributes;\n }\n\n applyStates(stateNames: string[]): StateTransitionResult {\n const uniqueStates = Array.from(new Set(stateNames));\n const sortedStates = this.sortStates(uniqueStates);\n const adjudicated = this.adjudicate(sortedStates);\n const activeStates = adjudicated.active;\n const effectiveStates = activeStates.filter(stateName => !adjudicated.suppressedSet.has(stateName));\n const suppressed = activeStates.filter(stateName => adjudicated.suppressedSet.has(stateName));\n\n const changed =\n !this.sameArray(this._activeStates, activeStates) ||\n !this.sameArray(this._effectiveStates, effectiveStates) ||\n !this.sameArray(this._suppressed, suppressed);\n\n this._activeStates = activeStates;\n this._effectiveStates = effectiveStates;\n this._suppressed = suppressed;\n\n if (changed || !this.resolverCacheValid) {\n this.recomputePatch(effectiveStates);\n }\n\n return {\n changed,\n activeStates: [...this._activeStates],\n effectiveStates: [...this._effectiveStates],\n suppressed: [...this._suppressed]\n };\n }\n\n addState(stateName: string, keepCurrentStates?: boolean): StateTransitionResult {\n if (this._activeStates.includes(stateName) && (keepCurrentStates || this._activeStates.length === 1)) {\n return {\n changed: false,\n activeStates: [...this._activeStates],\n effectiveStates: [...this._effectiveStates],\n suppressed: [...this._suppressed]\n };\n }\n\n const nextStates =\n keepCurrentStates && this._activeStates.length ? this._activeStates.concat([stateName]) : [stateName];\n\n return this.applyStates(nextStates);\n }\n\n removeState(stateNames: string | string[]): StateTransitionResult {\n if (!this._activeStates.length) {\n return {\n changed: false,\n activeStates: [],\n effectiveStates: [],\n suppressed: []\n };\n }\n\n const filteredNames = Array.isArray(stateNames)\n ? this._activeStates.filter(stateName => !stateNames.includes(stateName))\n : this._activeStates.filter(stateName => stateName !== stateNames);\n\n if (filteredNames.length === this._activeStates.length) {\n return {\n changed: false,\n activeStates: [...this._activeStates],\n effectiveStates: [...this._effectiveStates],\n suppressed: [...this._suppressed]\n };\n }\n\n return this.applyStates(filteredNames);\n }\n\n toggleState(stateName: string): StateTransitionResult {\n if (this.hasState(stateName)) {\n return this.removeState(stateName);\n }\n\n return this.applyStates(this._activeStates.concat([stateName]));\n }\n\n clearStates(): StateTransitionResult {\n const changed = this._activeStates.length > 0 || this._effectiveStates.length > 0 || this._suppressed.length > 0;\n this._activeStates = [];\n this._effectiveStates = [];\n this._suppressed = [];\n this._resolvedPatch = {};\n this.resolverPatchCache.clear();\n this.resolverCacheKey = '';\n this.resolverCacheValid = false;\n\n return {\n changed,\n activeStates: [],\n effectiveStates: [],\n suppressed: []\n };\n }\n\n invalidateResolverCache(): void {\n this.resolverPatchCache.clear();\n this.resolverCacheKey = '';\n this.resolverCacheValid = false;\n }\n\n hasState(stateName?: string): boolean {\n if (!this._activeStates.length) {\n return false;\n }\n\n if (stateName == null) {\n return true;\n }\n\n return this._activeStates.includes(stateName);\n }\n\n private sortStates(states: string[]): string[] {\n if (this.stateOrder === 'input') {\n return this.stateSort ? states.sort(this.stateSort) : states;\n }\n const withDefinition: string[] = [];\n const withoutDefinition: string[] = [];\n\n states.forEach(stateName => {\n if (this.compiledDefinitions.has(stateName)) {\n withDefinition.push(stateName);\n } else {\n withoutDefinition.push(stateName);\n }\n });\n\n withDefinition.sort((left, right) => {\n const leftDefinition = this.compiledDefinitions.get(left);\n const rightDefinition = this.compiledDefinitions.get(right);\n if (!leftDefinition || !rightDefinition) {\n return 0;\n }\n if (leftDefinition.priority !== rightDefinition.priority) {\n return leftDefinition.priority - rightDefinition.priority;\n }\n return leftDefinition.rank - rightDefinition.rank;\n });\n\n if (this.stateSort && withoutDefinition.length > 1) {\n withoutDefinition.sort(this.stateSort);\n }\n\n return withDefinition.concat(withoutDefinition);\n }\n\n private adjudicate(sortedStates: string[]): { active: string[]; suppressedSet: Set<string> } {\n const candidate = sortedStates.slice();\n const suppressedSet = new Set<string>();\n\n for (let index = candidate.length - 1; index >= 0; index--) {\n const stateName = candidate[index];\n const definition = this.compiledDefinitions.get(stateName);\n if (!definition) {\n continue;\n }\n\n definition.exclude.forEach(excludedState => {\n const excludedIndex = candidate.indexOf(excludedState);\n if (excludedIndex === -1) {\n return;\n }\n\n candidate.splice(excludedIndex, 1);\n if (excludedIndex < index) {\n index -= 1;\n }\n });\n\n definition.suppress.forEach(suppressedState => {\n suppressedSet.add(suppressedState);\n });\n }\n\n return {\n active: candidate,\n suppressedSet\n };\n }\n\n private recomputePatch(effectiveStates: string[]): void {\n const cacheKey = effectiveStates.join(',');\n const nextPatch: Partial<T> = {};\n const useResolverCache = this.resolverCacheValid && this.resolverCacheKey === cacheKey;\n\n if (!useResolverCache) {\n this.resolverPatchCache.clear();\n this.resolverCacheKey = cacheKey;\n }\n\n effectiveStates.forEach(stateName => {\n const definition = this.compiledDefinitions.get(stateName);\n if (!definition) {\n return;\n }\n\n if (definition.patch) {\n this.mergeInto(nextPatch, definition.patch);\n }\n\n if (definition.hasResolver) {\n const resolverPatch = useResolverCache\n ? this.resolverPatchCache.get(stateName)\n : definition.resolver?.({\n graphic: this.graphic,\n activeStates: this._activeStates,\n effectiveStates: this._effectiveStates,\n baseAttributes: this.baseAttributes,\n resolvedPatch: nextPatch\n });\n\n if (resolverPatch) {\n if (!useResolverCache) {\n this.resolverPatchCache.set(stateName, resolverPatch);\n }\n this.mergeInto(nextPatch, resolverPatch);\n }\n }\n });\n\n if (!useResolverCache) {\n this.resolverCacheValid = true;\n }\n\n this._resolvedPatch = nextPatch;\n }\n\n private mergeInto(target: Partial<T>, patch: Partial<T>): void {\n if (this.mergeMode === 'deep') {\n Object.keys(patch).forEach(key => {\n const nextValue = (patch as Record<string, any>)[key];\n const previousValue = (target as Record<string, any>)[key];\n const baseValue = (this.baseAttributes as Record<string, any>)?.[key];\n\n if (isPlainObject(previousValue) && isPlainObject(nextValue)) {\n (target as Record<string, any>)[key] = deepMerge(previousValue, nextValue);\n return;\n }\n\n if (!isPlainObject(previousValue) && isPlainObject(baseValue) && isPlainObject(nextValue)) {\n (target as Record<string, any>)[key] = deepMerge(baseValue, nextValue);\n return;\n }\n\n (target as Record<string, any>)[key] = cloneValue(nextValue);\n });\n return;\n }\n\n Object.keys(patch).forEach(key => {\n (target as Record<string, any>)[key] = cloneValue((patch as Record<string, any>)[key]);\n });\n }\n\n private sameArray(left: readonly string[], right: readonly string[]): boolean {\n if (left.length !== right.length) {\n return false;\n }\n\n for (let index = 0; index < left.length; index++) {\n if (left[index] !== right[index]) {\n return false;\n }\n }\n\n return true;\n }\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { IGraphicAttribute, IGraphic } from '../graphic';
|
|
1
|
+
import type { IGraphicAttribute, IGraphic, ISetAttributeContext } from '../graphic';
|
|
2
2
|
import type { ICustomPath2D } from '../path';
|
|
3
3
|
export type IGlyphAttribute = {
|
|
4
4
|
path: string | ICustomPath2D;
|
|
@@ -21,4 +21,6 @@ export interface IGlyph<T extends Partial<IGraphicAttribute> = Partial<IGraphicA
|
|
|
21
21
|
getSubGraphic: () => IGraphic[];
|
|
22
22
|
onInit: (cb: (g: this) => void) => void;
|
|
23
23
|
onUpdate: (cb: (g: this) => void) => void;
|
|
24
|
+
setSubGraphicEncoder: (encoder?: (g: IGlyph, context?: ISetAttributeContext) => void) => void;
|
|
25
|
+
commitSubGraphicAttributes: (subGraphic: IGraphic, patch: Record<string, any>, removedKeys?: readonly string[], context?: ISetAttributeContext) => void;
|
|
24
26
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/interface/graphic/glyph.ts"],"names":[],"mappings":"","file":"glyph.js","sourcesContent":["import type { IGraphicAttribute, IGraphic } from '../graphic';\nimport type { ICustomPath2D } from '../path';\n\n// glyph是一种图元,这种图元组合了各种其他图元\n// 1. 相对于group来说glyph不包含childrenPickable\n// 2. glyph不支持布局\n// 3. glyph不支持clip\n\nexport type IGlyphAttribute = {\n path: string | ICustomPath2D;\n width: number;\n height: number;\n cornerRadius: number | number[];\n clip: boolean;\n};\n\nexport type IGlyphGraphicAttribute = Partial<IGraphicAttribute> & Partial<IGlyphAttribute>;\n\nexport interface IGlyph<T extends Partial<IGraphicAttribute> = Partial<IGraphicAttribute>>\n extends IGraphic<IGlyphGraphicAttribute> {\n glyphStates?: Record<\n string,\n {\n attributes: IGlyphGraphicAttribute;\n subAttributes: T[];\n }\n >;\n glyphStateProxy?: (\n stateName: string,\n targetStates?: string[]\n ) => {\n attributes: IGlyphGraphicAttribute;\n subAttributes: T[];\n };\n\n setSubGraphic: (subGraphic: IGraphic[]) => void;\n\n getSubGraphic: () => IGraphic[];\n\n onInit: (cb: (g: this) => void) => void;\n\n onUpdate: (cb: (g: this) => void) => void;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/interface/graphic/glyph.ts"],"names":[],"mappings":"","file":"glyph.js","sourcesContent":["import type { IGraphicAttribute, IGraphic, ISetAttributeContext } from '../graphic';\nimport type { ICustomPath2D } from '../path';\n\n// glyph是一种图元,这种图元组合了各种其他图元\n// 1. 相对于group来说glyph不包含childrenPickable\n// 2. glyph不支持布局\n// 3. glyph不支持clip\n\nexport type IGlyphAttribute = {\n path: string | ICustomPath2D;\n width: number;\n height: number;\n cornerRadius: number | number[];\n clip: boolean;\n};\n\nexport type IGlyphGraphicAttribute = Partial<IGraphicAttribute> & Partial<IGlyphAttribute>;\n\nexport interface IGlyph<T extends Partial<IGraphicAttribute> = Partial<IGraphicAttribute>>\n extends IGraphic<IGlyphGraphicAttribute> {\n glyphStates?: Record<\n string,\n {\n attributes: IGlyphGraphicAttribute;\n subAttributes: T[];\n }\n >;\n glyphStateProxy?: (\n stateName: string,\n targetStates?: string[]\n ) => {\n attributes: IGlyphGraphicAttribute;\n subAttributes: T[];\n };\n\n setSubGraphic: (subGraphic: IGraphic[]) => void;\n\n getSubGraphic: () => IGraphic[];\n\n onInit: (cb: (g: this) => void) => void;\n\n /** Observes committed attributes after derived children are synchronized. Honors skipUpdateCallback. */\n onUpdate: (cb: (g: this) => void) => void;\n\n /** Bind after children/context are ready. Runs once immediately and after each host attribute commit. */\n setSubGraphicEncoder: (encoder?: (g: IGlyph, context?: ISetAttributeContext) => void) => void;\n\n /** Atomically apply derived values and remove owned keys, preserving child state/base truth. */\n commitSubGraphicAttributes: (\n subGraphic: IGraphic,\n patch: Record<string, any>,\n removedKeys?: readonly string[],\n context?: ISetAttributeContext\n ) => void;\n}\n"]}
|
package/dist/index.es.js
CHANGED
|
@@ -9203,6 +9203,7 @@ class StateEngine {
|
|
|
9203
9203
|
this.baseAttributes = {};
|
|
9204
9204
|
this.compiledDefinitions = options.compiledDefinitions;
|
|
9205
9205
|
this.stateSort = options.stateSort;
|
|
9206
|
+
this.stateOrder = options.stateOrder;
|
|
9206
9207
|
this.mergeMode = (_a = options.mergeMode) !== null && _a !== void 0 ? _a : 'shallow';
|
|
9207
9208
|
}
|
|
9208
9209
|
get activeStates() {
|
|
@@ -9318,6 +9319,9 @@ class StateEngine {
|
|
|
9318
9319
|
return this._activeStates.includes(stateName);
|
|
9319
9320
|
}
|
|
9320
9321
|
sortStates(states) {
|
|
9322
|
+
if (this.stateOrder === 'input') {
|
|
9323
|
+
return this.stateSort ? states.sort(this.stateSort) : states;
|
|
9324
|
+
}
|
|
9321
9325
|
const withDefinition = [];
|
|
9322
9326
|
const withoutDefinition = [];
|
|
9323
9327
|
states.forEach(stateName => {
|
|
@@ -10094,7 +10098,7 @@ class Graphic extends Node {
|
|
|
10094
10098
|
}
|
|
10095
10099
|
return (_b = this.localStateDefinitionsVersion) !== null && _b !== void 0 ? _b : 0;
|
|
10096
10100
|
}
|
|
10097
|
-
resolveEffectiveCompiledDefinitions() {
|
|
10101
|
+
resolveEffectiveCompiledDefinitions(_stateNames) {
|
|
10098
10102
|
this.syncSharedStateScopeBindingFromTree(false);
|
|
10099
10103
|
const boundScope = this.boundSharedStateScope;
|
|
10100
10104
|
if (boundScope) {
|
|
@@ -10329,7 +10333,37 @@ class Graphic extends Node {
|
|
|
10329
10333
|
this.applyBaseAttributes(params);
|
|
10330
10334
|
this.commitBaseAttributeMutation(false, context);
|
|
10331
10335
|
}
|
|
10336
|
+
commitBaseAttributesByCategory(params, forceUpdateTag = false, context) {
|
|
10337
|
+
const base = this.getBaseAttributesStorage();
|
|
10338
|
+
let category = UpdateCategory.NONE;
|
|
10339
|
+
let hasKeys = false;
|
|
10340
|
+
for (const key in params) {
|
|
10341
|
+
if (!Object.prototype.hasOwnProperty.call(params, key)) {
|
|
10342
|
+
continue;
|
|
10343
|
+
}
|
|
10344
|
+
hasKeys = true;
|
|
10345
|
+
const prev = base[key];
|
|
10346
|
+
const next = params[key];
|
|
10347
|
+
if (prev !== next) {
|
|
10348
|
+
category = this.mergeAttributeDeltaCategory(category, key, prev, next);
|
|
10349
|
+
}
|
|
10350
|
+
base[key] = next;
|
|
10351
|
+
}
|
|
10352
|
+
if (!hasKeys) {
|
|
10353
|
+
return;
|
|
10354
|
+
}
|
|
10355
|
+
this.attribute = base;
|
|
10356
|
+
this._baseAttributes = undefined;
|
|
10357
|
+
this.attributeMayContainTransientAttrs = false;
|
|
10358
|
+
this.valid = this.isValid();
|
|
10359
|
+
this.submitUpdateByCategory(category, forceUpdateTag);
|
|
10360
|
+
this.onAttributeUpdate(context);
|
|
10361
|
+
}
|
|
10332
10362
|
commitBaseAttributesByTouchedKeys(params, forceUpdateTag = false, context) {
|
|
10363
|
+
if (this.glyphHost) {
|
|
10364
|
+
this.commitBaseAttributesByCategory(params, forceUpdateTag, context);
|
|
10365
|
+
return;
|
|
10366
|
+
}
|
|
10333
10367
|
const source = params;
|
|
10334
10368
|
const baseAttributes = this.getBaseAttributesStorage();
|
|
10335
10369
|
let hasKeys = false;
|
|
@@ -11193,7 +11227,29 @@ class Graphic extends Node {
|
|
|
11193
11227
|
skewTo(b, c) {
|
|
11194
11228
|
return this;
|
|
11195
11229
|
}
|
|
11230
|
+
static bindGlyphAttributes(graphic, inherited) {
|
|
11231
|
+
if (Object.getPrototypeOf(graphic.attribute) !== inherited) {
|
|
11232
|
+
Object.setPrototypeOf(graphic.attribute, inherited);
|
|
11233
|
+
}
|
|
11234
|
+
if (graphic._baseAttributes && Object.getPrototypeOf(graphic._baseAttributes) !== inherited) {
|
|
11235
|
+
Object.setPrototypeOf(graphic._baseAttributes, inherited);
|
|
11236
|
+
}
|
|
11237
|
+
}
|
|
11238
|
+
static commitDerivedAttributePatch(graphic, patch, removedKeys, context) {
|
|
11239
|
+
if (!(removedKeys === null || removedKeys === void 0 ? void 0 : removedKeys.length)) {
|
|
11240
|
+
graphic.setAttributes(patch, false, context);
|
|
11241
|
+
return;
|
|
11242
|
+
}
|
|
11243
|
+
graphic.detachAttributeFromBaseAttributes();
|
|
11244
|
+
const base = graphic.getBaseAttributesStorage();
|
|
11245
|
+
removedKeys.forEach(key => delete base[key]);
|
|
11246
|
+
graphic.applyBaseAttributes(patch);
|
|
11247
|
+
graphic.commitBaseAttributeMutation(false, context);
|
|
11248
|
+
}
|
|
11196
11249
|
onAttributeUpdate(context) {
|
|
11250
|
+
if (this.glyphHost) {
|
|
11251
|
+
Graphic.bindGlyphAttributes(this, this.glyphHost.attribute);
|
|
11252
|
+
}
|
|
11197
11253
|
if (context && context.skipUpdateCallback) {
|
|
11198
11254
|
return;
|
|
11199
11255
|
}
|
|
@@ -11242,8 +11298,11 @@ class Graphic extends Node {
|
|
|
11242
11298
|
(_a = this.stateEngine) === null || _a === void 0 ? void 0 : _a.setResolveContext(this, stateResolveBaseAttrs);
|
|
11243
11299
|
return stateResolveBaseAttrs;
|
|
11244
11300
|
}
|
|
11245
|
-
ensureStateEngine(stateResolveBaseAttrs
|
|
11246
|
-
|
|
11301
|
+
ensureStateEngine(stateResolveBaseAttrs, stateNames) {
|
|
11302
|
+
var _a;
|
|
11303
|
+
if (stateResolveBaseAttrs === void 0) { stateResolveBaseAttrs = this.getStateResolveBaseAttrs(); }
|
|
11304
|
+
if (stateNames === void 0) { stateNames = (_a = this.currentStates) !== null && _a !== void 0 ? _a : EMPTY_STATE_NAMES; }
|
|
11305
|
+
const { compiledDefinitions, stateOrder } = this.resolveEffectiveCompiledDefinitions(stateNames);
|
|
11247
11306
|
this.compiledStateDefinitions = compiledDefinitions;
|
|
11248
11307
|
if (!compiledDefinitions) {
|
|
11249
11308
|
this.stateEngine = undefined;
|
|
@@ -11252,14 +11311,17 @@ class Graphic extends Node {
|
|
|
11252
11311
|
else if (!this.stateEngine ||
|
|
11253
11312
|
this.stateEngineCompiledDefinitions !== compiledDefinitions ||
|
|
11254
11313
|
this.stateEngineStateSort !== this.stateSort ||
|
|
11314
|
+
this.stateEngineStateOrder !== stateOrder ||
|
|
11255
11315
|
this.stateEngineMergeMode !== this.stateMergeMode) {
|
|
11256
11316
|
this.stateEngine = new StateEngine({
|
|
11257
11317
|
compiledDefinitions,
|
|
11258
11318
|
stateSort: this.stateSort,
|
|
11319
|
+
stateOrder,
|
|
11259
11320
|
mergeMode: this.stateMergeMode
|
|
11260
11321
|
});
|
|
11261
11322
|
this.stateEngineCompiledDefinitions = compiledDefinitions;
|
|
11262
11323
|
this.stateEngineStateSort = this.stateSort;
|
|
11324
|
+
this.stateEngineStateOrder = stateOrder;
|
|
11263
11325
|
this.stateEngineMergeMode = this.stateMergeMode;
|
|
11264
11326
|
}
|
|
11265
11327
|
this.syncStateResolveContext(stateResolveBaseAttrs);
|
|
@@ -11300,7 +11362,7 @@ class Graphic extends Node {
|
|
|
11300
11362
|
};
|
|
11301
11363
|
}
|
|
11302
11364
|
resolveUseStatesTransition(states, stateResolveBaseAttrs = this.getStateResolveBaseAttrs()) {
|
|
11303
|
-
const stateEngine = this.ensureStateEngine(stateResolveBaseAttrs);
|
|
11365
|
+
const stateEngine = this.ensureStateEngine(stateResolveBaseAttrs, states);
|
|
11304
11366
|
return stateEngine
|
|
11305
11367
|
? this.toGraphicStateTransition(stateEngine.applyStates(states))
|
|
11306
11368
|
: this.resolveLocalUseStatesTransition(states);
|
|
@@ -11313,7 +11375,7 @@ class Graphic extends Node {
|
|
|
11313
11375
|
}
|
|
11314
11376
|
resolveAddStateTransition(stateName, keepCurrentStates) {
|
|
11315
11377
|
var _a;
|
|
11316
|
-
const stateEngine = this.ensureStateEngine();
|
|
11378
|
+
const stateEngine = this.ensureStateEngine(undefined, [stateName]);
|
|
11317
11379
|
if (stateEngine) {
|
|
11318
11380
|
return this.toGraphicStateTransition(stateEngine.addState(stateName, keepCurrentStates));
|
|
11319
11381
|
}
|
|
@@ -11350,7 +11412,7 @@ class Graphic extends Node {
|
|
|
11350
11412
|
return this.resolveLocalUseStatesTransition(nextStates);
|
|
11351
11413
|
}
|
|
11352
11414
|
resolveToggleStateTransition(stateName) {
|
|
11353
|
-
const stateEngine = this.ensureStateEngine();
|
|
11415
|
+
const stateEngine = this.ensureStateEngine(undefined, [stateName]);
|
|
11354
11416
|
if (stateEngine) {
|
|
11355
11417
|
return this.toGraphicStateTransition(stateEngine.toggleState(stateName));
|
|
11356
11418
|
}
|
|
@@ -11364,7 +11426,7 @@ class Graphic extends Node {
|
|
|
11364
11426
|
resolveGraphicStateTransition(states, forceResolverRefresh = false) {
|
|
11365
11427
|
var _a;
|
|
11366
11428
|
const stateResolveBaseAttrs = this.getStateResolveBaseAttrs();
|
|
11367
|
-
const stateEngine = this.ensureStateEngine(stateResolveBaseAttrs);
|
|
11429
|
+
const stateEngine = this.ensureStateEngine(stateResolveBaseAttrs, states);
|
|
11368
11430
|
if (forceResolverRefresh) {
|
|
11369
11431
|
stateEngine === null || stateEngine === void 0 ? void 0 : stateEngine.invalidateResolverCache();
|
|
11370
11432
|
}
|
|
@@ -11493,7 +11555,7 @@ class Graphic extends Node {
|
|
|
11493
11555
|
shouldSkipStateTransitionDefaultAttribute(_key, _targetAttrs) {
|
|
11494
11556
|
return false;
|
|
11495
11557
|
}
|
|
11496
|
-
stopStateAnimates(type
|
|
11558
|
+
stopStateAnimates(type) {
|
|
11497
11559
|
const stopAnimationState = this.stopAnimationState;
|
|
11498
11560
|
if (typeof stopAnimationState === 'function') {
|
|
11499
11561
|
stopAnimationState.call(this, 'state', type);
|
|
@@ -13758,19 +13820,21 @@ class Glyph extends Graphic {
|
|
|
13758
13820
|
this.valid = this.isValid();
|
|
13759
13821
|
}
|
|
13760
13822
|
setSubGraphic(subGraphic) {
|
|
13823
|
+
var _a;
|
|
13761
13824
|
this.detachSubGraphic();
|
|
13762
13825
|
this.subGraphic = subGraphic;
|
|
13763
13826
|
subGraphic.forEach(g => {
|
|
13764
13827
|
g.glyphHost = this;
|
|
13765
|
-
|
|
13828
|
+
Graphic.bindGlyphAttributes(g, this.attribute);
|
|
13766
13829
|
});
|
|
13767
13830
|
this.valid = this.isValid();
|
|
13768
13831
|
this.addUpdateBoundTag();
|
|
13832
|
+
(_a = this.subGraphicEncoder) === null || _a === void 0 ? void 0 : _a.call(this, this);
|
|
13769
13833
|
}
|
|
13770
13834
|
detachSubGraphic() {
|
|
13771
13835
|
this.subGraphic.forEach(g => {
|
|
13772
13836
|
g.glyphHost = null;
|
|
13773
|
-
|
|
13837
|
+
Graphic.bindGlyphAttributes(g, Object.prototype);
|
|
13774
13838
|
});
|
|
13775
13839
|
}
|
|
13776
13840
|
getSubGraphic() {
|
|
@@ -13785,67 +13849,52 @@ class Glyph extends Graphic {
|
|
|
13785
13849
|
isValid() {
|
|
13786
13850
|
return true;
|
|
13787
13851
|
}
|
|
13788
|
-
|
|
13789
|
-
|
|
13790
|
-
|
|
13791
|
-
g.addUpdateShapeAndBoundsTag();
|
|
13792
|
-
g.addUpdatePositionTag();
|
|
13793
|
-
});
|
|
13852
|
+
setSubGraphicEncoder(encoder) {
|
|
13853
|
+
this.subGraphicEncoder = encoder;
|
|
13854
|
+
encoder === null || encoder === void 0 ? void 0 : encoder(this);
|
|
13794
13855
|
}
|
|
13795
|
-
|
|
13796
|
-
|
|
13797
|
-
this.subGraphic.forEach(g => {
|
|
13798
|
-
g.addUpdateShapeAndBoundsTag();
|
|
13799
|
-
g.addUpdatePositionTag();
|
|
13800
|
-
});
|
|
13856
|
+
commitSubGraphicAttributes(subGraphic, patch, removedKeys, context) {
|
|
13857
|
+
Graphic.commitDerivedAttributePatch(subGraphic, patch, removedKeys, context);
|
|
13801
13858
|
}
|
|
13802
|
-
|
|
13803
|
-
|
|
13804
|
-
this.
|
|
13805
|
-
|
|
13806
|
-
|
|
13807
|
-
|
|
13808
|
-
|
|
13809
|
-
|
|
13810
|
-
|
|
13811
|
-
|
|
13812
|
-
|
|
13813
|
-
|
|
13814
|
-
|
|
13815
|
-
});
|
|
13816
|
-
return this;
|
|
13817
|
-
}
|
|
13818
|
-
scale(scaleX, scaleY, scaleCenter) {
|
|
13819
|
-
super.scale(scaleX, scaleY, scaleCenter);
|
|
13820
|
-
this.subGraphic.forEach(g => {
|
|
13821
|
-
g.addUpdatePositionTag();
|
|
13822
|
-
g.addUpdateBoundTag();
|
|
13823
|
-
});
|
|
13824
|
-
return this;
|
|
13859
|
+
onAttributeUpdate(context) {
|
|
13860
|
+
var _a, _b;
|
|
13861
|
+
if (this.glyphHost) {
|
|
13862
|
+
Graphic.bindGlyphAttributes(this, this.glyphHost.attribute);
|
|
13863
|
+
}
|
|
13864
|
+
for (const child of this.subGraphic) {
|
|
13865
|
+
Graphic.bindGlyphAttributes(child, this.attribute);
|
|
13866
|
+
}
|
|
13867
|
+
(_a = this.subGraphicEncoder) === null || _a === void 0 ? void 0 : _a.call(this, this, context);
|
|
13868
|
+
if (!(context === null || context === void 0 ? void 0 : context.skipUpdateCallback)) {
|
|
13869
|
+
(_b = this._onUpdate) === null || _b === void 0 ? void 0 : _b.call(this, this);
|
|
13870
|
+
}
|
|
13871
|
+
super.onAttributeUpdate(context);
|
|
13825
13872
|
}
|
|
13826
|
-
|
|
13827
|
-
super.
|
|
13828
|
-
this.subGraphic
|
|
13829
|
-
|
|
13830
|
-
|
|
13831
|
-
|
|
13832
|
-
|
|
13873
|
+
submitUpdateByCategory(category, forceUpdateTag = false) {
|
|
13874
|
+
super.submitUpdateByCategory(category, forceUpdateTag);
|
|
13875
|
+
for (const child of this.subGraphic) {
|
|
13876
|
+
if (forceUpdateTag || category & UpdateCategory.SHAPE) {
|
|
13877
|
+
child.addUpdateShapeAndBoundsTag();
|
|
13878
|
+
}
|
|
13879
|
+
else if (category & UpdateCategory.BOUNDS) {
|
|
13880
|
+
child.addUpdateBoundTag();
|
|
13881
|
+
}
|
|
13882
|
+
if (category & UpdateCategory.PAINT) {
|
|
13883
|
+
child.addUpdatePaintTag();
|
|
13884
|
+
}
|
|
13885
|
+
if (forceUpdateTag || category & UpdateCategory.TRANSFORM) {
|
|
13886
|
+
child.addUpdatePositionTag();
|
|
13887
|
+
}
|
|
13888
|
+
if (forceUpdateTag || category & UpdateCategory.LAYOUT) {
|
|
13889
|
+
child.addUpdateLayoutTag();
|
|
13890
|
+
}
|
|
13891
|
+
}
|
|
13833
13892
|
}
|
|
13834
|
-
|
|
13835
|
-
|
|
13836
|
-
this.subGraphic.forEach(g => {
|
|
13837
|
-
g.addUpdatePositionTag();
|
|
13838
|
-
g.addUpdateBoundTag();
|
|
13839
|
-
});
|
|
13840
|
-
return this;
|
|
13893
|
+
commitBaseAttributesByTouchedKeys(params, forceUpdateTag = false, context) {
|
|
13894
|
+
this.commitBaseAttributesByCategory(params, forceUpdateTag, context);
|
|
13841
13895
|
}
|
|
13842
|
-
|
|
13843
|
-
|
|
13844
|
-
this.subGraphic.forEach(g => {
|
|
13845
|
-
g.addUpdatePositionTag();
|
|
13846
|
-
g.addUpdateBoundTag();
|
|
13847
|
-
});
|
|
13848
|
-
return this;
|
|
13896
|
+
commitBaseAttributeBySingleKey(key, value, forceUpdateTag = false, context) {
|
|
13897
|
+
this.commitBaseAttributesByTouchedKeys({ [key]: value }, forceUpdateTag, context);
|
|
13849
13898
|
}
|
|
13850
13899
|
getGraphicTheme() {
|
|
13851
13900
|
return getTheme(this).glyph;
|
|
@@ -13869,54 +13918,82 @@ class Glyph extends Graphic {
|
|
|
13869
13918
|
needUpdateTag(key) {
|
|
13870
13919
|
return false;
|
|
13871
13920
|
}
|
|
13872
|
-
|
|
13873
|
-
|
|
13874
|
-
|
|
13875
|
-
this.clearStates(hasAnimation);
|
|
13876
|
-
return;
|
|
13877
|
-
}
|
|
13878
|
-
const previousStates = this.currentStates ? this.currentStates.slice() : [];
|
|
13879
|
-
const isChange = ((_a = this.currentStates) === null || _a === void 0 ? void 0 : _a.length) !== states.length ||
|
|
13880
|
-
states.some((stateName, index) => this.currentStates[index] !== stateName);
|
|
13881
|
-
if (!isChange) {
|
|
13882
|
-
return;
|
|
13883
|
-
}
|
|
13884
|
-
this.stopStateAnimates();
|
|
13885
|
-
if (this.stateSort) {
|
|
13886
|
-
states = states.sort(this.stateSort);
|
|
13921
|
+
hasLegacyStateDefinitions() {
|
|
13922
|
+
if (this.glyphStateProxy) {
|
|
13923
|
+
return true;
|
|
13887
13924
|
}
|
|
13888
|
-
const
|
|
13889
|
-
|
|
13890
|
-
|
|
13891
|
-
if (attrs) {
|
|
13892
|
-
Object.assign(stateAttrs, attrs.attributes);
|
|
13925
|
+
for (const name in this.glyphStates) {
|
|
13926
|
+
if (Object.prototype.hasOwnProperty.call(this.glyphStates, name)) {
|
|
13927
|
+
return true;
|
|
13893
13928
|
}
|
|
13894
|
-
});
|
|
13895
|
-
if (!this.beforeStateUpdate(stateAttrs, previousStates, states, hasAnimation, false)) {
|
|
13896
|
-
return;
|
|
13897
13929
|
}
|
|
13898
|
-
|
|
13899
|
-
this.applyStateAttrs(stateAttrs, states, hasAnimation);
|
|
13930
|
+
return false;
|
|
13900
13931
|
}
|
|
13901
|
-
|
|
13902
|
-
this.
|
|
13903
|
-
|
|
13904
|
-
|
|
13905
|
-
|
|
13906
|
-
|
|
13907
|
-
|
|
13908
|
-
|
|
13909
|
-
this.
|
|
13932
|
+
syncSharedStateScopeBindingFromTree(markDirty = true, inheritedSharedStateScope) {
|
|
13933
|
+
return this.hasLegacyStateDefinitions()
|
|
13934
|
+
? this.syncSharedStateScopeBinding(undefined, markDirty)
|
|
13935
|
+
: super.syncSharedStateScopeBindingFromTree(markDirty, inheritedSharedStateScope);
|
|
13936
|
+
}
|
|
13937
|
+
resolveEffectiveCompiledDefinitions(stateNames = []) {
|
|
13938
|
+
var _a, _b;
|
|
13939
|
+
if (!this.hasLegacyStateDefinitions()) {
|
|
13940
|
+
this.legacyDefinitions = undefined;
|
|
13941
|
+
this.legacyCompiledDefinitions = undefined;
|
|
13942
|
+
return super.resolveEffectiveCompiledDefinitions(stateNames);
|
|
13910
13943
|
}
|
|
13911
|
-
|
|
13912
|
-
|
|
13944
|
+
this.syncSharedStateScopeBindingFromTree(false);
|
|
13945
|
+
let changed = false;
|
|
13946
|
+
if (!this.legacyDefinitions ||
|
|
13947
|
+
this.legacyDefinitionsSource !== this.glyphStates ||
|
|
13948
|
+
this.legacyProxySource !== this.glyphStateProxy) {
|
|
13949
|
+
this.legacyDefinitionsSource = this.glyphStates;
|
|
13950
|
+
this.legacyProxySource = this.glyphStateProxy;
|
|
13951
|
+
this.legacyDefinitions = {};
|
|
13952
|
+
for (const name of Object.keys((_a = this.glyphStates) !== null && _a !== void 0 ? _a : {})) {
|
|
13953
|
+
this.legacyDefinitions[name] = this.createLegacyStateDefinition(name);
|
|
13954
|
+
}
|
|
13955
|
+
changed = true;
|
|
13956
|
+
}
|
|
13957
|
+
if (this.glyphStateProxy) {
|
|
13958
|
+
const addDefinition = (name) => {
|
|
13959
|
+
if (!Object.prototype.hasOwnProperty.call(this.legacyDefinitions, name)) {
|
|
13960
|
+
this.legacyDefinitions[name] = this.createLegacyStateDefinition(name);
|
|
13961
|
+
changed = true;
|
|
13962
|
+
}
|
|
13963
|
+
};
|
|
13964
|
+
(_b = this.currentStates) === null || _b === void 0 ? void 0 : _b.forEach(addDefinition);
|
|
13965
|
+
stateNames.forEach(addDefinition);
|
|
13913
13966
|
}
|
|
13967
|
+
if (changed) {
|
|
13968
|
+
this.legacyCompiledDefinitions = new StateDefinitionCompiler().compile(this.legacyDefinitions);
|
|
13969
|
+
}
|
|
13970
|
+
return { compiledDefinitions: this.legacyCompiledDefinitions, stateOrder: 'input' };
|
|
13971
|
+
}
|
|
13972
|
+
createLegacyStateDefinition(name) {
|
|
13973
|
+
return this.glyphStateProxy
|
|
13974
|
+
? {
|
|
13975
|
+
name,
|
|
13976
|
+
resolver: ({ graphic, activeStates }) => { var _a; return (_a = graphic.glyphStateProxy(name, activeStates)) === null || _a === void 0 ? void 0 : _a.attributes; }
|
|
13977
|
+
}
|
|
13978
|
+
: { name, patch: this.glyphStates[name].attributes };
|
|
13914
13979
|
}
|
|
13915
13980
|
clone() {
|
|
13916
13981
|
const glyph = new Glyph(Object.assign({}, this.attribute));
|
|
13917
13982
|
glyph.setSubGraphic(this.subGraphic.map(g => g.clone()));
|
|
13918
13983
|
return glyph;
|
|
13919
13984
|
}
|
|
13985
|
+
release() {
|
|
13986
|
+
super.release();
|
|
13987
|
+
this.subGraphicEncoder = undefined;
|
|
13988
|
+
this._onUpdate = undefined;
|
|
13989
|
+
this.legacyDefinitions = undefined;
|
|
13990
|
+
this.legacyCompiledDefinitions = undefined;
|
|
13991
|
+
this.legacyDefinitionsSource = undefined;
|
|
13992
|
+
this.legacyProxySource = undefined;
|
|
13993
|
+
this.detachSubGraphic();
|
|
13994
|
+
this.subGraphic.forEach(child => child.release());
|
|
13995
|
+
this.subGraphic = [];
|
|
13996
|
+
}
|
|
13920
13997
|
getNoWorkAnimateAttr() {
|
|
13921
13998
|
return Glyph.NOWORK_ANIMATE_ATTR;
|
|
13922
13999
|
}
|