This is an automated email from the ASF dual-hosted git repository. shenyi pushed a commit to branch optimize-code in repository https://gitbox.apache.org/repos/asf/echarts.git
commit ead64f7e85cb67b30a35ccff82d896fa4807b68f Author: pissang <[email protected]> AuthorDate: Sat Oct 9 18:12:05 2021 +0800 style: optimize symbol visual code --- src/visual/symbol.ts | 115 ++++++++++++++++++++------------------------------- 1 file changed, 45 insertions(+), 70 deletions(-) diff --git a/src/visual/symbol.ts b/src/visual/symbol.ts index 019d536..edb94f4 100644 --- a/src/visual/symbol.ts +++ b/src/visual/symbol.ts @@ -17,21 +17,24 @@ * under the License. */ -import {isFunction} from 'zrender/src/core/util'; +import {extend, isFunction, keys} from 'zrender/src/core/util'; import { StageHandler, SeriesOption, SymbolOptionMixin, - SymbolSizeCallback, SymbolCallback, - CallbackDataParams, - SymbolRotateCallback, - SymbolOffsetCallback + CallbackDataParams } from '../util/types'; import SeriesData from '../data/SeriesData'; import SeriesModel from '../model/Series'; import GlobalModel from '../model/Global'; +const SYMBOL_PROPS_WITH_CB = [ + 'symbol', 'symbolSize', 'symbolRotate', 'symbolOffset' +] as const; +const SYMBOL_PROPS: [...typeof SYMBOL_PROPS_WITH_CB, 'symbolKeepAspect'] = SYMBOL_PROPS_WITH_CB.concat([ + 'symbolKeepAspect' +] as any) as any; // Encoding visual for all series include which is filtered for legend drawing const seriesSymbolTask: StageHandler = { @@ -54,58 +57,45 @@ const seriesSymbolTask: StageHandler = { return; } - const symbolType = seriesModel.get('symbol'); - const symbolSize = seriesModel.get('symbolSize'); - const keepAspect = seriesModel.get('symbolKeepAspect'); - const symbolRotate = seriesModel.get('symbolRotate'); - const symbolOffset = seriesModel.get('symbolOffset'); - - const hasSymbolTypeCallback = isFunction(symbolType); - const hasSymbolSizeCallback = isFunction(symbolSize); - const hasSymbolRotateCallback = isFunction(symbolRotate); - const hasSymbolOffsetCallback = isFunction(symbolOffset); - const hasCallback = hasSymbolTypeCallback - || hasSymbolSizeCallback - || hasSymbolRotateCallback - || hasSymbolOffsetCallback; - const seriesSymbol = (!hasSymbolTypeCallback && symbolType) ? symbolType : seriesModel.defaultSymbol; - const seriesSymbolSize = !hasSymbolSizeCallback ? symbolSize : null; - const seriesSymbolRotate = !hasSymbolRotateCallback ? symbolRotate : null; - const seriesSymbolOffset = !hasSymbolOffsetCallback ? symbolOffset : null; - - data.setVisual({ - legendIcon: seriesModel.legendIcon || seriesSymbol as string, - // If seting callback functions on `symbol` or `symbolSize`, for simplicity and avoiding - // to bring trouble, we do not pick a reuslt from one of its calling on data item here, - // but just use the default value. Callback on `symbol` or `symbolSize` is convenient in - // some cases but generally it is not recommanded. - symbol: seriesSymbol as string, - symbolSize: seriesSymbolSize as number | number[], - symbolKeepAspect: keepAspect, - symbolRotate: seriesSymbolRotate as number, - symbolOffset: seriesSymbolOffset as string | number | (string | number)[] - }); + const symbolOptions = {} as Record<(typeof SYMBOL_PROPS_WITH_CB)[number], any>; + const symbolOptionsCb = {} as Record<(typeof SYMBOL_PROPS_WITH_CB)[number], any>; + let hasCallback = false; + for (let i = 0; i < SYMBOL_PROPS_WITH_CB.length; i++) { + const symbolPropName = SYMBOL_PROPS_WITH_CB[i]; + const val = seriesModel.get(symbolPropName); + if (isFunction(val)) { + hasCallback = true; + symbolOptionsCb[symbolPropName] = val; + } + else { + symbolOptions[symbolPropName] = val; + } + } + symbolOptions.symbol = symbolOptions.symbol || seriesModel.defaultSymbol; + + data.setVisual(extend({ + legendIcon: seriesModel.legendIcon || symbolOptions.symbol, + symbolKeepAspect: seriesModel.get('symbolKeepAspect') + }, symbolOptions)); // Only visible series has each data be visual encoded if (ecModel.isSeriesFiltered(seriesModel)) { return; } + const symbolPropsCb = keys(symbolOptionsCb); + function dataEach(data: SeriesData, idx: number) { const rawValue = seriesModel.getRawValue(idx); const params = seriesModel.getDataParams(idx); - hasSymbolTypeCallback && data.setItemVisual( - idx, 'symbol', (symbolType as SymbolCallback<CallbackDataParams>)(rawValue, params) - ); - hasSymbolSizeCallback && data.setItemVisual( - idx, 'symbolSize', (symbolSize as SymbolSizeCallback<CallbackDataParams>)(rawValue, params) - ); - hasSymbolRotateCallback && data.setItemVisual( - idx, 'symbolRotate', (symbolRotate as SymbolRotateCallback<CallbackDataParams>)(rawValue, params) - ); - hasSymbolOffsetCallback && data.setItemVisual( - idx, 'symbolOffset', (symbolOffset as SymbolOffsetCallback<CallbackDataParams>)(rawValue, params) - ); + + for (let i = 0; i < symbolPropsCb.length; i++) { + const symbolPropName = symbolPropsCb[i]; + data.setItemVisual( + idx, symbolPropName, + (symbolOptionsCb[symbolPropName] as SymbolCallback<CallbackDataParams>)(rawValue, params) + ); + } } return { dataEach: hasCallback ? dataEach : null }; @@ -135,28 +125,13 @@ const dataSymbolTask: StageHandler = { function dataEach(data: SeriesData, idx: number) { const itemModel = data.getItemModel<SymbolOptionMixin>(idx); - const itemSymbolType = itemModel.getShallow('symbol', true); - const itemSymbolSize = itemModel.getShallow('symbolSize', true); - const itemSymbolRotate = itemModel.getShallow('symbolRotate', true); - const itemSymbolOffset = itemModel.getShallow('symbolOffset', true); - const itemSymbolKeepAspect = itemModel.getShallow('symbolKeepAspect', true); - - // If has item symbol - if (itemSymbolType != null) { - data.setItemVisual(idx, 'symbol', itemSymbolType); - } - if (itemSymbolSize != null) { - // PENDING Transform symbolSize ? - data.setItemVisual(idx, 'symbolSize', itemSymbolSize); - } - if (itemSymbolRotate != null) { - data.setItemVisual(idx, 'symbolRotate', itemSymbolRotate); - } - if (itemSymbolOffset != null) { - data.setItemVisual(idx, 'symbolOffset', itemSymbolOffset); - } - if (itemSymbolKeepAspect != null) { - data.setItemVisual(idx, 'symbolKeepAspect', itemSymbolKeepAspect); + + for (let i = 0; i < SYMBOL_PROPS.length; i++) { + const symbolPropName = SYMBOL_PROPS[i]; + const val = itemModel.getShallow(symbolPropName, true); + if (val != null) { + data.setItemVisual(idx, symbolPropName, val); + } } } --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
