/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ import * as zrUtil from 'zrender/src/core/util'; import * as graphic from '../../util/graphic'; import { makeInner } from '../../util/model'; import GridModel from '../../coord/cartesian/GridModel'; import type SingleAxisView from './SingleAxisView'; import type CartesianAxisView from './CartesianAxisView'; import type SingleAxisModel from '../../coord/single/AxisModel'; import type CartesianAxisModel from '../../coord/cartesian/AxisModel'; import AxisView from './AxisView'; const inner = makeInner<{ // Hash map of color index splitAreaColors: zrUtil.HashMap }, AxisView>(); export function rectCoordAxisBuildSplitArea( axisView: SingleAxisView | CartesianAxisView, axisGroup: graphic.Group, axisModel: SingleAxisModel | CartesianAxisModel, gridModel: GridModel | SingleAxisModel ) { const axis = axisModel.axis; if (axis.scale.isBlank()) { return; } // TODO: TYPE const splitAreaModel = (axisModel as CartesianAxisModel).getModel('splitArea'); const areaStyleModel = splitAreaModel.getModel('areaStyle'); let areaColors = areaStyleModel.get('color'); const gridRect = gridModel.coordinateSystem.getRect(); const ticksCoords = axis.getTicksCoords({ tickModel: splitAreaModel, clamp: true }); if (!ticksCoords.length) { return; } // For Making appropriate splitArea animation, the color and anid // should be corresponding to previous one if possible. const areaColorsLen = areaColors.length; const lastSplitAreaColors = inner(axisView).splitAreaColors; const newSplitAreaColors = zrUtil.createHashMap(); let colorIndex = 0; if (lastSplitAreaColors) { for (let i = 0; i < ticksCoords.length; i++) { const cIndex = lastSplitAreaColors.get(ticksCoords[i].tickValue); if (cIndex != null) { colorIndex = (cIndex + (areaColorsLen - 1) * i) % areaColorsLen; break; } } } let prev = axis.toGlobalCoord(ticksCoords[0].coord); const areaStyle = areaStyleModel.getAreaStyle(); areaColors = zrUtil.isArray(areaColors) ? areaColors : [areaColors]; for (let i = 1; i < ticksCoords.length; i++) { const tickCoord = axis.toGlobalCoord(ticksCoords[i].coord); let x; let y; let width; let height; if (axis.isHorizontal()) { x = prev; y = gridRect.y; width = tickCoord - x; height = gridRect.height; prev = x + width; } else { x = gridRect.x; y = prev; width = gridRect.width; height = tickCoord - y; prev = y + height; } const tickValue = ticksCoords[i - 1].tickValue; tickValue != null && newSplitAreaColors.set(tickValue, colorIndex); axisGroup.add(new graphic.Rect({ anid: tickValue != null ? 'area_' + tickValue : null, shape: { x: x, y: y, width: width, height: height }, style: zrUtil.defaults({ fill: areaColors[colorIndex] }, areaStyle), autoBatch: true, silent: true })); colorIndex = (colorIndex + 1) % areaColorsLen; } inner(axisView).splitAreaColors = newSplitAreaColors; } export function rectCoordAxisHandleRemove(axisView: SingleAxisView | CartesianAxisView) { inner(axisView).splitAreaColors = null; }