arrange.js 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. define(function(require, exports, module) {
  2. var kity = require('../core/kity');
  3. var MinderNode = require('../core/node');
  4. var Command = require('../core/command');
  5. var Module = require('../core/module');
  6. kity.extendClass(MinderNode, {
  7. arrange: function(index) {
  8. var parent = this.parent;
  9. if (!parent) return;
  10. var sibling = parent.children;
  11. if (index < 0 || index >= sibling.length) return;
  12. sibling.splice(this.getIndex(), 1);
  13. sibling.splice(index, 0, this);
  14. return this;
  15. }
  16. });
  17. function asc(nodeA, nodeB) {
  18. return nodeA.getIndex() - nodeB.getIndex();
  19. }
  20. function desc(nodeA, nodeB) {
  21. return -asc(nodeA, nodeB);
  22. }
  23. function canArrange(km) {
  24. var selected = km.getSelectedNode();
  25. return selected && selected.parent && selected.parent.children.length > 1;
  26. }
  27. /**
  28. * @command ArrangeUp
  29. * @description 向上调整选中节点的位置
  30. * @shortcut Alt + Up
  31. * @state
  32. * 0: 当前选中了具有相同父亲的节点
  33. * -1: 其它情况
  34. */
  35. var ArrangeUpCommand = kity.createClass('ArrangeUpCommand', {
  36. base: Command,
  37. execute: function(km) {
  38. var nodes = km.getSelectedNodes();
  39. nodes.sort(asc);
  40. var lastIndexes = nodes.map(function(node) {
  41. return node.getIndex();
  42. });
  43. nodes.forEach(function(node, index) {
  44. node.arrange(lastIndexes[index] - 1);
  45. });
  46. km.layout(300);
  47. },
  48. queryState: function(km) {
  49. var selected = km.getSelectedNode();
  50. return selected ? 0 : -1;
  51. }
  52. });
  53. /**
  54. * @command ArrangeDown
  55. * @description 向下调整选中节点的位置
  56. * @shortcut Alt + Down
  57. * @state
  58. * 0: 当前选中了具有相同父亲的节点
  59. * -1: 其它情况
  60. */
  61. var ArrangeDownCommand = kity.createClass('ArrangeUpCommand', {
  62. base: Command,
  63. execute: function(km) {
  64. var nodes = km.getSelectedNodes();
  65. nodes.sort(desc);
  66. var lastIndexes = nodes.map(function(node) {
  67. return node.getIndex();
  68. });
  69. nodes.forEach(function(node, index) {
  70. node.arrange(lastIndexes[index] + 1);
  71. });
  72. km.layout(300);
  73. },
  74. queryState: function(km) {
  75. var selected = km.getSelectedNode();
  76. return selected ? 0 : -1;
  77. }
  78. });
  79. /**
  80. * @command Arrange
  81. * @description 调整选中节点的位置
  82. * @param {number} index 调整后节点的新位置
  83. * @state
  84. * 0: 当前选中了具有相同父亲的节点
  85. * -1: 其它情况
  86. */
  87. var ArrangeCommand = kity.createClass('ArrangeCommand', {
  88. base: Command,
  89. execute: function(km, index) {
  90. var nodes = km.getSelectedNodes().slice();
  91. if (!nodes.length) return;
  92. var ancestor = MinderNode.getCommonAncestor(nodes);
  93. if (ancestor != nodes[0].parent) return;
  94. var indexed = nodes.map(function(node) {
  95. return {
  96. index: node.getIndex(),
  97. node: node
  98. };
  99. });
  100. var asc = Math.min.apply(Math, indexed.map(function(one) { return one.index; })) >= index;
  101. indexed.sort(function(a, b) {
  102. return asc ? (b.index - a.index) : (a.index - b.index);
  103. });
  104. indexed.forEach(function(one) {
  105. one.node.arrange(index);
  106. });
  107. km.layout(300);
  108. },
  109. queryState: function(km) {
  110. var selected = km.getSelectedNode();
  111. return selected ? 0 : -1;
  112. }
  113. });
  114. Module.register('ArrangeModule', {
  115. commands: {
  116. 'arrangeup': ArrangeUpCommand,
  117. 'arrangedown': ArrangeDownCommand,
  118. 'arrange': ArrangeCommand
  119. },
  120. contextmenu: [{
  121. command: 'arrangeup'
  122. }, {
  123. command: 'arrangedown'
  124. }, {
  125. divider: true
  126. }],
  127. commandShortcutKeys: {
  128. 'arrangeup': 'normal::alt+Up',
  129. 'arrangedown': 'normal::alt+Down'
  130. }
  131. });
  132. });