| /* | |
| * 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 clazzUtil from '../util/clazz'; | |
| import { Dictionary } from 'zrender/src/core/types'; | |
| import SeriesData from '../data/SeriesData'; | |
| import { | |
| DimensionName, | |
| ScaleDataValue, | |
| OptionDataValue, | |
| DimensionLoose, | |
| ScaleTick | |
| } from '../util/types'; | |
| import { ScaleRawExtentInfo } from '../coord/scaleRawExtentInfo'; | |
| abstract class Scale<SETTING extends Dictionary<unknown> = Dictionary<unknown>> { | |
| type: string; | |
| private _setting: SETTING; | |
| protected _extent: [number, number]; | |
| private _isBlank: boolean; | |
| // Inject | |
| readonly rawExtentInfo: ScaleRawExtentInfo; | |
| constructor(setting?: SETTING) { | |
| this._setting = setting || {} as SETTING; | |
| this._extent = [Infinity, -Infinity]; | |
| } | |
| getSetting<KEY extends keyof SETTING>(name: KEY): SETTING[KEY] { | |
| return this._setting[name]; | |
| } | |
| /** | |
| * Parse input val to valid inner number. | |
| * Notice: This would be a trap here, If the implementation | |
| * of this method depends on extent, and this method is used | |
| * before extent set (like in dataZoom), it would be wrong. | |
| * Nevertheless, parse does not depend on extent generally. | |
| */ | |
| abstract parse(val: OptionDataValue): number; | |
| /** | |
| * Whether contain the given value. | |
| */ | |
| abstract contain(val: ScaleDataValue): boolean; | |
| /** | |
| * Normalize value to linear [0, 1], return 0.5 if extent span is 0. | |
| */ | |
| abstract normalize(val: ScaleDataValue): number; | |
| /** | |
| * Scale normalized value to extent. | |
| */ | |
| abstract scale(val: number): number; | |
| /** | |
| * Set extent from data | |
| */ | |
| unionExtent(other: [number, number]): void { | |
| const extent = this._extent; | |
| other[0] < extent[0] && (extent[0] = other[0]); | |
| other[1] > extent[1] && (extent[1] = other[1]); | |
| // not setExtent because in log axis it may transformed to power | |
| // this.setExtent(extent[0], extent[1]); | |
| } | |
| /** | |
| * Set extent from data | |
| */ | |
| unionExtentFromData(data: SeriesData, dim: DimensionName | DimensionLoose): void { | |
| this.unionExtent(data.getApproximateExtent(dim)); | |
| } | |
| /** | |
| * Get extent | |
| * | |
| * Extent is always in increase order. | |
| */ | |
| getExtent(): [number, number] { | |
| return this._extent.slice() as [number, number]; | |
| } | |
| /** | |
| * Set extent | |
| */ | |
| setExtent(start: number, end: number): void { | |
| const thisExtent = this._extent; | |
| if (!isNaN(start)) { | |
| thisExtent[0] = start; | |
| } | |
| if (!isNaN(end)) { | |
| thisExtent[1] = end; | |
| } | |
| } | |
| /** | |
| * If value is in extent range | |
| */ | |
| isInExtentRange(value: number): boolean { | |
| return this._extent[0] <= value && this._extent[1] >= value; | |
| } | |
| /** | |
| * When axis extent depends on data and no data exists, | |
| * axis ticks should not be drawn, which is named 'blank'. | |
| */ | |
| isBlank(): boolean { | |
| return this._isBlank; | |
| } | |
| /** | |
| * When axis extent depends on data and no data exists, | |
| * axis ticks should not be drawn, which is named 'blank'. | |
| */ | |
| setBlank(isBlank: boolean) { | |
| this._isBlank = isBlank; | |
| } | |
| /** | |
| * Update interval and extent of intervals for nice ticks | |
| * | |
| * @param splitNumber Approximated tick numbers. Optional. | |
| * The implementation of `niceTicks` should decide tick numbers | |
| * whether `splitNumber` is given. | |
| * @param minInterval Optional. | |
| * @param maxInterval Optional. | |
| */ | |
| abstract calcNiceTicks( | |
| // FIXME:TS make them in a "opt", the same with `niceExtent`? | |
| splitNumber?: number, | |
| minInterval?: number, | |
| maxInterval?: number | |
| ): void; | |
| abstract calcNiceExtent( | |
| opt?: { | |
| splitNumber?: number, | |
| fixMin?: boolean, | |
| fixMax?: boolean, | |
| minInterval?: number, | |
| maxInterval?: number | |
| } | |
| ): void; | |
| /** | |
| * @return label of the tick. | |
| */ | |
| abstract getLabel(tick: ScaleTick): string; | |
| abstract getTicks(): ScaleTick[]; | |
| abstract getMinorTicks(splitNumber: number): number[][]; | |
| static registerClass: clazzUtil.ClassManager['registerClass']; | |
| static getClass: clazzUtil.ClassManager['getClass']; | |
| } | |
| type ScaleConstructor = typeof Scale & clazzUtil.ClassManager; | |
| clazzUtil.enableClassManagement(Scale as ScaleConstructor); | |
| export default Scale; |