/* * 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 AxisBuilder from './AxisBuilder'; import * as graphic from '../../util/graphic'; import * as singleAxisHelper from '../../coord/single/singleAxisHelper'; import AxisView from './AxisView'; import {rectCoordAxisBuildSplitArea, rectCoordAxisHandleRemove} from './axisSplitHelper'; import SingleAxisModel from '../../coord/single/AxisModel'; import GlobalModel from '../../model/Global'; import ExtensionAPI from '../../core/ExtensionAPI'; import { Payload } from '../../util/types'; const axisBuilderAttrs = [ 'axisLine', 'axisTickLabel', 'axisName' ] as const; const selfBuilderAttrs = ['splitArea', 'splitLine'] as const; class SingleAxisView extends AxisView { static readonly type = 'singleAxis'; readonly type = SingleAxisView.type; private _axisGroup: graphic.Group; axisPointerClass = 'SingleAxisPointer'; render(axisModel: SingleAxisModel, ecModel: GlobalModel, api: ExtensionAPI, payload: Payload) { const group = this.group; group.removeAll(); const oldAxisGroup = this._axisGroup; this._axisGroup = new graphic.Group(); const layout = singleAxisHelper.layout(axisModel); const axisBuilder = new AxisBuilder(axisModel, layout); zrUtil.each(axisBuilderAttrs, axisBuilder.add, axisBuilder); group.add(this._axisGroup); group.add(axisBuilder.getGroup()); zrUtil.each(selfBuilderAttrs, function (name) { if (axisModel.get([name, 'show'])) { axisElementBuilders[name](this, this.group, this._axisGroup, axisModel); } }, this); graphic.groupTransition(oldAxisGroup, this._axisGroup, axisModel); super.render(axisModel, ecModel, api, payload); } remove() { rectCoordAxisHandleRemove(this); } } interface AxisElementBuilder { (axisView: SingleAxisView, group: graphic.Group, axisGroup: graphic.Group, axisModel: SingleAxisModel): void } const axisElementBuilders: Record = { splitLine(axisView, group, axisGroup, axisModel) { const axis = axisModel.axis; if (axis.scale.isBlank()) { return; } const splitLineModel = axisModel.getModel('splitLine'); const lineStyleModel = splitLineModel.getModel('lineStyle'); let lineColors = lineStyleModel.get('color'); lineColors = lineColors instanceof Array ? lineColors : [lineColors]; const lineWidth = lineStyleModel.get('width'); const gridRect = axisModel.coordinateSystem.getRect(); const isHorizontal = axis.isHorizontal(); const splitLines: graphic.Line[][] = []; let lineCount = 0; const ticksCoords = axis.getTicksCoords({ tickModel: splitLineModel }); const p1 = []; const p2 = []; for (let i = 0; i < ticksCoords.length; ++i) { const tickCoord = axis.toGlobalCoord(ticksCoords[i].coord); if (isHorizontal) { p1[0] = tickCoord; p1[1] = gridRect.y; p2[0] = tickCoord; p2[1] = gridRect.y + gridRect.height; } else { p1[0] = gridRect.x; p1[1] = tickCoord; p2[0] = gridRect.x + gridRect.width; p2[1] = tickCoord; } const line = new graphic.Line({ shape: { x1: p1[0], y1: p1[1], x2: p2[0], y2: p2[1] }, silent: true }); graphic.subPixelOptimizeLine(line.shape, lineWidth); const colorIndex = (lineCount++) % lineColors.length; splitLines[colorIndex] = splitLines[colorIndex] || []; splitLines[colorIndex].push(line); } const lineStyle = lineStyleModel.getLineStyle(['color']); for (let i = 0; i < splitLines.length; ++i) { group.add(graphic.mergePath(splitLines[i], { style: zrUtil.defaults({ stroke: lineColors[i % lineColors.length] }, lineStyle), silent: true })); } }, splitArea(axisView, group, axisGroup, axisModel) { rectCoordAxisBuildSplitArea(axisView, axisGroup, axisModel, axisModel); } }; export default SingleAxisView;