visualSolution.js 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. var zrUtil = require("zrender/lib/core/util");
  2. var VisualMapping = require("./VisualMapping");
  3. /**
  4. * @file Visual solution, for consistent option specification.
  5. */
  6. var each = zrUtil.each;
  7. function hasKeys(obj) {
  8. if (obj) {
  9. for (var name in obj) {
  10. if (obj.hasOwnProperty(name)) {
  11. return true;
  12. }
  13. }
  14. }
  15. }
  16. /**
  17. * @param {Object} option
  18. * @param {Array.<string>} stateList
  19. * @param {Function} [supplementVisualOption]
  20. * @return {Object} visualMappings <state, <visualType, module:echarts/visual/VisualMapping>>
  21. */
  22. function createVisualMappings(option, stateList, supplementVisualOption) {
  23. var visualMappings = {};
  24. each(stateList, function (state) {
  25. var mappings = visualMappings[state] = createMappings();
  26. each(option[state], function (visualData, visualType) {
  27. if (!VisualMapping.isValidType(visualType)) {
  28. return;
  29. }
  30. var mappingOption = {
  31. type: visualType,
  32. visual: visualData
  33. };
  34. supplementVisualOption && supplementVisualOption(mappingOption, state);
  35. mappings[visualType] = new VisualMapping(mappingOption); // Prepare a alpha for opacity, for some case that opacity
  36. // is not supported, such as rendering using gradient color.
  37. if (visualType === 'opacity') {
  38. mappingOption = zrUtil.clone(mappingOption);
  39. mappingOption.type = 'colorAlpha';
  40. mappings.__hidden.__alphaForOpacity = new VisualMapping(mappingOption);
  41. }
  42. });
  43. });
  44. return visualMappings;
  45. function createMappings() {
  46. var Creater = function () {}; // Make sure hidden fields will not be visited by
  47. // object iteration (with hasOwnProperty checking).
  48. Creater.prototype.__hidden = Creater.prototype;
  49. var obj = new Creater();
  50. return obj;
  51. }
  52. }
  53. /**
  54. * @param {Object} thisOption
  55. * @param {Object} newOption
  56. * @param {Array.<string>} keys
  57. */
  58. function replaceVisualOption(thisOption, newOption, keys) {
  59. // Visual attributes merge is not supported, otherwise it
  60. // brings overcomplicated merge logic. See #2853. So if
  61. // newOption has anyone of these keys, all of these keys
  62. // will be reset. Otherwise, all keys remain.
  63. var has;
  64. zrUtil.each(keys, function (key) {
  65. if (newOption.hasOwnProperty(key) && hasKeys(newOption[key])) {
  66. has = true;
  67. }
  68. });
  69. has && zrUtil.each(keys, function (key) {
  70. if (newOption.hasOwnProperty(key) && hasKeys(newOption[key])) {
  71. thisOption[key] = zrUtil.clone(newOption[key]);
  72. } else {
  73. delete thisOption[key];
  74. }
  75. });
  76. }
  77. /**
  78. * @param {Array.<string>} stateList
  79. * @param {Object} visualMappings <state, Object.<visualType, module:echarts/visual/VisualMapping>>
  80. * @param {module:echarts/data/List} list
  81. * @param {Function} getValueState param: valueOrIndex, return: state.
  82. * @param {object} [scope] Scope for getValueState
  83. * @param {string} [dimension] Concrete dimension, if used.
  84. */
  85. function applyVisual(stateList, visualMappings, data, getValueState, scope, dimension) {
  86. var visualTypesMap = {};
  87. zrUtil.each(stateList, function (state) {
  88. var visualTypes = VisualMapping.prepareVisualTypes(visualMappings[state]);
  89. visualTypesMap[state] = visualTypes;
  90. });
  91. var dataIndex;
  92. function getVisual(key) {
  93. return data.getItemVisual(dataIndex, key);
  94. }
  95. function setVisual(key, value) {
  96. data.setItemVisual(dataIndex, key, value);
  97. }
  98. if (dimension == null) {
  99. data.each(eachItem, true);
  100. } else {
  101. data.each([dimension], eachItem, true);
  102. }
  103. function eachItem(valueOrIndex, index) {
  104. dataIndex = dimension == null ? valueOrIndex : index;
  105. var rawDataItem = data.getRawDataItem(dataIndex); // Consider performance
  106. if (rawDataItem && rawDataItem.visualMap === false) {
  107. return;
  108. }
  109. var valueState = getValueState.call(scope, valueOrIndex);
  110. var mappings = visualMappings[valueState];
  111. var visualTypes = visualTypesMap[valueState];
  112. for (var i = 0, len = visualTypes.length; i < len; i++) {
  113. var type = visualTypes[i];
  114. mappings[type] && mappings[type].applyVisual(valueOrIndex, getVisual, setVisual);
  115. }
  116. }
  117. }
  118. exports.createVisualMappings = createVisualMappings;
  119. exports.replaceVisualOption = replaceVisualOption;
  120. exports.applyVisual = applyVisual;