Spaces:
Running
Running
/* | |
* 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; | |
} | |