提交 a7126332 编写于 作者: P pah100

datazoom history

上级 a088695c
......@@ -7,9 +7,7 @@ define(function(require) {
var env = require('zrender/core/env');
var echarts = require('../../echarts');
var modelUtil = require('../../util/model');
var numberUtil = require('../../util/number');
var AxisProxy = require('./AxisProxy');
var asc = numberUtil.asc;
var each = zrUtil.each;
var eachAxisDim = modelUtil.eachAxisDim;
......
/**
* @file History manager.
*/
define(function(require) {
var zrUtil = require('zrender/core/util');
var each = zrUtil.each;
var ATTR = '\0_ec_hist_mgr';
/**
* Only one instance exists in one chart instance.
*
* @class
*/
var HistoryManager = function (ecModel) {
/**
* @readOnly
* @type {module: echarts/model/Global}
*/
this.ecModel = ecModel;
/**
* [{key: dataZoomId, value: {dataZoomId, range}}, ...]
* History length of each dataZoom may be different.
* this._history[0] is used to store origin range.
* @private
* @type {Array.<Object>}
*/
this._history = [{}];
};
HistoryManager.prototype = {
constructor: HistoryManager,
/**
* @public
* @param {Object} newSnapshot {dataZoomId, batch: [payloadInfo, ...]}
*/
push: function (newSnapshot) {
var history = this._history;
var ecModel = this.ecModel;
// If previous dataZoom can not be found,
// complete an range with current range.
each(newSnapshot, function (batchItem, dataZoomId) {
var i = history.length - 1;
for (; i >= 0; i--) {
var snapshot = history[i];
if (snapshot[dataZoomId]) {
break;
}
}
if (i < 0) {
// No origin range set, create one by current range.
var dataZoomModel = ecModel.queryComponents(
{mainType: 'dataZoom', subType: 'select', id: dataZoomId}
)[0];
if (dataZoomModel) {
var percentRange = dataZoomModel.getPercentRange();
history[0][dataZoomId] = {
dataZoomId: dataZoomId,
start: percentRange[0],
end: percentRange[1]
};
}
}
});
history.push(newSnapshot);
},
/**
* @public
* @return {Object} snapshot
*/
pop: function () {
var history = this._history;
var head = history[history.length - 1];
history.length > 1 && history.pop();
// Find top for all dataZoom.
var snapshot = {};
each(head, function (batchItem, dataZoomId) {
for (var i = history.length - 1; i >= 0; i--) {
var batchItem = history[i][dataZoomId];
if (batchItem) {
snapshot[dataZoomId] = batchItem;
break;
}
}
});
return snapshot;
},
/**
* @public
*/
clear: function () {
this._history = [{}];
},
/**
* @public
* @return {number} records. always >= 1.
*/
count: function () {
return this._history.length;
}
};
/**
* @return {module:echarts/component/dataZoom/HistoryManager}
*/
HistoryManager.getInstance = function (ecModel) {
var instance = ecModel[ATTR];
if (!instance) {
instance = ecModel[ATTR] = new HistoryManager(ecModel);
}
return instance;
};
return HistoryManager;
});
\ No newline at end of file
......@@ -6,6 +6,7 @@ define(function(require) {
var SelectController = require('../../helper/SelectController');
var BoundingRect = require('zrender/core/BoundingRect');
var Group = require('zrender/container/Group');
var HistoryManager = require('../../dataZoom/HistoryManager');
var each = zrUtil.each;
var asc = numberUtil.asc;
......@@ -37,15 +38,6 @@ define(function(require) {
* @type {Object}
*/
this._selectedMap = {zoom: false, back: false};
/**
* [{key: dataZoomId, value: {dataZoomId, range}}, ...]
* History length of each dataZoom may be different.
* this._history[0] is used to store origin range.
* @private
* @type {Array.<Object>}
*/
this._history = [{}];
}
DataZoom.defaultOption = {
......@@ -77,12 +69,10 @@ define(function(require) {
proto.remove = function () {
this._disposeController();
this._history = {};
};
proto.dispose = function (ecModel, api) {
this._disposeController();
this._history = {};
this._controllerGroup && api.getZr().remove(this._controllerGroup);
};
......@@ -96,6 +86,7 @@ define(function(require) {
var zr = api.getZr();
featureModel.setIconStatus('zoom', isZoomActive ? 'emphasis' : 'normal');
if (isZoomActive) {
zr.setDefaultCursorStyle('crosshair');
......@@ -117,7 +108,13 @@ define(function(require) {
},
back: function (controllerGroup, featureModel, ecModel, api) {
this._dispatchAction(this._popHistory(), api);
var histMgr = HistoryManager.getInstance(ecModel);
var snapshot = histMgr.pop();
// Update state of back button.
this._selectedMap.back = histMgr.count() <= 1;
this._dispatchAction(snapshot, api);
}
};
......@@ -209,7 +206,12 @@ define(function(require) {
}
});
this._pushHistory(snapshot, ecModel);
var histMgr = HistoryManager.getInstance(ecModel);
histMgr.push(snapshot);
// Update state of back button.
this._selectedMap.back = histMgr.count() <= 1;
this._dispatchAction(snapshot, api);
};
......@@ -264,70 +266,6 @@ define(function(require) {
});
};
/**
* @private
*/
proto._pushHistory = function (newSnapshot, ecModel) {
var history = this._history;
// If previous dataZoom can not be found,
// complete an range with current range.
each(newSnapshot, function (batchItem, dataZoomId) {
var i = history.length - 1;
for (; i >= 0; i--) {
var snapshot = history[i];
if (snapshot[dataZoomId]) {
break;
}
}
if (i < 0) {
// No origin range set, create one by current range.
var dataZoomModel = ecModel.queryComponents(
{mainType: 'dataZoom', subType: 'select', id: dataZoomId}
)[0];
if (dataZoomModel) {
var percentRange = dataZoomModel.getPercentRange();
history[0][dataZoomId] = {
dataZoomId: dataZoomId,
start: percentRange[0],
end: percentRange[1]
};
}
}
});
history.push(newSnapshot);
// Update state of back button.
this._selectedMap.back = history.length <= 1;
};
/**
* @private
*/
proto._popHistory = function () {
var history = this._history;
var head = history[history.length - 1];
history.length > 1 && history.pop();
// Update state of back button.
this._selectedMap.back = history.length <= 1;
// Find top for all dataZoom.
var snapshot = {};
each(head, function (batchItem, dataZoomId) {
for (var i = history.length - 1; i >= 0; i--) {
var batchItem = history[i][dataZoomId];
if (batchItem) {
snapshot[dataZoomId] = batchItem;
break;
}
}
});
return snapshot;
};
require('../featureManager').register('dataZoom', DataZoom);
......
define(function(require) {
'use strict';
var HistoryManager = require('../../dataZoom/HistoryManager');
function Restore(model) {
this.model = model;
}
......@@ -15,6 +17,8 @@ define(function(require) {
var proto = Restore.prototype;
proto.onclick = function (ecModel, api, type) {
HistoryManager.getInstance(ecModel).clear();
api.dispatchAction({
type: 'restore',
from: this.uid
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册