echarts 3.5.4 → 3.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (190) hide show
  1. package/LICENSE +21 -18
  2. package/dist/echarts.common.js +10072 -9330
  3. package/dist/echarts.common.min.js +13 -13
  4. package/dist/echarts.js +13084 -11412
  5. package/dist/echarts.min.js +22 -21
  6. package/dist/echarts.simple.js +9454 -8889
  7. package/dist/echarts.simple.min.js +9 -10
  8. package/index.js +1 -0
  9. package/lib/chart/bar/BarView.js +141 -49
  10. package/lib/chart/bar/BaseBarSeries.js +2 -6
  11. package/lib/chart/bar.js +1 -0
  12. package/lib/chart/boxplot/BoxplotSeries.js +1 -1
  13. package/lib/chart/boxplot/boxplotLayout.js +23 -7
  14. package/lib/chart/candlestick/CandlestickSeries.js +1 -21
  15. package/lib/chart/candlestick/candlestickLayout.js +23 -7
  16. package/lib/chart/custom.js +442 -0
  17. package/lib/chart/graph/categoryVisual.js +3 -2
  18. package/lib/chart/heatmap/HeatmapView.js +75 -73
  19. package/lib/chart/helper/Symbol.js +8 -31
  20. package/lib/chart/helper/createListFromArray.js +15 -10
  21. package/lib/chart/helper/labelHelper.js +48 -0
  22. package/lib/chart/helper/whiskerBoxCommon.js +25 -44
  23. package/lib/chart/map/mapDataStatistic.js +9 -8
  24. package/lib/chart/pie/pieLayout.js +25 -17
  25. package/lib/chart/radar/RadarSeries.js +1 -1
  26. package/lib/chart/scatter/ScatterSeries.js +2 -3
  27. package/lib/chart/themeRiver/ThemeRiverSeries.js +6 -5
  28. package/lib/chart/themeRiver/themeRiverVisual.js +1 -1
  29. package/lib/chart/treemap/TreemapSeries.js +3 -3
  30. package/lib/component/axisPointer/BaseAxisPointer.js +7 -6
  31. package/lib/component/axisPointer/axisTrigger.js +62 -51
  32. package/lib/component/axisPointer.js +1 -2
  33. package/lib/component/calendar/CalendarView.js +5 -5
  34. package/lib/component/dataZoom/AxisProxy.js +76 -13
  35. package/lib/component/dataZoom/DataZoomModel.js +21 -5
  36. package/lib/component/dataZoom/InsideZoomModel.js +4 -1
  37. package/lib/component/dataZoom/InsideZoomView.js +16 -26
  38. package/lib/component/dataZoom/SliderZoomView.js +63 -26
  39. package/lib/component/dataZoom/roams.js +8 -3
  40. package/lib/component/graphic.js +13 -12
  41. package/lib/component/helper/BrushTargetManager.js +5 -5
  42. package/lib/component/helper/MapDraw.js +3 -3
  43. package/lib/component/helper/RoamController.js +43 -20
  44. package/lib/component/helper/brushHelper.js +2 -13
  45. package/lib/component/helper/selectableMixin.js +7 -7
  46. package/lib/component/helper/sliderMove.js +65 -36
  47. package/lib/component/legend/LegendView.js +6 -6
  48. package/lib/component/legend/legendAction.js +1 -1
  49. package/lib/component/marker/MarkAreaView.js +3 -6
  50. package/lib/component/marker/MarkLineView.js +3 -5
  51. package/lib/component/marker/MarkPointView.js +3 -5
  52. package/lib/component/marker/MarkerView.js +10 -12
  53. package/lib/component/polar.js +5 -0
  54. package/lib/component/timeline/SliderTimelineView.js +1 -1
  55. package/lib/component/toolbox/feature/DataZoom.js +14 -1
  56. package/lib/component/tooltip/TooltipView.js +3 -3
  57. package/lib/component/visualMap/ContinuousView.js +6 -4
  58. package/lib/coord/Axis.js +34 -2
  59. package/lib/coord/axisDefault.js +2 -1
  60. package/lib/coord/axisHelper.js +6 -25
  61. package/lib/coord/axisModelCommonMixin.js +1 -1
  62. package/lib/coord/calendar/Calendar.js +14 -17
  63. package/lib/coord/calendar/prepareCustom.js +31 -0
  64. package/lib/coord/cartesian/Axis2D.js +0 -12
  65. package/lib/coord/cartesian/Cartesian2D.js +1 -0
  66. package/lib/coord/cartesian/Grid.js +5 -2
  67. package/lib/coord/cartesian/prepareCustom.js +36 -0
  68. package/lib/coord/geo/Geo.js +9 -14
  69. package/lib/coord/geo/GeoModel.js +5 -5
  70. package/lib/coord/geo/geoCreator.js +3 -3
  71. package/lib/coord/geo/prepareCustom.js +36 -0
  72. package/lib/coord/parallel/Parallel.js +12 -11
  73. package/lib/coord/polar/Polar.js +2 -1
  74. package/lib/coord/polar/prepareCustom.js +53 -0
  75. package/lib/coord/single/Single.js +9 -8
  76. package/lib/coord/single/SingleAxis.js +0 -27
  77. package/lib/coord/single/prepareCustom.js +33 -0
  78. package/lib/data/DataDiffer.js +2 -1
  79. package/lib/data/Graph.js +11 -7
  80. package/lib/data/List.js +58 -19
  81. package/lib/data/helper/completeDimensions.js +184 -23
  82. package/lib/echarts.js +38 -33
  83. package/lib/helper.js +1 -8
  84. package/lib/layout/barGrid.js +87 -18
  85. package/lib/layout/barPolar.js +286 -0
  86. package/lib/layout/points.js +22 -16
  87. package/lib/model/Global.js +34 -31
  88. package/lib/model/Series.js +41 -29
  89. package/lib/model/mixin/colorPalette.js +2 -1
  90. package/lib/model/mixin/textStyle.js +7 -13
  91. package/lib/scale/Interval.js +21 -14
  92. package/lib/scale/Log.js +5 -7
  93. package/lib/scale/Time.js +13 -7
  94. package/lib/scale/helper.js +5 -1
  95. package/lib/util/format.js +12 -0
  96. package/lib/util/graphic.js +53 -1
  97. package/lib/util/model.js +63 -7
  98. package/map/js/world.js +1 -1
  99. package/map/json/world.json +1 -1
  100. package/package.json +3 -3
  101. package/src/chart/bar/BarView.js +141 -49
  102. package/src/chart/bar/BaseBarSeries.js +2 -6
  103. package/src/chart/bar.js +1 -0
  104. package/src/chart/boxplot/BoxplotSeries.js +1 -1
  105. package/src/chart/boxplot/boxplotLayout.js +23 -7
  106. package/src/chart/candlestick/CandlestickSeries.js +1 -21
  107. package/src/chart/candlestick/candlestickLayout.js +23 -7
  108. package/src/chart/custom.js +442 -0
  109. package/src/chart/graph/categoryVisual.js +3 -2
  110. package/src/chart/heatmap/HeatmapView.js +75 -73
  111. package/src/chart/helper/Symbol.js +8 -31
  112. package/src/chart/helper/createListFromArray.js +15 -10
  113. package/src/chart/helper/labelHelper.js +49 -0
  114. package/src/chart/helper/whiskerBoxCommon.js +25 -44
  115. package/src/chart/map/mapDataStatistic.js +9 -8
  116. package/src/chart/pie/pieLayout.js +25 -17
  117. package/src/chart/radar/RadarSeries.js +1 -1
  118. package/src/chart/scatter/ScatterSeries.js +2 -3
  119. package/src/chart/themeRiver/ThemeRiverSeries.js +6 -5
  120. package/src/chart/themeRiver/themeRiverVisual.js +1 -1
  121. package/src/chart/treemap/TreemapSeries.js +3 -3
  122. package/src/component/axisPointer/BaseAxisPointer.js +7 -6
  123. package/src/component/axisPointer/axisTrigger.js +62 -51
  124. package/src/component/axisPointer.js +1 -2
  125. package/src/component/calendar/CalendarView.js +5 -5
  126. package/src/component/dataZoom/AxisProxy.js +76 -13
  127. package/src/component/dataZoom/DataZoomModel.js +21 -5
  128. package/src/component/dataZoom/InsideZoomModel.js +4 -1
  129. package/src/component/dataZoom/InsideZoomView.js +16 -26
  130. package/src/component/dataZoom/SliderZoomView.js +63 -26
  131. package/src/component/dataZoom/roams.js +8 -3
  132. package/src/component/graphic.js +13 -12
  133. package/src/component/helper/BrushTargetManager.js +5 -5
  134. package/src/component/helper/MapDraw.js +3 -3
  135. package/src/component/helper/RoamController.js +43 -20
  136. package/src/component/helper/brushHelper.js +2 -13
  137. package/src/component/helper/selectableMixin.js +7 -7
  138. package/src/component/helper/sliderMove.js +65 -36
  139. package/src/component/legend/LegendView.js +6 -6
  140. package/src/component/legend/legendAction.js +1 -1
  141. package/src/component/marker/MarkAreaView.js +3 -6
  142. package/src/component/marker/MarkLineView.js +3 -5
  143. package/src/component/marker/MarkPointView.js +3 -5
  144. package/src/component/marker/MarkerView.js +10 -12
  145. package/src/component/polar.js +5 -0
  146. package/src/component/timeline/SliderTimelineView.js +1 -1
  147. package/src/component/toolbox/feature/DataZoom.js +14 -1
  148. package/src/component/tooltip/TooltipView.js +3 -3
  149. package/src/component/visualMap/ContinuousView.js +6 -4
  150. package/src/coord/Axis.js +34 -2
  151. package/src/coord/axisDefault.js +2 -1
  152. package/src/coord/axisHelper.js +6 -25
  153. package/src/coord/axisModelCommonMixin.js +1 -1
  154. package/src/coord/calendar/Calendar.js +14 -17
  155. package/src/coord/calendar/prepareCustom.js +32 -0
  156. package/src/coord/cartesian/Axis2D.js +0 -12
  157. package/src/coord/cartesian/Cartesian2D.js +1 -0
  158. package/src/coord/cartesian/Grid.js +5 -2
  159. package/src/coord/cartesian/prepareCustom.js +37 -0
  160. package/src/coord/geo/Geo.js +9 -14
  161. package/src/coord/geo/GeoModel.js +5 -5
  162. package/src/coord/geo/geoCreator.js +3 -3
  163. package/src/coord/geo/prepareCustom.js +37 -0
  164. package/src/coord/parallel/Parallel.js +12 -11
  165. package/src/coord/polar/Polar.js +2 -1
  166. package/src/coord/polar/prepareCustom.js +54 -0
  167. package/src/coord/single/Single.js +9 -8
  168. package/src/coord/single/SingleAxis.js +0 -27
  169. package/src/coord/single/prepareCustom.js +34 -0
  170. package/src/data/DataDiffer.js +2 -1
  171. package/src/data/Graph.js +11 -7
  172. package/src/data/List.js +58 -19
  173. package/src/data/helper/completeDimensions.js +184 -23
  174. package/src/echarts.js +38 -33
  175. package/src/helper.js +1 -8
  176. package/src/layout/barGrid.js +87 -18
  177. package/src/layout/barPolar.js +287 -0
  178. package/src/layout/points.js +22 -16
  179. package/src/model/Global.js +34 -31
  180. package/src/model/Series.js +41 -29
  181. package/src/model/mixin/colorPalette.js +2 -1
  182. package/src/model/mixin/textStyle.js +7 -13
  183. package/src/scale/Interval.js +21 -14
  184. package/src/scale/Log.js +5 -7
  185. package/src/scale/Time.js +13 -7
  186. package/src/scale/helper.js +5 -1
  187. package/src/util/format.js +12 -0
  188. package/src/util/graphic.js +53 -1
  189. package/src/util/model.js +63 -7
  190. package/src/coord/cartesian/axisLabelInterval.js +0 -26
