priority.js 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. define(function(require, exports, module) {
  2. var kity = require('../core/kity');
  3. var utils = require('../core/utils');
  4. var Minder = require('../core/minder');
  5. var MinderNode = require('../core/node');
  6. var Command = require('../core/command');
  7. var Module = require('../core/module');
  8. var Renderer = require('../core/render');
  9. Module.register('PriorityModule', function() {
  10. var minder = this;
  11. // Designed by Akikonata
  12. // [MASK, BACK]
  13. var PRIORITY_COLORS = [null, ['#FF1200', '#840023'], // 1 - red
  14. ['#0074FF', '#01467F'], // 2 - blue
  15. ['#00AF00', '#006300'], // 3 - green
  16. ['#FF962E', '#B25000'], // 4 - orange
  17. ['#A464FF', '#4720C4'], // 5 - purple
  18. ['#A3A3A3', '#515151'], // 6,7,8,9 - gray
  19. ['#A3A3A3', '#515151'],
  20. ['#A3A3A3', '#515151'],
  21. ['#A3A3A3', '#515151'],
  22. ]; // hue from 1 to 5
  23. // jscs:disable maximumLineLength
  24. var BACK_PATH = 'M0,13c0,3.866,3.134,7,7,7h6c3.866,0,7-3.134,7-7V7H0V13z';
  25. var MASK_PATH = 'M20,10c0,3.866-3.134,7-7,7H7c-3.866,0-7-3.134-7-7V7c0-3.866,3.134-7,7-7h6c3.866,0,7,3.134,7,7V10z';
  26. var PRIORITY_DATA = 'priority';
  27. // 优先级图标的图形
  28. var PriorityIcon = kity.createClass('PriorityIcon', {
  29. base: kity.Group,
  30. constructor: function() {
  31. this.callBase();
  32. this.setSize(20);
  33. this.create();
  34. this.setId(utils.uuid('node_priority'));
  35. },
  36. setSize: function(size) {
  37. this.width = this.height = size;
  38. },
  39. create: function() {
  40. var white, back, mask, number; // 4 layer
  41. white = new kity.Path().setPathData(MASK_PATH).fill('white');
  42. back = new kity.Path().setPathData(BACK_PATH).setTranslate(0.5, 0.5);
  43. mask = new kity.Path().setPathData(MASK_PATH).setOpacity(0.8).setTranslate(0.5, 0.5);
  44. number = new kity.Text()
  45. .setX(this.width / 2 - 0.5).setY(this.height / 2)
  46. .setTextAnchor('middle')
  47. .setVerticalAlign('middle')
  48. .setFontItalic(true)
  49. .setFontSize(12)
  50. .fill('white');
  51. this.addShapes([back, mask, number]);
  52. this.mask = mask;
  53. this.back = back;
  54. this.number = number;
  55. },
  56. setValue: function(value) {
  57. var back = this.back,
  58. mask = this.mask,
  59. number = this.number;
  60. var color = PRIORITY_COLORS[value];
  61. if (color) {
  62. back.fill(color[1]);
  63. mask.fill(color[0]);
  64. }
  65. number.setContent(value);
  66. }
  67. });
  68. /**
  69. * @command Priority
  70. * @description 设置节点的优先级信息
  71. * @param {number} value 要设置的优先级(添加一个优先级小图标)
  72. * 取值为 0 移除优先级信息;
  73. * 取值为 1 - 9 设置优先级,超过 9 的优先级不渲染
  74. * @state
  75. * 0: 当前有选中的节点
  76. * -1: 当前没有选中的节点
  77. */
  78. var PriorityCommand = kity.createClass('SetPriorityCommand', {
  79. base: Command,
  80. execute: function(km, value) {
  81. var nodes = km.getSelectedNodes();
  82. for (var i = 0; i < nodes.length; i++) {
  83. nodes[i].setData(PRIORITY_DATA, value || null).render();
  84. }
  85. km.layout();
  86. },
  87. queryValue: function(km) {
  88. var nodes = km.getSelectedNodes();
  89. var val;
  90. for (var i = 0; i < nodes.length; i++) {
  91. val = nodes[i].getData(PRIORITY_DATA);
  92. if (val) break;
  93. }
  94. return val || null;
  95. },
  96. queryState: function(km) {
  97. return km.getSelectedNodes().length ? 0 : -1;
  98. }
  99. });
  100. return {
  101. 'commands': {
  102. 'priority': PriorityCommand
  103. },
  104. 'renderers': {
  105. left: kity.createClass('PriorityRenderer', {
  106. base: Renderer,
  107. create: function(node) {
  108. return new PriorityIcon();
  109. },
  110. shouldRender: function(node) {
  111. return node.getData(PRIORITY_DATA);
  112. },
  113. update: function(icon, node, box) {
  114. var data = node.getData(PRIORITY_DATA);
  115. var spaceLeft = node.getStyle('space-left'),
  116. x, y;
  117. icon.setValue(data);
  118. x = box.left - icon.width - spaceLeft;
  119. y = -icon.height / 2;
  120. icon.setTranslate(x, y);
  121. return new kity.Box({
  122. x: x,
  123. y: y,
  124. width: icon.width,
  125. height: icon.height
  126. });
  127. }
  128. })
  129. }
  130. };
  131. });
  132. });