progress.js 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  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('ProgressModule', function() {
  10. var minder = this;
  11. var PROGRESS_DATA = 'progress';
  12. // Designed by Akikonata
  13. var BG_COLOR = '#FFED83';
  14. var PIE_COLOR = '#43BC00';
  15. var SHADOW_PATH = 'M10,3c4.418,0,8,3.582,8,8h1c0-5.523-3.477-10-9-10S1,5.477,1,11h1C2,6.582,5.582,3,10,3z';
  16. var SHADOW_COLOR = '#8E8E8E';
  17. // jscs:disable maximumLineLength
  18. var FRAME_PATH = 'M10,0C4.477,0,0,4.477,0,10c0,5.523,4.477,10,10,10s10-4.477,10-10C20,4.477,15.523,0,10,0zM10,18c-4.418,0-8-3.582-8-8s3.582-8,8-8s8,3.582,8,8S14.418,18,10,18z';
  19. var FRAME_GRAD = new kity.LinearGradient().pipe(function(g) {
  20. g.setStartPosition(0, 0);
  21. g.setEndPosition(0, 1);
  22. g.addStop(0, '#fff');
  23. g.addStop(1, '#ccc');
  24. });
  25. var CHECK_PATH = 'M15.812,7.896l-6.75,6.75l-4.5-4.5L6.25,8.459l2.812,2.803l5.062-5.053L15.812,7.896z';
  26. var CHECK_COLOR = '#EEE';
  27. minder.getPaper().addResource(FRAME_GRAD);
  28. // 进度图标的图形
  29. var ProgressIcon = kity.createClass('ProgressIcon', {
  30. base: kity.Group,
  31. constructor: function(value) {
  32. this.callBase();
  33. this.setSize(20);
  34. this.create();
  35. this.setValue(value);
  36. this.setId(utils.uuid('node_progress'));
  37. this.translate(0.5, 0.5);
  38. },
  39. setSize: function(size) {
  40. this.width = this.height = size;
  41. },
  42. create: function() {
  43. var bg, pie, shadow, frame, check;
  44. bg = new kity.Circle(9)
  45. .fill(BG_COLOR);
  46. pie = new kity.Pie(9, 0)
  47. .fill(PIE_COLOR);
  48. shadow = new kity.Path()
  49. .setPathData(SHADOW_PATH)
  50. .setTranslate(-10, -10)
  51. .fill(SHADOW_COLOR);
  52. frame = new kity.Path()
  53. .setTranslate(-10, -10)
  54. .setPathData(FRAME_PATH)
  55. .fill(FRAME_GRAD);
  56. check = new kity.Path()
  57. .setTranslate(-10, -10)
  58. .setPathData(CHECK_PATH)
  59. .fill(CHECK_COLOR);
  60. this.addShapes([bg, pie, shadow, check, frame]);
  61. this.pie = pie;
  62. this.check = check;
  63. },
  64. setValue: function(value) {
  65. this.pie.setAngle(-360 * (value - 1) / 8);
  66. this.check.setVisible(value == 9);
  67. }
  68. });
  69. /**
  70. * @command Progress
  71. * @description 设置节点的进度信息(添加一个进度小图标)
  72. * @param {number} value 要设置的进度
  73. * 取值为 0 移除进度信息;
  74. * 取值为 1 表示未开始;
  75. * 取值为 2 表示完成 1/8;
  76. * 取值为 3 表示完成 2/8;
  77. * 取值为 4 表示完成 3/8;
  78. * 其余类推,取值为 9 表示全部完成
  79. * @state
  80. * 0: 当前有选中的节点
  81. * -1: 当前没有选中的节点
  82. */
  83. var ProgressCommand = kity.createClass('ProgressCommand', {
  84. base: Command,
  85. execute: function(km, value) {
  86. var nodes = km.getSelectedNodes();
  87. for (var i = 0; i < nodes.length; i++) {
  88. nodes[i].setData(PROGRESS_DATA, value || null).render();
  89. }
  90. km.layout();
  91. },
  92. queryValue: function(km) {
  93. var nodes = km.getSelectedNodes();
  94. var val;
  95. for (var i = 0; i < nodes.length; i++) {
  96. val = nodes[i].getData(PROGRESS_DATA);
  97. if (val) break;
  98. }
  99. return val || null;
  100. },
  101. queryState: function(km) {
  102. return km.getSelectedNodes().length ? 0 : -1;
  103. }
  104. });
  105. return {
  106. 'commands': {
  107. 'progress': ProgressCommand
  108. },
  109. 'renderers': {
  110. left: kity.createClass('ProgressRenderer', {
  111. base: Renderer,
  112. create: function(node) {
  113. return new ProgressIcon();
  114. },
  115. shouldRender: function(node) {
  116. return node.getData(PROGRESS_DATA);
  117. },
  118. update: function(icon, node, box) {
  119. var data = node.getData(PROGRESS_DATA);
  120. var spaceLeft = node.getStyle('space-left');
  121. var x, y;
  122. icon.setValue(data);
  123. x = box.left - icon.width - spaceLeft;
  124. y = -icon.height / 2;
  125. icon.setTranslate(x + icon.width / 2, y + icon.height / 2);
  126. return new kity.Box(x, y, icon.width, icon.height);
  127. }
  128. })
  129. }
  130. };
  131. });
  132. });