suoqiu-f2
Version:
Charts for mobile visualization.
241 lines (237 loc) • 6.82 kB
JavaScript
"use strict";
exports.__esModule = true;
exports["default"] = void 0;
var _scale = require("../../scale");
var _common = require("../../util/common");
var _global = _interopRequireDefault(require("../../global"));
function _interopRequireDefault(e) { return e && e.__esModule ? e : { "default": e }; }
function isFullCircle(coord) {
if (!coord.isPolar) {
return false;
}
var startAngle = coord.startAngle;
var endAngle = coord.endAngle;
if (!(0, _common.isNil)(startAngle) && !(0, _common.isNil)(endAngle) && endAngle - startAngle < Math.PI * 2) {
return false;
}
return true;
}
function clearObj(obj) {
Object.keys(obj).forEach(function (key) {
delete obj[key];
});
}
var ScaleController = /*#__PURE__*/function () {
function ScaleController(cfg) {
// defs 列定义
this.defs = {};
// 已经实例化的scale
this.scales = {};
(0, _common.mix)(this, cfg);
}
var _proto = ScaleController.prototype;
_proto.setFieldDef = function setFieldDef(field, cfg) {
var defs = this.defs;
if ((0, _common.isObject)(field)) {
(0, _common.mix)(defs, field);
} else {
defs[field] = cfg;
}
// 因为可能同时变更多个scale,所以要把所有已实例化的scale都更新下
this.updateScales();
};
_proto._getDef = function _getDef(field) {
var defs = this.defs;
var def = null;
if (_global["default"].scales[field] || defs[field]) {
def = (0, _common.mix)({}, _global["default"].scales[field]);
(0, _common.each)(defs[field], function (v, k) {
if ((0, _common.isNil)(v)) {
delete def[k];
} else {
def[k] = v;
}
});
}
return def;
};
_proto._getDefaultType = function _getDefaultType(field, data, def) {
if (def && def.type) {
return def.type;
}
var type = 'linear';
var value = _common.Array.firstValue(data, field);
if ((0, _common.isArray)(value)) {
value = value[0];
}
if ((0, _common.isString)(value)) {
type = 'cat';
}
return type;
};
_proto._getScaleDef = function _getScaleDef(type, field, data, def) {
var values;
if (def && def.values) {
values = def.values;
} else {
values = _common.Array.values(data, field);
}
var cfg = {
field: field,
values: values
};
if (type !== 'cat' && type !== 'timeCat') {
if (!def || !(def.min && def.max)) {
var _Array$getRange = _common.Array.getRange(values),
min = _Array$getRange.min,
max = _Array$getRange.max;
cfg.min = min;
cfg.max = max;
cfg.nice = true;
}
} else {
cfg.isRounding = false; // used for tickCount calculation
}
return cfg;
}
// 调整range,为了让图形居中
;
_proto._adjustRange = function _adjustRange(type, cfg) {
var range = cfg.range,
values = cfg.values;
// 如果是线性, 或者有自定义range都不处理
if (type === 'linear' || range || !values) {
return cfg;
}
var count = values.length;
// 单只有一条数据时,在中间显示
if (count === 1) {
cfg.range = [0.5, 1];
} else {
var chart = this.chart;
var coord = chart.get('coord');
var widthRatio = _global["default"].widthRatio.multiplePie;
var offset = 0;
if (isFullCircle(coord)) {
if (!coord.transposed) {
cfg.range = [0, 1 - 1 / count];
} else {
offset = 1 / count * widthRatio;
cfg.range = [offset / 2, 1 - offset / 2];
}
} else {
// 为了让图形居中,所以才设置range
offset = 1 / count * 0.5; // 这里可能用0.25会更合理
cfg.range = [offset, 1 - offset];
}
}
return cfg;
};
_proto._getScaleCfg = function _getScaleCfg(field, data) {
var self = this;
var def = self._getDef(field);
if (!data || !data.length) {
if (def && def.type) {
def.field = field;
return {
type: def.type,
cfg: def
};
}
return {
type: 'identity',
cfg: {
value: field,
field: field.toString(),
values: [field]
}
};
}
var firstObj = data[0];
var firstValue = firstObj[field];
if (firstValue === null) {
firstValue = _common.Array.firstValue(data, field);
}
if ((0, _common.isNumber)(field) || (0, _common.isNil)(firstValue) && !def) {
return {
type: 'identity',
cfg: {
value: field,
field: field.toString(),
values: [field]
}
};
}
var type = self._getDefaultType(field, data, def);
var cfg = self._getScaleDef(type, field, data, def);
def && (0, _common.mix)(cfg, def);
cfg = this._adjustRange(type, cfg);
return {
type: type,
cfg: cfg
};
};
_proto.createScale = function createScale(field, data) {
var scales = this.scales;
var _this$_getScaleCfg = this._getScaleCfg(field, data),
type = _this$_getScaleCfg.type,
cfg = _this$_getScaleCfg.cfg;
var scale = scales[field];
// 如果已经存在,且类型相等时直接返回
if (scale && scale.type === type) {
scale.change(cfg);
return scale;
}
var Scale = (0, _scale.getScale)(type);
var newScale = new Scale(cfg);
scales[field] = newScale;
return newScale;
};
_proto._updateScale = function _updateScale(scale) {
var field = scale.field;
// 因为每个field的数据都会不同
var data = this.chart._getScaleData(field);
var _this$_getScaleCfg2 = this._getScaleCfg(field, data),
cfg = _this$_getScaleCfg2.cfg;
scale.change(cfg);
};
_proto.updateScales = function updateScales() {
var _this = this;
var scales = this.scales;
// 修改完列定义后,需要更新已经实例化的scale
// 如果是还没有实例化的,在geom初始化的时候会被实例化,所以这里可以不用更新
(0, _common.each)(scales, function (scale) {
_this._updateScale(scale);
});
}
// 调整scale从0开始
;
_proto.adjustStartZero = function adjustStartZero(scale) {
var defs = this.defs;
var field = scale.field,
min = scale.min,
max = scale.max;
// 如果有定义,则不处理
if (defs[field] && defs[field].min) {
return;
}
if (min > 0) {
scale.change({
min: 0
});
} else if (max < 0) {
scale.change({
max: 0
});
}
};
_proto.clear = function clear() {
// this.defs = {};
// this.scales = {};
clearObj(this.defs);
clearObj(this.scales);
this.data = null;
};
return ScaleController;
}();
var _default = exports["default"] = ScaleController;