You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@echarts.apache.org by sh...@apache.org on 2021/10/09 10:13:19 UTC

[echarts] 01/01: style: optimize symbol visual code

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 <bm...@gmail.com>
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: commits-unsubscribe@echarts.apache.org
For additional commands, e-mail: commits-help@echarts.apache.org