cione-comp-lib
Version:
`$ yarn add cione-comp-lib` 或者 `$ npm i cione-comp-lib -S`
180 lines (179 loc) • 7.14 kB
JavaScript
import { clone, map, defaults, isArray, each, indexOf } from "../../../../zrender/lib/core/util.mjs";
import BoundingRect from "../../../../zrender/lib/core/BoundingRect.mjs";
import { createVisualMappings, applyVisual } from "../../visual/visualSolution.mjs";
import { makeBrushCommonSelectorForSeries } from "./selector.mjs";
import { createOrUpdate } from "../../util/throttle.mjs";
import BrushTargetManager from "../helper/BrushTargetManager.mjs";
var STATE_LIST = ["inBrush", "outOfBrush"];
var DISPATCH_METHOD = "__ecBrushSelect";
var DISPATCH_FLAG = "__ecInBrushSelectEvent";
function layoutCovers(ecModel) {
ecModel.eachComponent({
mainType: "brush"
}, function(brushModel) {
var brushTargetManager = brushModel.brushTargetManager = new BrushTargetManager(brushModel.option, ecModel);
brushTargetManager.setInputRanges(brushModel.areas, ecModel);
});
}
function brushVisual(ecModel, api, payload) {
var brushSelected = [];
var throttleType;
var throttleDelay;
ecModel.eachComponent({
mainType: "brush"
}, function(brushModel) {
payload && payload.type === "takeGlobalCursor" && brushModel.setBrushOption(payload.key === "brush" ? payload.brushOption : {
brushType: false
});
});
layoutCovers(ecModel);
ecModel.eachComponent({
mainType: "brush"
}, function(brushModel, brushIndex) {
var thisBrushSelected = {
brushId: brushModel.id,
brushIndex,
brushName: brushModel.name,
areas: clone(brushModel.areas),
selected: []
};
brushSelected.push(thisBrushSelected);
var brushOption = brushModel.option;
var brushLink = brushOption.brushLink;
var linkedSeriesMap = [];
var selectedDataIndexForLink = [];
var rangeInfoBySeries = [];
var hasBrushExists = false;
if (!brushIndex) {
throttleType = brushOption.throttleType;
throttleDelay = brushOption.throttleDelay;
}
var areas = map(brushModel.areas, function(area) {
var builder = boundingRectBuilders[area.brushType];
var selectableArea = defaults({
boundingRect: builder ? builder(area) : void 0
}, area);
selectableArea.selectors = makeBrushCommonSelectorForSeries(selectableArea);
return selectableArea;
});
var visualMappings = createVisualMappings(brushModel.option, STATE_LIST, function(mappingOption) {
mappingOption.mappingMethod = "fixed";
});
isArray(brushLink) && each(brushLink, function(seriesIndex) {
linkedSeriesMap[seriesIndex] = 1;
});
function linkOthers(seriesIndex) {
return brushLink === "all" || !!linkedSeriesMap[seriesIndex];
}
function brushed(rangeInfoList) {
return !!rangeInfoList.length;
}
ecModel.eachSeries(function(seriesModel, seriesIndex) {
var rangeInfoList = rangeInfoBySeries[seriesIndex] = [];
seriesModel.subType === "parallel" ? stepAParallel(seriesModel, seriesIndex) : stepAOthers(seriesModel, seriesIndex, rangeInfoList);
});
function stepAParallel(seriesModel, seriesIndex) {
var coordSys = seriesModel.coordinateSystem;
hasBrushExists = hasBrushExists || coordSys.hasAxisBrushed();
linkOthers(seriesIndex) && coordSys.eachActiveState(seriesModel.getData(), function(activeState, dataIndex) {
activeState === "active" && (selectedDataIndexForLink[dataIndex] = 1);
});
}
function stepAOthers(seriesModel, seriesIndex, rangeInfoList) {
if (!seriesModel.brushSelector || brushModelNotControll(brushModel, seriesIndex)) {
return;
}
each(areas, function(area) {
if (brushModel.brushTargetManager.controlSeries(area, seriesModel, ecModel)) {
rangeInfoList.push(area);
}
hasBrushExists = hasBrushExists || brushed(rangeInfoList);
});
if (linkOthers(seriesIndex) && brushed(rangeInfoList)) {
var data_1 = seriesModel.getData();
data_1.each(function(dataIndex) {
if (checkInRange(seriesModel, rangeInfoList, data_1, dataIndex)) {
selectedDataIndexForLink[dataIndex] = 1;
}
});
}
}
ecModel.eachSeries(function(seriesModel, seriesIndex) {
var seriesBrushSelected = {
seriesId: seriesModel.id,
seriesIndex,
seriesName: seriesModel.name,
dataIndex: []
};
thisBrushSelected.selected.push(seriesBrushSelected);
var rangeInfoList = rangeInfoBySeries[seriesIndex];
var data = seriesModel.getData();
var getValueState = linkOthers(seriesIndex) ? function(dataIndex) {
return selectedDataIndexForLink[dataIndex] ? (seriesBrushSelected.dataIndex.push(data.getRawIndex(dataIndex)), "inBrush") : "outOfBrush";
} : function(dataIndex) {
return checkInRange(seriesModel, rangeInfoList, data, dataIndex) ? (seriesBrushSelected.dataIndex.push(data.getRawIndex(dataIndex)), "inBrush") : "outOfBrush";
};
(linkOthers(seriesIndex) ? hasBrushExists : brushed(rangeInfoList)) && applyVisual(STATE_LIST, visualMappings, data, getValueState);
});
});
dispatchAction(api, throttleType, throttleDelay, brushSelected, payload);
}
function dispatchAction(api, throttleType, throttleDelay, brushSelected, payload) {
if (!payload) {
return;
}
var zr = api.getZr();
if (zr[DISPATCH_FLAG]) {
return;
}
if (!zr[DISPATCH_METHOD]) {
zr[DISPATCH_METHOD] = doDispatch;
}
var fn = createOrUpdate(zr, DISPATCH_METHOD, throttleDelay, throttleType);
fn(api, brushSelected);
}
function doDispatch(api, brushSelected) {
if (!api.isDisposed()) {
var zr = api.getZr();
zr[DISPATCH_FLAG] = true;
api.dispatchAction({
type: "brushSelect",
batch: brushSelected
});
zr[DISPATCH_FLAG] = false;
}
}
function checkInRange(seriesModel, rangeInfoList, data, dataIndex) {
for (var i = 0, len = rangeInfoList.length; i < len; i++) {
var area = rangeInfoList[i];
if (seriesModel.brushSelector(dataIndex, data, area.selectors, area)) {
return true;
}
}
}
function brushModelNotControll(brushModel, seriesIndex) {
var seriesIndices = brushModel.option.seriesIndex;
return seriesIndices != null && seriesIndices !== "all" && (isArray(seriesIndices) ? indexOf(seriesIndices, seriesIndex) < 0 : seriesIndex !== seriesIndices);
}
var boundingRectBuilders = {
rect: function(area) {
return getBoundingRectFromMinMax(area.range);
},
polygon: function(area) {
var minMax;
var range = area.range;
for (var i = 0, len = range.length; i < len; i++) {
minMax = minMax || [[Infinity, -Infinity], [Infinity, -Infinity]];
var rg = range[i];
rg[0] < minMax[0][0] && (minMax[0][0] = rg[0]);
rg[0] > minMax[0][1] && (minMax[0][1] = rg[0]);
rg[1] < minMax[1][0] && (minMax[1][0] = rg[1]);
rg[1] > minMax[1][1] && (minMax[1][1] = rg[1]);
}
return minMax && getBoundingRectFromMinMax(minMax);
}
};
function getBoundingRectFromMinMax(minMax) {
return new BoundingRect(minMax[0][0], minMax[1][0], minMax[0][1] - minMax[0][0], minMax[1][1] - minMax[1][0]);
}
export { brushVisual as default, layoutCovers };