UNPKG

@progress/kendo-charts

Version:

Kendo UI platform-independent Charts library

196 lines (154 loc) 5.94 kB
import { geometry as geo, drawing } from '@progress/kendo-drawing'; import { setDefaultOptions, deepExtend, round, isArray } from '../../common'; import { COORD_PRECISION } from '../../common/constants'; import Gauge from '../gauge'; import RadialScale from './radial-scale'; import RadialPointer from './radial-pointer'; var Group = drawing.Group; var RadialGauge = (function (Gauge) { function RadialGauge () { Gauge.apply(this, arguments); } if ( Gauge ) RadialGauge.__proto__ = Gauge; RadialGauge.prototype = Object.create( Gauge && Gauge.prototype ); RadialGauge.prototype.constructor = RadialGauge; RadialGauge.prototype.reflow = function reflow (bbox) { var this$1 = this; var pointers = this.pointers; this.scale.reflow(bbox); this._initialPlotArea = this.scale.bbox; for (var i = 0; i < pointers.length; i++) { pointers[i].reflow(this$1.scale.arc); this$1._initialPlotArea = geo.Rect.union(this$1._initialPlotArea, pointers[i].bbox); } this.fitScale(bbox); this.alignScale(bbox); this._buildVisual(this.gaugeArea, pointers, this.scale); this._draw(); }; RadialGauge.prototype._buildVisual = function _buildVisual (gaugeArea, pointers, scale) { var visuals = this._visuals = new Group(); visuals.append(gaugeArea); visuals.append(scale.ticks); visuals.append(scale.ranges); this._buildPointers(pointers); visuals.append(scale.labelElements); }; RadialGauge.prototype._buildPointers = function _buildPointers (pointers) { var this$1 = this; for (var i = 0; i < pointers.length; i++) { var current = pointers[i]; current.render(); this$1._visuals.append(current.elements); current.value(current.options.value); } }; RadialGauge.prototype.fitScale = function fitScale (bbox) { var this$1 = this; var arc = this.scale.arc; var plotAreaBox = this._initialPlotArea; var step = Math.abs(this.getDiff(plotAreaBox, bbox)); var min = round(step, COORD_PRECISION); var max = round(-step, COORD_PRECISION); var minDiff, midDiff, maxDiff, mid, oldDiff; var staleFlag = 0; var i = 0; while (i++ < 100) { staleFlag = (oldDiff === maxDiff) ? (staleFlag + 1) : 0; if (staleFlag > 5) { break; } if (min !== mid) { minDiff = this$1.getPlotBox(min, bbox, arc); if (0 <= minDiff && minDiff <= 2) { break; } } if (max !== mid) { maxDiff = this$1.getPlotBox(max, bbox, arc); if (0 <= maxDiff && maxDiff <= 2) { break; } } if (minDiff > 0 && maxDiff > 0) { mid = min * 2; } else if (minDiff < 0 && maxDiff < 0) { mid = max * 2; } else { mid = round(((min + max) / 2) || 1, COORD_PRECISION); } midDiff = this$1.getPlotBox(mid, bbox, arc); if (0 <= midDiff && midDiff <= 2) { break; } oldDiff = maxDiff; if (midDiff > 0) { max = mid; maxDiff = midDiff; } else { min = mid; minDiff = midDiff; } } }; RadialGauge.prototype.getPlotBox = function getPlotBox (step, bbox, arc) { var this$1 = this; var scale = this.scale; var pointers = this.pointers; var radius = arc.getRadiusX(); var scaleArc = arc.clone(); scaleArc.setRadiusX(radius + step).setRadiusY(radius + step); scale.arc = scaleArc; scale.reflow(bbox); this.plotBbox = scale.bbox; for (var i = 0; i < pointers.length; i++) { pointers[i].reflow(scaleArc); this$1.plotBbox = geo.Rect.union(this$1.plotBbox, pointers[i].bbox); } return this.getDiff(this.plotBbox, bbox); }; RadialGauge.prototype.getDiff = function getDiff (plotBox, box) { return Math.min(box.width() - plotBox.width(), box.height() - plotBox.height()); }; RadialGauge.prototype.alignScale = function alignScale (bbox) { var this$1 = this; var plotBoxCenter = this.plotBbox.center(); var boxCenter = bbox.center(); var paddingX = plotBoxCenter.x - boxCenter.x; var paddingY = plotBoxCenter.y - boxCenter.y; var ref = this; var scale = ref.scale; var pointers = ref.pointers; scale.arc.center.x -= paddingX; scale.arc.center.y -= paddingY; scale.reflow(bbox); for (var i = 0; i < pointers.length; i++) { pointers[i].reflow(scale.arc); this$1.plotBbox = geo.Rect.union(scale.bbox, pointers[i].bbox); } }; RadialGauge.prototype._createModel = function _createModel () { var this$1 = this; var options = this.options; var pointers = options.pointer; var scale = this.scale = new RadialScale(options.scale, this.contextService); this.pointers = []; var pointersArr = isArray(pointers) ? pointers : [ pointers ]; for (var i = 0; i < pointersArr.length; i++) { var current = new RadialPointer(scale, deepExtend({}, pointersArr[i], { animation: { transitions: options.transitions } })); this$1.pointers.push(current); } }; return RadialGauge; }(Gauge)); setDefaultOptions(RadialGauge, { transitions: true, gaugeArea: { background: "" } }); export default RadialGauge;