286 lines
8.4 KiB
JavaScript
286 lines
8.4 KiB
JavaScript
|
|
/*
|
|
* 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.
|
|
*/
|
|
|
|
var _util = require("zrender/lib/core/util");
|
|
|
|
var each = _util.each;
|
|
|
|
var Group = require("zrender/lib/container/Group");
|
|
|
|
var componentUtil = require("../util/component");
|
|
|
|
var clazzUtil = require("../util/clazz");
|
|
|
|
var modelUtil = require("../util/model");
|
|
|
|
var graphicUtil = require("../util/graphic");
|
|
|
|
var _task = require("../stream/task");
|
|
|
|
var createTask = _task.createTask;
|
|
|
|
var createRenderPlanner = require("../chart/helper/createRenderPlanner");
|
|
|
|
/*
|
|
* 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.
|
|
*/
|
|
var inner = modelUtil.makeInner();
|
|
var renderPlanner = createRenderPlanner();
|
|
|
|
function Chart() {
|
|
/**
|
|
* @type {module:zrender/container/Group}
|
|
* @readOnly
|
|
*/
|
|
this.group = new Group();
|
|
/**
|
|
* @type {string}
|
|
* @readOnly
|
|
*/
|
|
|
|
this.uid = componentUtil.getUID('viewChart');
|
|
this.renderTask = createTask({
|
|
plan: renderTaskPlan,
|
|
reset: renderTaskReset
|
|
});
|
|
this.renderTask.context = {
|
|
view: this
|
|
};
|
|
}
|
|
|
|
Chart.prototype = {
|
|
type: 'chart',
|
|
|
|
/**
|
|
* Init the chart.
|
|
* @param {module:echarts/model/Global} ecModel
|
|
* @param {module:echarts/ExtensionAPI} api
|
|
*/
|
|
init: function (ecModel, api) {},
|
|
|
|
/**
|
|
* Render the chart.
|
|
* @param {module:echarts/model/Series} seriesModel
|
|
* @param {module:echarts/model/Global} ecModel
|
|
* @param {module:echarts/ExtensionAPI} api
|
|
* @param {Object} payload
|
|
*/
|
|
render: function (seriesModel, ecModel, api, payload) {},
|
|
|
|
/**
|
|
* Highlight series or specified data item.
|
|
* @param {module:echarts/model/Series} seriesModel
|
|
* @param {module:echarts/model/Global} ecModel
|
|
* @param {module:echarts/ExtensionAPI} api
|
|
* @param {Object} payload
|
|
*/
|
|
highlight: function (seriesModel, ecModel, api, payload) {
|
|
toggleHighlight(seriesModel.getData(), payload, 'emphasis');
|
|
},
|
|
|
|
/**
|
|
* Downplay series or specified data item.
|
|
* @param {module:echarts/model/Series} seriesModel
|
|
* @param {module:echarts/model/Global} ecModel
|
|
* @param {module:echarts/ExtensionAPI} api
|
|
* @param {Object} payload
|
|
*/
|
|
downplay: function (seriesModel, ecModel, api, payload) {
|
|
toggleHighlight(seriesModel.getData(), payload, 'normal');
|
|
},
|
|
|
|
/**
|
|
* Remove self.
|
|
* @param {module:echarts/model/Global} ecModel
|
|
* @param {module:echarts/ExtensionAPI} api
|
|
*/
|
|
remove: function (ecModel, api) {
|
|
this.group.removeAll();
|
|
},
|
|
|
|
/**
|
|
* Dispose self.
|
|
* @param {module:echarts/model/Global} ecModel
|
|
* @param {module:echarts/ExtensionAPI} api
|
|
*/
|
|
dispose: function () {},
|
|
|
|
/**
|
|
* Rendering preparation in progressive mode.
|
|
* @param {module:echarts/model/Series} seriesModel
|
|
* @param {module:echarts/model/Global} ecModel
|
|
* @param {module:echarts/ExtensionAPI} api
|
|
* @param {Object} payload
|
|
*/
|
|
incrementalPrepareRender: null,
|
|
|
|
/**
|
|
* Render in progressive mode.
|
|
* @param {Object} params See taskParams in `stream/task.js`
|
|
* @param {module:echarts/model/Series} seriesModel
|
|
* @param {module:echarts/model/Global} ecModel
|
|
* @param {module:echarts/ExtensionAPI} api
|
|
* @param {Object} payload
|
|
*/
|
|
incrementalRender: null,
|
|
|
|
/**
|
|
* Update transform directly.
|
|
* @param {module:echarts/model/Series} seriesModel
|
|
* @param {module:echarts/model/Global} ecModel
|
|
* @param {module:echarts/ExtensionAPI} api
|
|
* @param {Object} payload
|
|
* @return {Object} {update: true}
|
|
*/
|
|
updateTransform: null,
|
|
|
|
/**
|
|
* The view contains the given point.
|
|
* @interface
|
|
* @param {Array.<number>} point
|
|
* @return {boolean}
|
|
*/
|
|
// containPoint: function () {}
|
|
|
|
/**
|
|
* @param {string} eventType
|
|
* @param {Object} query
|
|
* @param {module:zrender/Element} targetEl
|
|
* @param {Object} packedEvent
|
|
* @return {boolen} Pass only when return `true`.
|
|
*/
|
|
filterForExposedEvent: null
|
|
};
|
|
var chartProto = Chart.prototype;
|
|
|
|
chartProto.updateView = chartProto.updateLayout = chartProto.updateVisual = function (seriesModel, ecModel, api, payload) {
|
|
this.render(seriesModel, ecModel, api, payload);
|
|
};
|
|
/**
|
|
* Set state of single element
|
|
* @param {module:zrender/Element} el
|
|
* @param {string} state 'normal'|'emphasis'
|
|
* @param {number} highlightDigit
|
|
*/
|
|
|
|
|
|
function elSetState(el, state, highlightDigit) {
|
|
if (el) {
|
|
el.trigger(state, highlightDigit);
|
|
|
|
if (el.isGroup // Simple optimize.
|
|
&& !graphicUtil.isHighDownDispatcher(el)) {
|
|
for (var i = 0, len = el.childCount(); i < len; i++) {
|
|
elSetState(el.childAt(i), state, highlightDigit);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
/**
|
|
* @param {module:echarts/data/List} data
|
|
* @param {Object} payload
|
|
* @param {string} state 'normal'|'emphasis'
|
|
*/
|
|
|
|
|
|
function toggleHighlight(data, payload, state) {
|
|
var dataIndex = modelUtil.queryDataIndex(data, payload);
|
|
var highlightDigit = payload && payload.highlightKey != null ? graphicUtil.getHighlightDigit(payload.highlightKey) : null;
|
|
|
|
if (dataIndex != null) {
|
|
each(modelUtil.normalizeToArray(dataIndex), function (dataIdx) {
|
|
elSetState(data.getItemGraphicEl(dataIdx), state, highlightDigit);
|
|
});
|
|
} else {
|
|
data.eachItemGraphicEl(function (el) {
|
|
elSetState(el, state, highlightDigit);
|
|
});
|
|
}
|
|
} // Enable Chart.extend.
|
|
|
|
|
|
clazzUtil.enableClassExtend(Chart, ['dispose']); // Add capability of registerClass, getClass, hasClass, registerSubTypeDefaulter and so on.
|
|
|
|
clazzUtil.enableClassManagement(Chart, {
|
|
registerWhenExtend: true
|
|
});
|
|
|
|
Chart.markUpdateMethod = function (payload, methodName) {
|
|
inner(payload).updateMethod = methodName;
|
|
};
|
|
|
|
function renderTaskPlan(context) {
|
|
return renderPlanner(context.model);
|
|
}
|
|
|
|
function renderTaskReset(context) {
|
|
var seriesModel = context.model;
|
|
var ecModel = context.ecModel;
|
|
var api = context.api;
|
|
var payload = context.payload; // ???! remove updateView updateVisual
|
|
|
|
var progressiveRender = seriesModel.pipelineContext.progressiveRender;
|
|
var view = context.view;
|
|
var updateMethod = payload && inner(payload).updateMethod;
|
|
var methodName = progressiveRender ? 'incrementalPrepareRender' : updateMethod && view[updateMethod] ? updateMethod // `appendData` is also supported when data amount
|
|
// is less than progressive threshold.
|
|
: 'render';
|
|
|
|
if (methodName !== 'render') {
|
|
view[methodName](seriesModel, ecModel, api, payload);
|
|
}
|
|
|
|
return progressMethodMap[methodName];
|
|
}
|
|
|
|
var progressMethodMap = {
|
|
incrementalPrepareRender: {
|
|
progress: function (params, context) {
|
|
context.view.incrementalRender(params, context.model, context.ecModel, context.api, context.payload);
|
|
}
|
|
},
|
|
render: {
|
|
// Put view.render in `progress` to support appendData. But in this case
|
|
// view.render should not be called in reset, otherwise it will be called
|
|
// twise. Use `forceFirstProgress` to make sure that view.render is called
|
|
// in any cases.
|
|
forceFirstProgress: true,
|
|
progress: function (params, context) {
|
|
context.view.render(context.model, context.ecModel, context.api, context.payload);
|
|
}
|
|
}
|
|
};
|
|
var _default = Chart;
|
|
module.exports = _default; |