|  | /* | 
|  | * 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 GlobalModel from '../../model/Global'; | 
|  | import { Dictionary } from '../../util/types'; | 
|  | import DataZoomModel from './DataZoomModel'; | 
|  | import { makeInner } from '../../util/model'; | 
|  | import { DataZoomPayloadBatchItem } from './helper'; | 
|  |  | 
|  | const each = zrUtil.each; | 
|  |  | 
|  | export type DataZoomStoreSnapshot = Dictionary<DataZoomPayloadBatchItem>; | 
|  |  | 
|  | type Store = { | 
|  | snapshots: DataZoomStoreSnapshot[] | 
|  | }; | 
|  |  | 
|  | const inner = makeInner<Store, GlobalModel>(); | 
|  |  | 
|  | /** | 
|  | * @param ecModel | 
|  | * @param newSnapshot key is dataZoomId | 
|  | */ | 
|  | export function push(ecModel: GlobalModel, newSnapshot: DataZoomStoreSnapshot) { | 
|  | const storedSnapshots = getStoreSnapshots(ecModel); | 
|  |  | 
|  | // If previous dataZoom can not be found, | 
|  | // complete an range with current range. | 
|  | each(newSnapshot, function (batchItem, dataZoomId) { | 
|  | let i = storedSnapshots.length - 1; | 
|  | for (; i >= 0; i--) { | 
|  | const snapshot = storedSnapshots[i]; | 
|  | if (snapshot[dataZoomId]) { | 
|  | break; | 
|  | } | 
|  | } | 
|  | if (i < 0) { | 
|  | // No origin range set, create one by current range. | 
|  | const dataZoomModel = ecModel.queryComponents( | 
|  | {mainType: 'dataZoom', subType: 'select', id: dataZoomId} | 
|  | )[0] as DataZoomModel; | 
|  | if (dataZoomModel) { | 
|  | const percentRange = dataZoomModel.getPercentRange(); | 
|  | storedSnapshots[0][dataZoomId] = { | 
|  | dataZoomId: dataZoomId, | 
|  | start: percentRange[0], | 
|  | end: percentRange[1] | 
|  | }; | 
|  | } | 
|  | } | 
|  | }); | 
|  |  | 
|  | storedSnapshots.push(newSnapshot); | 
|  | } | 
|  |  | 
|  | export function pop(ecModel: GlobalModel) { | 
|  | const storedSnapshots = getStoreSnapshots(ecModel); | 
|  | const head = storedSnapshots[storedSnapshots.length - 1]; | 
|  | storedSnapshots.length > 1 && storedSnapshots.pop(); | 
|  |  | 
|  | // Find top for all dataZoom. | 
|  | const snapshot: DataZoomStoreSnapshot = {}; | 
|  | each(head, function (batchItem, dataZoomId) { | 
|  | for (let i = storedSnapshots.length - 1; i >= 0; i--) { | 
|  | batchItem = storedSnapshots[i][dataZoomId]; | 
|  | if (batchItem) { | 
|  | snapshot[dataZoomId] = batchItem; | 
|  | break; | 
|  | } | 
|  | } | 
|  | }); | 
|  |  | 
|  | return snapshot; | 
|  | } | 
|  |  | 
|  | export function clear(ecModel: GlobalModel) { | 
|  | inner(ecModel).snapshots = null; | 
|  | } | 
|  |  | 
|  | export function count(ecModel: GlobalModel) { | 
|  | return getStoreSnapshots(ecModel).length; | 
|  | } | 
|  |  | 
|  | /** | 
|  | * History length of each dataZoom may be different. | 
|  | * this._history[0] is used to store origin range. | 
|  | */ | 
|  | function getStoreSnapshots(ecModel: GlobalModel) { | 
|  | const store = inner(ecModel); | 
|  | if (!store.snapshots) { | 
|  | store.snapshots = [{}]; | 
|  | } | 
|  | return store.snapshots; | 
|  | } |