@@ -248,11 +248,12 @@ define(function (require) {
248
248
  return [0, this._size[0]];
249
249
  },
250
250
 
251
- _renderBackground : function () {
251
+ _renderBackground: function () {
252
252
  var dataZoomModel = this.dataZoomModel;
253
253
  var size = this._size;
254
+ var barGroup = this._displayables.barGroup;
254
255
 
255
- this._displayables.barGroup.add(new Rect({
256
+ barGroup.add(new Rect({
256
257
  silent: true,
257
258
  shape: {
258
259
  x: 0, y: 0, width: size[0], height: size[1]
@@ -262,6 +263,18 @@ define(function (require) {
262
263
  },
263
264
  z2: -40
264
265
  }));
266
+
267
+ // Click panel, over shadow, below handles.
268
+ barGroup.add(new Rect({
269
+ shape: {
270
+ x: 0, y: 0, width: size[0], height: size[1]
271
+ },
272
+ style: {
273
+ fill: 'transparent'
274
+ },
275
+ z2: 0,
276
+ onclick: zrUtil.bind(this._onClickPanelClick, this)
277
+ }));
265
278
  },
266
279
 
267
280
  _renderDataShadow: function () {
@@ -450,7 +463,7 @@ define(function (require) {
450
463
 
451
464
  var iconStr = dataZoomModel.get('handleIcon');
452
465
  each([0, 1], function (handleIndex) {
453
- var path = graphic.makePath(iconStr, {
466
+ var iconOpt = {
454
467
  style: {
455
468
  strokeNoScale: true
456
469
  },
@@ -465,12 +478,21 @@ define(function (require) {
465
478
  ondragend: bind(this._onDragEnd, this),
466
479
  onmouseover: bind(this._showDataInfo, this, true),
467
480
  onmouseout: bind(this._showDataInfo, this, false)
468
- }, {
469
- x: -0.5,
470
- y: 0,
471
- width: 1,
472
- height: 1
473
- }, 'center');
481
+ };
482
+ var iconStyle = {x: -1, y: 0, width: 2, height: 2};
483
+
484
+ var path = iconStr.indexOf('image://') === 0
485
+ ? (
486
+ iconStyle.image = iconStr.slice(8),
487
+ iconOpt.style = iconStyle,
488
+ new graphic.Image(iconOpt)
489
+ )
490
+ : graphic.makePath(
491
+ iconStr.replace('path://', ''),
492
+ iconOpt,
493
+ iconStyle,
494
+ 'center'
495
+ );
474
496
 
475
497
  var bRect = path.getBoundingRect();
476
498
  this._handleHeight = numberUtil.parsePercent(dataZoomModel.get('handleSize'), this._size[1]);
@@ -520,25 +542,29 @@ define(function (require) {
520
542
  /**
521
543
  * @private
522
544
  * @param {(number|string)} handleIndex 0 or 1 or 'all'
523
- * @param {number} dx
524
- * @param {number} dy
545
+ * @param {number} delta
525
546
  */
526
547
  _updateInterval: function (handleIndex, delta) {
548
+ var dataZoomModel = this.dataZoomModel;
527
549
  var handleEnds = this._handleEnds;
528
550
  var viewExtend = this._getViewExtent();
551
+ var minMaxSpan = dataZoomModel.findRepresentativeAxisProxy().getMinMaxSpan();
552
+ var percentExtent = [0, 100];
529
553
 
530
554
  sliderMove(
531
555
  delta,
532
556
  handleEnds,
533
557
  viewExtend,
534
- (handleIndex === 'all' || this.dataZoomModel.get('zoomLock'))
535
- ? 'rigid' : 'cross',
536
- handleIndex
558
+ dataZoomModel.get('zoomLock') ? 'all' : handleIndex,
559
+ minMaxSpan.minSpan != null
560
+ ? linearMap(minMaxSpan.minSpan, percentExtent, viewExtend, true) : null,
561
+ minMaxSpan.maxSpan != null
562
+ ? linearMap(minMaxSpan.maxSpan, percentExtent, viewExtend, true) : null
537
563
  );
538
564
 
539
565
  this._range = asc([
540
- linearMap(handleEnds[0], viewExtend, [0, 100], true),
541
- linearMap(handleEnds[1], viewExtend, [0, 100], true)
566
+ linearMap(handleEnds[0], viewExtend, percentExtent, true),
567
+ linearMap(handleEnds[1], viewExtend, percentExtent, true)
542
568
  ]);
543
569
  },
544
570
 
@@ -556,7 +582,7 @@ define(function (require) {
556
582
  var handle = displaybles.handles[handleIndex];
557
583
  var handleHeight = this._handleHeight;
558
584
  handle.attr({
559
- scale: [handleHeight, handleHeight],
585
+ scale: [handleHeight / 2, handleHeight / 2],
560
586
  position: [handleEnds[handleIndex], size[1] / 2 - handleHeight / 2]
561
587
  });
562
588
  }, this);
@@ -682,7 +708,8 @@ define(function (require) {
682
708
  this._dragging = true;
683
709
 
684
710
  // Transform dx, dy to bar coordination.
685
- var vertex = this._applyBarTransform([dx, dy], true);
711
+ var barTransform = this._displayables.barGroup.getLocalTransform();
712
+ var vertex = graphic.applyTransform([dx, dy], barTransform, true);
686
713
 
687
714
  this._updateInterval(handleIndex, vertex[0]);
688
715
 
@@ -701,6 +728,24 @@ define(function (require) {
701
728
  this._dispatchZoomAction();
702
729
  },
703
730
 
731
+ _onClickPanelClick: function (e) {
732
+ var size = this._size;
733
+ var localPoint = this._displayables.barGroup.transformCoordToLocal(e.offsetX, e.offsetY);
734
+
735
+ if (localPoint[0] < 0 || localPoint[0] > size[0]
736
+ || localPoint[1] < 0 || localPoint[1] > size[1]
737
+ ) {
738
+ return;
739
+ }
740
+
741
+ var handleEnds = this._handleEnds;
742
+ var center = (handleEnds[0] + handleEnds[1]) / 2;
743
+
744
+ this._updateInterval('all', localPoint[0] - center);
745
+ this._updateView();
746
+ this._dispatchZoomAction();
747
+ },
748
+
704
749
  /**
705
750
  * This action will be throttled.
706
751
  * @private
@@ -717,14 +762,6 @@ define(function (require) {
717
762
  });
718
763
  },
719
764
 
720
- /**
721
- * @private
722
- */
723
- _applyBarTransform: function (vertex, inverse) {
724
- var barTransform = this._displayables.barGroup.getLocalTransform();
725
- return graphic.applyTransform(vertex, barTransform, inverse);
726
- },
727
-
728
765
  /**
729
766
  * @private
730
767
  */
@@ -29,6 +29,8 @@ define(function(require) {
29
29
  * @param {number} dataZoomInfo.throttleRate
30
30
  * @param {Function} dataZoomInfo.panGetRange
31
31
  * @param {Function} dataZoomInfo.zoomGetRange
32
+ * @param {boolean} [dataZoomInfo.zoomLock]
33
+ * @param {boolean} [dataZoomInfo.disabled]
32
34
  */
33
35
  register: function (api, dataZoomInfo) {
34
36
  var store = giveStore(api);
@@ -57,9 +59,13 @@ define(function(require) {
57
59
  dataZoomInfos: {},
58
60
  count: 0
59
61
  };
60
- record.controller = createController(api, dataZoomInfo, record);
62
+ record.controller = createController(api, record);
61
63
  record.dispatchAction = zrUtil.curry(dispatchAction, api);
62
64
  }
65
+ record.controller.enable(
66
+ dataZoomInfo.disabled ? false : dataZoomInfo.zoomLock ? 'move' : true,
67
+ dataZoomInfo.roamControllerOpt
68
+ );
63
69
 
64
70
  // Consider resize, area should be always updated.
65
71
  record.controller.setPointerChecker(dataZoomInfo.containsPoint);
@@ -130,9 +136,8 @@ define(function(require) {
130
136
  return zr[ATTR] || (zr[ATTR] = {});
131
137
  }
132
138
 
133
- function createController(api, dataZoomInfo, newRecord) {
139
+ function createController(api, newRecord) {
134
140
  var controller = new RoamController(api.getZr());
135
- controller.enable();
136
141
  controller.on('pan', curry(onPan, newRecord));
137
142
  controller.on('zoom', curry(onZoom, newRecord));
138
143
 
@@ -214,9 +214,9 @@ define(function (require) {
214
214
 
215
215
  /**
216
216
  * @private
217
- * @type {Object}
217
+ * @type {module:zrender/core/util.HashMap}
218
218
  */
219
- this._elMap = {};
219
+ this._elMap = zrUtil.createHashMap();
220
220
 
221
221
  /**
222
222
  * @private
@@ -270,9 +270,9 @@ define(function (require) {
270
270
  zrUtil.each(elOptionsToUpdate, function (elOption) {
271
271
  var $action = elOption.$action;
272
272
  var id = elOption.id;
273
- var existEl = elMap[id];
273
+ var existEl = elMap.get(id);
274
274
  var parentId = elOption.parentId;
275
- var targetElParent = parentId != null ? elMap[parentId] : rootGroup;
275
+ var targetElParent = parentId != null ? elMap.get(parentId) : rootGroup;
276
276
 
277
277
  // In top/bottom mode, textVertical should not be used. And textBaseline
278
278
  // should not be 'alphabetic', which cause inaccurately locating.
@@ -305,9 +305,10 @@ define(function (require) {
305
305
  removeEl(existEl, elMap);
306
306
  }
307
307
 
308
- if (elMap[id]) {
309
- elMap[id].__ecGraphicWidth = elOption.width;
310
- elMap[id].__ecGraphicHeight = elOption.height;
308
+ var el = elMap.get(id);
309
+ if (el) {
310
+ el.__ecGraphicWidth = elOption.width;
311
+ el.__ecGraphicHeight = elOption.height;
311
312
  }
312
313
  });
313
314
  },
@@ -327,7 +328,7 @@ define(function (require) {
327
328
  // Bottom-up tranvese all elements (consider ec resize) to locate elements.
328
329
  for (var i = elOptions.length - 1; i >= 0; i--) {
329
330
  var elOption = elOptions[i];
330
- var el = elMap[elOption.id];
331
+ var el = elMap.get(elOption.id);
331
332
 
332
333
  if (!el) {
333
334
  continue;
@@ -358,10 +359,10 @@ define(function (require) {
358
359
  */
359
360
  _clear: function () {
360
361
  var elMap = this._elMap;
361
- zrUtil.each(elMap, function (el) {
362
+ elMap.each(function (el) {
362
363
  removeEl(el, elMap);
363
364
  });
364
- this._elMap = {};
365
+ this._elMap = zrUtil.createHashMap();
365
366
  },
366
367
 
367
368
  /**
@@ -387,7 +388,7 @@ define(function (require) {
387
388
 
388
389
  var el = new Clz(elOption);
389
390
  targetElParent.add(el);
390
- elMap[id] = el;
391
+ elMap.set(id, el);
391
392
  el.__ecGraphicId = id;
392
393
  }
393
394
 
@@ -397,7 +398,7 @@ define(function (require) {
397
398
  existEl.type === 'group' && existEl.traverse(function (el) {
398
399
  removeEl(el, elMap);
399
400
  });
400
- delete elMap[existEl.__ecGraphicId];
401
+ elMap.removeKey(existEl.__ecGraphicId);
401
402
  existElParent.remove(existEl);
402
403
  }
403
404
  }
@@ -244,7 +244,7 @@ define(function(require) {
244
244
  var yAxisModels = foundCpts.yAxisModels;
245
245
  var gridModels = foundCpts.gridModels;
246
246
  // Remove duplicated.
247
- var gridModelMap = {};
247
+ var gridModelMap = zrUtil.createHashMap();
248
248
  var xAxesHas = {};
249
249
  var yAxesHas = {};
250
250
 
@@ -254,21 +254,21 @@ define(function(require) {
254
254
 
255
255
  each(xAxisModels, function (axisModel) {
256
256
  var gridModel = axisModel.axis.grid.model;
257
- gridModelMap[gridModel.id] = gridModel;
257
+ gridModelMap.set(gridModel.id, gridModel);
258
258
  xAxesHas[gridModel.id] = true;
259
259
  });
260
260
  each(yAxisModels, function (axisModel) {
261
261
  var gridModel = axisModel.axis.grid.model;
262
- gridModelMap[gridModel.id] = gridModel;
262
+ gridModelMap.set(gridModel.id, gridModel);
263
263
  yAxesHas[gridModel.id] = true;
264
264
  });
265
265
  each(gridModels, function (gridModel) {
266
- gridModelMap[gridModel.id] = gridModel;
266
+ gridModelMap.set(gridModel.id, gridModel);
267
267
  xAxesHas[gridModel.id] = true;
268
268
  yAxesHas[gridModel.id] = true;
269
269
  });
270
270
 
271
- each(gridModelMap, function (gridModel) {
271
+ gridModelMap.each(function (gridModel) {
272
272
  var grid = gridModel.coordinateSystem;
273
273
  var cartesians = [];
274
274
 
@@ -156,7 +156,7 @@ define(function (require) {
156
156
  var hoverItemStyleAccessPath = ['itemStyle', 'emphasis'];
157
157
  var labelAccessPath = ['label', 'normal'];
158
158
  var hoverLabelAccessPath = ['label', 'emphasis'];
159
- var nameMap = {};
159
+ var nameMap = zrUtil.createHashMap();
160
160
 
161
161
  zrUtil.each(geo.regions, function (region) {
162
162
 
@@ -165,8 +165,8 @@ define(function (require) {
165
165
  // colonies). And it is not appropriate to merge them in geo, which
166
166
  // will make them share the same label and bring trouble in label
167
167
  // location calculation.
168
- var regionGroup = nameMap[region.name]
169
- || (nameMap[region.name] = new graphic.Group());
168
+ var regionGroup = nameMap.get(region.name)
169
+ || nameMap.set(region.name, new graphic.Group());
170
170
 
171
171
  var compoundPath = new graphic.CompoundPath({
172
172
  shape: {
@@ -27,6 +27,11 @@ define(function (require) {
27
27
  */
28
28
  this._zr = zr;
29
29
 
30
+ /**
31
+ * @type {Object}
32
+ */
33
+ this._opt = {};
34
+
30
35
  // Avoid two roamController bind the same handler
31
36
  var bind = zrUtil.bind;
32
37
  var mousedownHandler = bind(mousedown, this);
@@ -54,11 +59,22 @@ define(function (require) {
54
59
  * @param {boolean|string} [controlType=true] Specify the control type,
55
60
  * which can be null/undefined or true/false
56
61
  * or 'pan/move' or 'zoom'/'scale'
62
+ * @param {Object} [opt]
63
+ * @param {Object} [opt.zoomOnMouseWheel=true]
64
+ * @param {Object} [opt.moveOnMouseMove=true]
65
+ * @param {Object} [opt.preventDefaultMouseMove=true] When pan.
57
66
  */
58
- this.enable = function (controlType) {
67
+ this.enable = function (controlType, opt) {
68
+
59
69
  // Disable previous first
60
70
  this.disable();
61
71
 
72
+ this._opt = zrUtil.defaults(zrUtil.clone(opt) || {}, {
73
+ zoomOnMouseWheel: true,
74
+ moveOnMouseMove: true,
75
+ preventDefaultMouseMove: true
76
+ });
77
+
62
78
  if (controlType == null) {
63
79
  controlType = true;
64
80
  }
@@ -114,33 +130,33 @@ define(function (require) {
114
130
  }
115
131
 
116
132
  function mousemove(e) {
117
- if (!this._dragging) {
133
+ if (!checkKeyBinding(this, 'moveOnMouseMove', e) || !this._dragging) {
118
134
  return;
119
135
  }
120
136
 
121
- eventTool.stop(e.event);
137
+ if (e.gestureEvent === 'pinch') {
138
+ return;
139
+ }
122
140
 
123
- if (e.gestureEvent !== 'pinch') {
141
+ if (interactionMutex.isTaken(this._zr, 'globalPan')) {
142
+ return;
143
+ }
124
144
 
125
- if (interactionMutex.isTaken(this._zr, 'globalPan')) {
126
- return;
127
- }
145
+ var x = e.offsetX;
146
+ var y = e.offsetY;
128
147
 
129
- var x = e.offsetX;
130
- var y = e.offsetY;
148
+ var oldX = this._x;
149
+ var oldY = this._y;
131
150
 
132
- var oldX = this._x;
133
- var oldY = this._y;
151
+ var dx = x - oldX;
152
+ var dy = y - oldY;
134
153
 
135
- var dx = x - oldX;
136
- var dy = y - oldY;
154
+ this._x = x;
155
+ this._y = y;
137
156
 
138
- this._x = x;
139
- this._y = y;
157
+ this._opt.preventDefaultMouseMove && eventTool.stop(e.event);
140
158
 
141
- eventTool.stop(e.event);
142
- this.trigger('pan', dx, dy, oldX, oldY, x, y);
143
- }
159
+ this.trigger('pan', dx, dy, oldX, oldY, x, y);
144
160
  }
145
161
 
146
162
  function mouseup(e) {
@@ -149,9 +165,10 @@ define(function (require) {
149
165
 
150
166
  function mousewheel(e) {
151
167
  // wheelDelta maybe -0 in chrome mac.
152
- if (e.wheelDelta === 0) {
168
+ if (!checkKeyBinding(this, 'zoomOnMouseWheel', e) || e.wheelDelta === 0) {
153
169
  return;
154
170
  }
171
+
155
172
  // Convenience:
156
173
  // Mac and VM Windows on Mac: scroll up: zoom out.
157
174
  // Windows: scroll up: zoom in.
@@ -170,7 +187,7 @@ define(function (require) {
170
187
  function zoom(e, zoomDelta, zoomX, zoomY) {
171
188
  if (this.pointerChecker && this.pointerChecker(e, zoomX, zoomY)) {
172
189
  // When mouse is out of roamController rect,
173
- // default befavoius should be be disabled, otherwise
190
+ // default befavoius should not be be disabled, otherwise
174
191
  // page sliding is disabled, contrary to expectation.
175
192
  eventTool.stop(e.event);
176
193
 
@@ -178,5 +195,11 @@ define(function (require) {
178
195
  }
179
196
  }
180
197
 
198
+ function checkKeyBinding(roamController, prop, e) {
199
+ var setting = roamController._opt[prop];
200
+ return setting
201
+ && (!zrUtil.isString(setting) || e.event[setting + 'Key']);
202
+ }
203
+
181
204
  return RoamController;
182
205
  });
@@ -1,26 +1,15 @@
1
1
  define(function (require) {
2
2
 
3
- var zrUtil = require('zrender/core/util');
4
3
  var cursorHelper = require('./cursorHelper');
5
4
  var BoundingRect = require('zrender/core/BoundingRect');
6
-
7
- var mathMax = Math.max;
8
- var mathMin = Math.min;
5
+ var graphicUtil = require('../../util/graphic');
9
6
 
10
7
  var helper = {};
11
8
 
12
9
  helper.makeRectPanelClipPath = function (rect) {
13
10
  rect = normalizeRect(rect);
14
11
  return function (localPoints, transform) {
15
- return zrUtil.map(localPoints, function (localPoint) {
16
- var x = localPoint[0];
17
- x = mathMax(x, rect.x);
18
- x = mathMin(x, rect.x + rect.width);
19
- var y = localPoint[1];
20
- y = mathMax(y, rect.y);
21
- y = mathMin(y, rect.y + rect.height);
22
- return [x, y];
23
- });
12
+ return graphicUtil.clipPointsByRect(localPoints, rect);
24
13
  };
25
14
  };
26
15
 
@@ -13,9 +13,9 @@ define(function (require) {
13
13
 
14
14
  updateSelectedMap: function (targetList) {
15
15
  this._selectTargetMap = zrUtil.reduce(targetList || [], function (targetMap, target) {
16
- targetMap[target.name] = target;
16
+ targetMap.set(target.name, target);
17
17
  return targetMap;
18
- }, {});
18
+ }, zrUtil.createHashMap());
19
19
  },
20
20
  /**
21
21
  * @param {string} name
@@ -23,10 +23,10 @@ define(function (require) {
23
23
  // PENGING If selectedMode is null ?
24
24
  select: function (name) {
25
25
  var targetMap = this._selectTargetMap;
26
- var target = targetMap[name];
26
+ var target = targetMap.get(name);
27
27
  var selectedMode = this.get('selectedMode');
28
28
  if (selectedMode === 'single') {
29
- zrUtil.each(targetMap, function (target) {
29
+ targetMap.each(function (target) {
30
30
  target.selected = false;
31
31
  });
32
32
  }
@@ -37,7 +37,7 @@ define(function (require) {
37
37
  * @param {string} name
38
38
  */
39
39
  unSelect: function (name) {
40
- var target = this._selectTargetMap[name];
40
+ var target = this._selectTargetMap.get(name);
41
41
  // var selectedMode = this.get('selectedMode');
42
42
  // selectedMode !== 'single' && target && (target.selected = false);
43
43
  target && (target.selected = false);
@@ -47,7 +47,7 @@ define(function (require) {
47
47
  * @param {string} name
48
48
  */
49
49
  toggleSelected: function (name) {
50
- var target = this._selectTargetMap[name];
50
+ var target = this._selectTargetMap.get(name);
51
51
  if (target != null) {
52
52
  this[target.selected ? 'unSelect' : 'select'](name);
53
53
  return target.selected;
@@ -58,7 +58,7 @@ define(function (require) {
58
58
  * @param {string} name
59
59
  */
60
60
  isSelected: function (name) {
61
- var target = this._selectTargetMap[name];
61
+ var target = this._selectTargetMap.get(name);
62
62
  return target && target.selected;
63
63
  }
64
64
  };
@@ -2,53 +2,82 @@ define(function (require) {
2
2
 
3
3
  /**
4
4
  * Calculate slider move result.
5
+ * Usage:
6
+ * (1) If both handle0 and handle1 are needed to be moved, set minSpan the same as
7
+ * maxSpan and the same as `Math.abs(handleEnd[1] - handleEnds[0])`.
8
+ * (2) If handle0 is forbidden to cross handle1, set minSpan as `0`.
5
9
  *
6
10
  * @param {number} delta Move length.
7
- * @param {Array.<number>} handleEnds handleEnds[0] and be bigger then handleEnds[1].
8
- * handleEnds will be modified in this method.
11
+ * @param {Array.<number>} handleEnds handleEnds[0] can be bigger then handleEnds[1].
12
+ * handleEnds will be modified in this method.
9
13
  * @param {Array.<number>} extent handleEnds is restricted by extent.
10
- * extent[0] should less or equals than extent[1].
11
- * @param {string} mode 'rigid': Math.abs(handleEnds[0] - handleEnds[1]) remain unchanged,
12
- * 'cross' handleEnds[0] can be bigger then handleEnds[1],
13
- * 'push' handleEnds[0] can not be bigger then handleEnds[1],
14
- * when they touch, one push other.
15
- * @param {number} handleIndex If mode is 'rigid', handleIndex is not required.
14
+ * extent[0] should less or equals than extent[1].
15
+ * @param {number|string} handleIndex Can be 'all', means that both move the two handleEnds,
16
+ * where the input minSpan and maxSpan will not work.
17
+ * @param {number} [minSpan] The range of dataZoom can not be smaller than that.
18
+ * If not set, handle0 and cross handle1. If set as a non-negative
19
+ * number (including `0`), handles will push each other when reaching
20
+ * the minSpan.
21
+ * @param {number} [maxSpan] The range of dataZoom can not be larger than that.
16
22
  * @return {Array.<number>} The input handleEnds.
17
23
  */
18
- return function (delta, handleEnds, extent, mode, handleIndex) {
19
- if (!delta) {
20
- return handleEnds;
24
+ return function (delta, handleEnds, extent, handleIndex, minSpan, maxSpan) {
25
+ // Normalize firstly.
26
+ handleEnds[0] = restrict(handleEnds[0], extent);
27
+ handleEnds[1] = restrict(handleEnds[1], extent);
28
+
29
+ delta = delta || 0;
30
+
31
+ var extentSpan = extent[1] - extent[0];
32
+
33
+ // Notice maxSpan and minSpan can be null/undefined.
34
+ if (minSpan != null) {
35
+ minSpan = restrict(minSpan, [0, extentSpan]);
21
36
  }
37
+ if (maxSpan != null) {
38
+ maxSpan = Math.max(maxSpan, minSpan != null ? minSpan : 0);
39
+ }
40
+ if (handleIndex === 'all') {
41
+ minSpan = maxSpan = Math.abs(handleEnds[1] - handleEnds[0]);
42
+ handleIndex = 0;
43
+ }
44
+
45
+ var originalDistSign = getSpanSign(handleEnds, handleIndex);
22
46
 
23
- if (mode === 'rigid') {
24
- delta = getRealDelta(delta, handleEnds, extent);
25
- handleEnds[0] += delta;
26
- handleEnds[1] += delta;
47
+ handleEnds[handleIndex] += delta;
48
+
49
+ // Restrict in extent.
50
+ var extentMinSpan = minSpan || 0;
51
+ var realExtent = extent.slice();
52
+ originalDistSign.sign < 0 ? (realExtent[0] += extentMinSpan) : (realExtent[1] -= extentMinSpan);
53
+ handleEnds[handleIndex] = restrict(handleEnds[handleIndex], realExtent);
54
+
55
+ // Expand span.
56
+ var currDistSign = getSpanSign(handleEnds, handleIndex);
57
+ if (minSpan != null && (
58
+ currDistSign.sign !== originalDistSign.sign || currDistSign.span < minSpan
59
+ )) {
60
+ // If minSpan exists, 'cross' is forbinden.
61
+ handleEnds[1 - handleIndex] = handleEnds[handleIndex] + originalDistSign.sign * minSpan;
27
62
  }
28
- else {
29
- delta = getRealDelta(delta, handleEnds[handleIndex], extent);
30
- handleEnds[handleIndex] += delta;
31
63
 
32
- if (mode === 'push' && handleEnds[0] > handleEnds[1]) {
33
- handleEnds[1 - handleIndex] = handleEnds[handleIndex];
34
- }
64
+ // Shrink span.
65
+ var currDistSign = getSpanSign(handleEnds, handleIndex);
66
+ if (maxSpan != null && currDistSign.span > maxSpan) {
67
+ handleEnds[1 - handleIndex] = handleEnds[handleIndex] + currDistSign.sign * maxSpan;
35
68
  }
36
69
 
37
70
  return handleEnds;
38
-
39
- function getRealDelta(delta, handleEnds, extent) {
40
- var handleMinMax = !handleEnds.length
41
- ? [handleEnds, handleEnds]
42
- : handleEnds.slice();
43
- handleEnds[0] > handleEnds[1] && handleMinMax.reverse();
44
-
45
- if (delta < 0 && handleMinMax[0] + delta < extent[0]) {
46
- delta = extent[0] - handleMinMax[0];
47
- }
48
- if (delta > 0 && handleMinMax[1] + delta > extent[1]) {
49
- delta = extent[1] - handleMinMax[1];
50
- }
51
- return delta;
52
- }
53
71
  };
72
+
73
+ function getSpanSign(handleEnds, handleIndex) {
74
+ var dist = handleEnds[handleIndex] - handleEnds[1 - handleIndex];
75
+ // If `handleEnds[0] === handleEnds[1]`, always believe that handleEnd[0]
76
+ // is at left of handleEnds[1] for non-cross case.
77
+ return {span: Math.abs(dist), sign: dist > 0 ? -1 : dist < 0 ? 1 : handleIndex ? -1 : 1};
78
+ }
79
+
80
+ function restrict(value, extend) {
81
+ return Math.min(extend[1], Math.max(extend[0], value));
82
+ }
54
83
  });