@7polo/kityminder-core
Version:
KityMinder Core Implement
156 lines (132 loc) • 4.39 kB
JavaScript
define(function(require, exports, module) {
var kity = require('../core/kity');
var MinderNode = require('../core/node');
var Command = require('../core/command');
var Module = require('../core/module');
kity.extendClass(MinderNode, {
arrange: function(index) {
var parent = this.parent;
if (!parent) return;
var sibling = parent.children;
if (index < 0 || index >= sibling.length) return;
sibling.splice(this.getIndex(), 1);
sibling.splice(index, 0, this);
return this;
}
});
function asc(nodeA, nodeB) {
return nodeA.getIndex() - nodeB.getIndex();
}
function desc(nodeA, nodeB) {
return -asc(nodeA, nodeB);
}
function canArrange(km) {
var selected = km.getSelectedNode();
return selected && selected.parent && selected.parent.children.length > 1;
}
/**
* @command ArrangeUp
* @description 向上调整选中节点的位置
* @shortcut Alt + Up
* @state
* 0: 当前选中了具有相同父亲的节点
* -1: 其它情况
*/
var ArrangeUpCommand = kity.createClass('ArrangeUpCommand', {
base: Command,
execute: function(km) {
var nodes = km.getSelectedNodes();
nodes.sort(asc);
var lastIndexes = nodes.map(function(node) {
return node.getIndex();
});
nodes.forEach(function(node, index) {
node.arrange(lastIndexes[index] - 1);
});
km.layout(300);
},
queryState: function(km) {
var selected = km.getSelectedNode();
return selected ? 0 : -1;
}
});
/**
* @command ArrangeDown
* @description 向下调整选中节点的位置
* @shortcut Alt + Down
* @state
* 0: 当前选中了具有相同父亲的节点
* -1: 其它情况
*/
var ArrangeDownCommand = kity.createClass('ArrangeUpCommand', {
base: Command,
execute: function(km) {
var nodes = km.getSelectedNodes();
nodes.sort(desc);
var lastIndexes = nodes.map(function(node) {
return node.getIndex();
});
nodes.forEach(function(node, index) {
node.arrange(lastIndexes[index] + 1);
});
km.layout(300);
},
queryState: function(km) {
var selected = km.getSelectedNode();
return selected ? 0 : -1;
}
});
/**
* @command Arrange
* @description 调整选中节点的位置
* @param {number} index 调整后节点的新位置
* @state
* 0: 当前选中了具有相同父亲的节点
* -1: 其它情况
*/
var ArrangeCommand = kity.createClass('ArrangeCommand', {
base: Command,
execute: function(km, index) {
var nodes = km.getSelectedNodes().slice();
if (!nodes.length) return;
var ancestor = MinderNode.getCommonAncestor(nodes);
if (ancestor != nodes[0].parent) return;
var indexed = nodes.map(function(node) {
return {
index: node.getIndex(),
node: node
};
});
var asc = Math.min.apply(Math, indexed.map(function(one) { return one.index; })) >= index;
indexed.sort(function(a, b) {
return asc ? (b.index - a.index) : (a.index - b.index);
});
indexed.forEach(function(one) {
one.node.arrange(index);
});
km.layout(300);
},
queryState: function(km) {
var selected = km.getSelectedNode();
return selected ? 0 : -1;
}
});
Module.register('ArrangeModule', {
commands: {
'arrangeup': ArrangeUpCommand,
'arrangedown': ArrangeDownCommand,
'arrange': ArrangeCommand
},
contextmenu: [{
command: 'arrangeup'
}, {
command: 'arrangedown'
}, {
divider: true
}],
commandShortcutKeys: {
'arrangeup': 'normal::alt+Up',
'arrangedown': 'normal::alt+Down'
}
});
});