FunnelView.js 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. var graphic = require("../../util/graphic");
  2. var zrUtil = require("zrender/lib/core/util");
  3. var ChartView = require("../../view/Chart");
  4. /**
  5. * Piece of pie including Sector, Label, LabelLine
  6. * @constructor
  7. * @extends {module:zrender/graphic/Group}
  8. */
  9. function FunnelPiece(data, idx) {
  10. graphic.Group.call(this);
  11. var polygon = new graphic.Polygon();
  12. var labelLine = new graphic.Polyline();
  13. var text = new graphic.Text();
  14. this.add(polygon);
  15. this.add(labelLine);
  16. this.add(text);
  17. this.updateData(data, idx, true); // Hover to change label and labelLine
  18. function onEmphasis() {
  19. labelLine.ignore = labelLine.hoverIgnore;
  20. text.ignore = text.hoverIgnore;
  21. }
  22. function onNormal() {
  23. labelLine.ignore = labelLine.normalIgnore;
  24. text.ignore = text.normalIgnore;
  25. }
  26. this.on('emphasis', onEmphasis).on('normal', onNormal).on('mouseover', onEmphasis).on('mouseout', onNormal);
  27. }
  28. var funnelPieceProto = FunnelPiece.prototype;
  29. var opacityAccessPath = ['itemStyle', 'normal', 'opacity'];
  30. funnelPieceProto.updateData = function (data, idx, firstCreate) {
  31. var polygon = this.childAt(0);
  32. var seriesModel = data.hostModel;
  33. var itemModel = data.getItemModel(idx);
  34. var layout = data.getItemLayout(idx);
  35. var opacity = data.getItemModel(idx).get(opacityAccessPath);
  36. opacity = opacity == null ? 1 : opacity; // Reset style
  37. polygon.useStyle({});
  38. if (firstCreate) {
  39. polygon.setShape({
  40. points: layout.points
  41. });
  42. polygon.setStyle({
  43. opacity: 0
  44. });
  45. graphic.initProps(polygon, {
  46. style: {
  47. opacity: opacity
  48. }
  49. }, seriesModel, idx);
  50. } else {
  51. graphic.updateProps(polygon, {
  52. style: {
  53. opacity: opacity
  54. },
  55. shape: {
  56. points: layout.points
  57. }
  58. }, seriesModel, idx);
  59. } // Update common style
  60. var itemStyleModel = itemModel.getModel('itemStyle');
  61. var visualColor = data.getItemVisual(idx, 'color');
  62. polygon.setStyle(zrUtil.defaults({
  63. lineJoin: 'round',
  64. fill: visualColor
  65. }, itemStyleModel.getModel('normal').getItemStyle(['opacity'])));
  66. polygon.hoverStyle = itemStyleModel.getModel('emphasis').getItemStyle();
  67. this._updateLabel(data, idx);
  68. graphic.setHoverStyle(this);
  69. };
  70. funnelPieceProto._updateLabel = function (data, idx) {
  71. var labelLine = this.childAt(1);
  72. var labelText = this.childAt(2);
  73. var seriesModel = data.hostModel;
  74. var itemModel = data.getItemModel(idx);
  75. var layout = data.getItemLayout(idx);
  76. var labelLayout = layout.label;
  77. var visualColor = data.getItemVisual(idx, 'color');
  78. graphic.updateProps(labelLine, {
  79. shape: {
  80. points: labelLayout.linePoints || labelLayout.linePoints
  81. }
  82. }, seriesModel, idx);
  83. graphic.updateProps(labelText, {
  84. style: {
  85. x: labelLayout.x,
  86. y: labelLayout.y
  87. }
  88. }, seriesModel, idx);
  89. labelText.attr({
  90. rotation: labelLayout.rotation,
  91. origin: [labelLayout.x, labelLayout.y],
  92. z2: 10
  93. });
  94. var labelModel = itemModel.getModel('label.normal');
  95. var labelHoverModel = itemModel.getModel('label.emphasis');
  96. var labelLineModel = itemModel.getModel('labelLine.normal');
  97. var labelLineHoverModel = itemModel.getModel('labelLine.emphasis');
  98. var visualColor = data.getItemVisual(idx, 'color');
  99. graphic.setLabelStyle(labelText.style, labelText.hoverStyle = {}, labelModel, labelHoverModel, {
  100. labelFetcher: data.hostModel,
  101. labelDataIndex: idx,
  102. defaultText: data.getName(idx),
  103. autoColor: visualColor,
  104. useInsideStyle: !!labelLayout.inside
  105. }, {
  106. textAlign: labelLayout.textAlign,
  107. textVerticalAlign: labelLayout.verticalAlign
  108. });
  109. labelText.ignore = labelText.normalIgnore = !labelModel.get('show');
  110. labelText.hoverIgnore = !labelHoverModel.get('show');
  111. labelLine.ignore = labelLine.normalIgnore = !labelLineModel.get('show');
  112. labelLine.hoverIgnore = !labelLineHoverModel.get('show'); // Default use item visual color
  113. labelLine.setStyle({
  114. stroke: visualColor
  115. });
  116. labelLine.setStyle(labelLineModel.getModel('lineStyle').getLineStyle());
  117. labelLine.hoverStyle = labelLineHoverModel.getModel('lineStyle').getLineStyle();
  118. };
  119. zrUtil.inherits(FunnelPiece, graphic.Group);
  120. var FunnelView = ChartView.extend({
  121. type: 'funnel',
  122. render: function (seriesModel, ecModel, api) {
  123. var data = seriesModel.getData();
  124. var oldData = this._data;
  125. var group = this.group;
  126. data.diff(oldData).add(function (idx) {
  127. var funnelPiece = new FunnelPiece(data, idx);
  128. data.setItemGraphicEl(idx, funnelPiece);
  129. group.add(funnelPiece);
  130. }).update(function (newIdx, oldIdx) {
  131. var piePiece = oldData.getItemGraphicEl(oldIdx);
  132. piePiece.updateData(data, newIdx);
  133. group.add(piePiece);
  134. data.setItemGraphicEl(newIdx, piePiece);
  135. }).remove(function (idx) {
  136. var piePiece = oldData.getItemGraphicEl(idx);
  137. group.remove(piePiece);
  138. }).execute();
  139. this._data = data;
  140. },
  141. remove: function () {
  142. this.group.removeAll();
  143. this._data = null;
  144. },
  145. dispose: function () {}
  146. });
  147. var _default = FunnelView;
  148. module.exports = _default;