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/12 12:07:54 UTC

[echarts] branch optimize-progressive updated: fix(zlevel): optimize zlevel allocate for effect series

This is an automated email from the ASF dual-hosted git repository.

shenyi pushed a commit to branch optimize-progressive
in repository https://gitbox.apache.org/repos/asf/echarts.git


The following commit(s) were added to refs/heads/optimize-progressive by this push:
     new 3cae99e  fix(zlevel): optimize zlevel allocate for effect series
3cae99e is described below

commit 3cae99ee7ea4f8d2308dd5ff4a3098b78cfa41c4
Author: pissang <bm...@gmail.com>
AuthorDate: Tue Oct 12 20:06:43 2021 +0800

    fix(zlevel): optimize zlevel allocate for effect series
---
 src/chart/lines/LinesSeries.ts     |  7 +++-
 src/chart/scatter/ScatterSeries.ts |  6 ++-
 src/core/echarts.ts                | 78 ++++++++++++++++++++++----------------
 src/model/Component.ts             |  9 ++++-
 4 files changed, 61 insertions(+), 39 deletions(-)

diff --git a/src/chart/lines/LinesSeries.ts b/src/chart/lines/LinesSeries.ts
index bd782ff..09304c6 100644
--- a/src/chart/lines/LinesSeries.ts
+++ b/src/chart/lines/LinesSeries.ts
@@ -372,10 +372,13 @@ class LinesSeriesModel extends SeriesModel<LinesSeriesOption> {
         return progressiveThreshold;
     }
 
