ThemeRiverView.js 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. var echarts = require("../../echarts");
  2. var _poly = require("../line/poly");
  3. var Polygon = _poly.Polygon;
  4. var graphic = require("../../util/graphic");
  5. var _util = require("zrender/lib/core/util");
  6. var bind = _util.bind;
  7. var extend = _util.extend;
  8. var DataDiffer = require("../../data/DataDiffer");
  9. /**
  10. * @file The file used to draw themeRiver view
  11. * @author Deqing Li(annong035@gmail.com)
  12. */
  13. var _default = echarts.extendChartView({
  14. type: 'themeRiver',
  15. init: function () {
  16. this._layers = [];
  17. },
  18. render: function (seriesModel, ecModel, api) {
  19. var data = seriesModel.getData();
  20. var group = this.group;
  21. var layerSeries = seriesModel.getLayerSeries();
  22. var layoutInfo = data.getLayout('layoutInfo');
  23. var rect = layoutInfo.rect;
  24. var boundaryGap = layoutInfo.boundaryGap;
  25. group.attr('position', [0, rect.y + boundaryGap[0]]);
  26. function keyGetter(item) {
  27. return item.name;
  28. }
  29. var dataDiffer = new DataDiffer(this._layersSeries || [], layerSeries, keyGetter, keyGetter);
  30. var newLayersGroups = {};
  31. dataDiffer.add(bind(process, this, 'add')).update(bind(process, this, 'update')).remove(bind(process, this, 'remove')).execute();
  32. function process(status, idx, oldIdx) {
  33. var oldLayersGroups = this._layers;
  34. if (status === 'remove') {
  35. group.remove(oldLayersGroups[idx]);
  36. return;
  37. }
  38. var points0 = [];
  39. var points1 = [];
  40. var color;
  41. var indices = layerSeries[idx].indices;
  42. for (var j = 0; j < indices.length; j++) {
  43. var layout = data.getItemLayout(indices[j]);
  44. var x = layout.x;
  45. var y0 = layout.y0;
  46. var y = layout.y;
  47. points0.push([x, y0]);
  48. points1.push([x, y0 + y]);
  49. color = data.getItemVisual(indices[j], 'color');
  50. }
  51. var polygon;
  52. var text;
  53. var textLayout = data.getItemLayout(indices[0]);
  54. var itemModel = data.getItemModel(indices[j - 1]);
  55. var labelModel = itemModel.getModel('label.normal');
  56. var margin = labelModel.get('margin');
  57. if (status === 'add') {
  58. var layerGroup = newLayersGroups[idx] = new graphic.Group();
  59. polygon = new Polygon({
  60. shape: {
  61. points: points0,
  62. stackedOnPoints: points1,
  63. smooth: 0.4,
  64. stackedOnSmooth: 0.4,
  65. smoothConstraint: false
  66. },
  67. z2: 0
  68. });
  69. text = new graphic.Text({
  70. style: {
  71. x: textLayout.x - margin,
  72. y: textLayout.y0 + textLayout.y / 2
  73. }
  74. });
  75. layerGroup.add(polygon);
  76. layerGroup.add(text);
  77. group.add(layerGroup);
  78. polygon.setClipPath(createGridClipShape(polygon.getBoundingRect(), seriesModel, function () {
  79. polygon.removeClipPath();
  80. }));
  81. } else {
  82. var layerGroup = oldLayersGroups[oldIdx];
  83. polygon = layerGroup.childAt(0);
  84. text = layerGroup.childAt(1);
  85. group.add(layerGroup);
  86. newLayersGroups[idx] = layerGroup;
  87. graphic.updateProps(polygon, {
  88. shape: {
  89. points: points0,
  90. stackedOnPoints: points1
  91. }
  92. }, seriesModel);
  93. graphic.updateProps(text, {
  94. style: {
  95. x: textLayout.x - margin,
  96. y: textLayout.y0 + textLayout.y / 2
  97. }
  98. }, seriesModel);
  99. }
  100. var hoverItemStyleModel = itemModel.getModel('itemStyle.emphasis');
  101. var itemStyleModel = itemModel.getModel('itemStyle.normal');
  102. graphic.setTextStyle(text.style, labelModel, {
  103. text: labelModel.get('show') ? seriesModel.getFormattedLabel(indices[j - 1], 'normal') || data.getName(indices[j - 1]) : null,
  104. textVerticalAlign: 'middle'
  105. });
  106. polygon.setStyle(extend({
  107. fill: color
  108. }, itemStyleModel.getItemStyle(['color'])));
  109. graphic.setHoverStyle(polygon, hoverItemStyleModel.getItemStyle());
  110. }
  111. this._layersSeries = layerSeries;
  112. this._layers = newLayersGroups;
  113. },
  114. dispose: function () {}
  115. }); // add animation to the view
  116. function createGridClipShape(rect, seriesModel, cb) {
  117. var rectEl = new graphic.Rect({
  118. shape: {
  119. x: rect.x - 10,
  120. y: rect.y - 10,
  121. width: 0,
  122. height: rect.height + 20
  123. }
  124. });
  125. graphic.initProps(rectEl, {
  126. shape: {
  127. width: rect.width + 20,
  128. height: rect.height + 20
  129. }
  130. }, seriesModel, cb);
  131. return rectEl;
  132. }
  133. module.exports = _default;