-    needsSeparateZLevel() {
+    getZLevelKey() {
         const effectModel = this.getModel('effect');
+        const trailLength = effectModel.get('trailLength');
         return this.getData().count() > this.getProgressiveThreshold()
-            || (effectModel.get('show') && effectModel.get('trailLength') > 0);
+            // Each progressive series has individual key.
+            ? this.id
+            : (effectModel.get('show') && trailLength > 0 ? trailLength + '' : '');
     }
 
     static defaultOption: LinesSeriesOption = {
diff --git a/src/chart/scatter/ScatterSeries.ts b/src/chart/scatter/ScatterSeries.ts
index 6eada31..129b88c 100644
--- a/src/chart/scatter/ScatterSeries.ts
+++ b/src/chart/scatter/ScatterSeries.ts
@@ -115,8 +115,10 @@ class ScatterSeriesModel extends SeriesModel<ScatterSeriesOption> {
         return selectors.point(data.getItemLayout(dataIndex));
     }
 
-    needsSeparateZLevel() {
-        return this.getData().count() > this.getProgressiveThreshold();
+    getZLevelKey() {
+        // Each progressive series has individual key.
+        return this.getData().count() > this.getProgressiveThreshold()
+            ? this.id : '';
     }
 
 
diff --git a/src/core/echarts.ts b/src/core/echarts.ts
index 740f632..c279f16 100644
--- a/src/core/echarts.ts
+++ b/src/core/echarts.ts
@@ -291,7 +291,6 @@ let flushPendingActions: (this: ECharts, silent: boolean) => void;
 let triggerUpdatedEvent: (this: ECharts, silent: boolean) => void;
 let bindRenderedEvent: (zr: zrender.ZRenderType, ecIns: ECharts) => void;
 let bindMouseEvent: (zr: zrender.ZRenderType, ecIns: ECharts) => void;
-let clearColorPalette: (ecModel: GlobalModel) => void;
 let render: (
     ecIns: ECharts, ecModel: GlobalModel, api: ExtensionAPI, payload: Payload, updateParams: UpdateLifecycleParams
 ) => void;
@@ -2000,61 +1999,74 @@ class ECharts extends Eventful<ECEventDefinition> {
             });
         };
 
-        clearColorPalette = function (ecModel: GlobalModel): void {
+        function clearColorPalette(ecModel: GlobalModel): void {
             ecModel.clearColorPalette();
             ecModel.eachSeries(function (seriesModel) {
                 seriesModel.clearColorPalette();
             });
         };
 
-        // Allocate zlevels
+        // Allocate zlevels for series and components
         function allocateZlevels(ecModel: GlobalModel) {
             interface ZLevelItem {
                 z: number,
+                zlevel: number,
                 idx: number,
-                type: string
+                type: string,
+                key: string
             };
             const componentZLevels: ZLevelItem[] = [];
             const seriesZLevels: ZLevelItem[] = [];
-            let lastSeriesZLevel: number;
-            let isLastSeriesNeedsSeparate: boolean;
+            let hasSeperateZLevel = false;
             ecModel.eachComponent(function (componentType, componentModel) {
                 const zlevel = componentModel.get('zlevel') || 0;
+                const z = componentModel.get('z') || 0;
+                const zlevelKey = componentModel.getZLevelKey();
+                hasSeperateZLevel = hasSeperateZLevel || !!zlevelKey;
                 (componentType === 'series' ? seriesZLevels : componentZLevels).push({
-                    z: zlevel,
+                    zlevel,
+                    z,
                     idx: componentModel.componentIndex,
-                    type: componentType
+                    type: componentType,
+                    key: zlevelKey
                 });
             });
 
-            // Series after component
-            const zLevels: ZLevelItem[] = componentZLevels.concat(seriesZLevels);
+            if (hasSeperateZLevel) {
+                // Series after component
+                const zLevels: ZLevelItem[] = componentZLevels.concat(seriesZLevels);
+                let lastSeriesZLevel: number;
+                let lastSeriesKey: string;
 
-            timsort(zLevels, (a, b) => {
-                return a.z - b.z;
-            });
-            each(zLevels, item => {
-                const componentModel = ecModel.getComponent(item.type, item.idx);
-                let zlevel = item.z;
-                if (lastSeriesZLevel != null) {
-                    zlevel = Math.max(lastSeriesZLevel, zlevel);
-                }
-                if (componentModel.needsSeparateZLevel()) {
-                    if (zlevel === lastSeriesZLevel) {
-                        zlevel++;
+                timsort(zLevels, (a, b) => {
+                    if (a.zlevel === b.zlevel) {
+                        return a.z - b.z;
                     }
-                    isLastSeriesNeedsSeparate = true;
-                }
-                else if (isLastSeriesNeedsSeparate) {
-                    if (zlevel === lastSeriesZLevel) {
-                        zlevel++;
+                    return a.zlevel - b.zlevel;
+                });
+                each(zLevels, item => {
+                    const componentModel = ecModel.getComponent(item.type, item.idx);
+                    let zlevel = item.zlevel;
+                    const key = item.key;
+                    if (lastSeriesZLevel != null) {
+                        zlevel = Math.max(lastSeriesZLevel, zlevel);
                     }
-                    isLastSeriesNeedsSeparate = false;
-                }
-                lastSeriesZLevel = zlevel;
-                componentModel.setZLevel(zlevel);
-            });
-
+                    if (key) {
+                        if (zlevel === lastSeriesZLevel && key !== lastSeriesKey) {
+                            zlevel++;
+                        }
+                        lastSeriesKey = key;
+                    }
+                    else if (lastSeriesKey) {
+                        if (zlevel === lastSeriesZLevel) {
+                            zlevel++;
+                        }
+                        lastSeriesKey = '';
+                    }
+                    lastSeriesZLevel = zlevel;
+                    componentModel.setZLevel(zlevel);
+                });
+            }
         }
 
         render = (
diff --git a/src/model/Component.ts b/src/model/Component.ts
index e18fb61..e7728f0 100644
--- a/src/model/Component.ts
+++ b/src/model/Component.ts
@@ -311,8 +311,13 @@ class ComponentModel<Opt extends ComponentOption = ComponentOption> extends Mode
         };
     }
 
-    needsSeparateZLevel() {
-        return false;
+    /**
+     * Get key for zlevel.
+     * If developers don't configure zlevel. We will assign zlevel to series based on the key.
+     * For example, lines with trail effect and progressive series will in an individual zlevel.
+     */
+    getZLevelKey(): string {
+        return '';
     }
 
     setZLevel(zlevel: number) {

---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@echarts.apache.org
For additional commands, e-mail: commits-help@echarts.apache.org