cytoscape-expand-collapse
Version:
This extension provides an interface to expand-collapse nodes.
230 lines (188 loc) • 5.87 kB
JavaScript
module.exports = function (cy, api) {
if (cy.undoRedo == null)
return;
var ur = cy.undoRedo({}, true);
function getEles(_eles) {
return (typeof _eles === "string") ? cy.$(_eles) : _eles;
}
function getNodePositions() {
var positions = {};
var nodes = cy.nodes();
for (var i = 0; i < nodes.length; i++) {
var ele = nodes[i];
positions[ele.id()] = {
x: ele.position("x"),
y: ele.position("y")
};
}
return positions;
}
function returnToPositions(positions) {
var currentPositions = {};
cy.nodes().not(":parent").positions(function (ele, i) {
if(typeof ele === "number") {
ele = i;
}
currentPositions[ele.id()] = {
x: ele.position("x"),
y: ele.position("y")
};
var pos = positions[ele.id()];
return {
x: pos.x,
y: pos.y
};
});
return currentPositions;
}
var secondTimeOpts = {
layoutBy: null,
animate: false,
fisheye: false
};
function doIt(func) {
return function (args) {
var result = {};
var nodes = getEles(args.nodes);
if (args.firstTime) {
result.oldData = getNodePositions();
result.nodes = func.indexOf("All") > 0 ? api[func](args.options) : api[func](nodes, args.options);
} else {
result.oldData = getNodePositions();
result.nodes = func.indexOf("All") > 0 ? api[func](secondTimeOpts) : api[func](cy.collection(nodes), secondTimeOpts);
returnToPositions(args.oldData);
}
return result;
};
}
var actions = ["collapse", "collapseRecursively", "collapseAll", "expand", "expandRecursively", "expandAll"];
for (var i = 0; i < actions.length; i++) {
if(i == 2)
ur.action("collapseAll", doIt("collapseAll"), doIt("expandRecursively"));
else if(i == 5)
ur.action("expandAll", doIt("expandAll"), doIt("collapseRecursively"));
else
ur.action(actions[i], doIt(actions[i]), doIt(actions[(i + 3) % 6]));
}
function collapseEdges(args){
var options = args.options;
var edges = args.edges;
var result = {};
result.options = options;
if(args.firstTime){
var collapseResult = api.collapseEdges(edges,options);
result.edges = collapseResult.edges;
result.oldEdges = collapseResult.oldEdges;
result.firstTime = false;
}else{
result.oldEdges = edges;
result.edges = args.oldEdges;
if(args.edges.length > 0 && args.oldEdges.length > 0){
cy.remove(args.edges);
cy.add(args.oldEdges);
}
}
return result;
}
function collapseEdgesBetweenNodes(args){
var options = args.options;
var result = {};
result.options = options;
if(args.firstTime){
var collapseAllResult = api.collapseEdgesBetweenNodes(args.nodes, options);
result.edges = collapseAllResult.edges;
result.oldEdges = collapseAllResult.oldEdges;
result.firstTime = false;
}else{
result.edges = args.oldEdges;
result.oldEdges = args.edges;
if(args.edges.length > 0 && args.oldEdges.length > 0){
cy.remove(args.edges);
cy.add(args.oldEdges);
}
}
return result;
}
function collapseAllEdges(args){
var options = args.options;
var result = {};
result.options = options;
if(args.firstTime){
var collapseAllResult = api.collapseAllEdges(options);
result.edges = collapseAllResult.edges;
result.oldEdges = collapseAllResult.oldEdges;
result.firstTime = false;
}else{
result.edges = args.oldEdges;
result.oldEdges = args.edges;
if(args.edges.length > 0 && args.oldEdges.length > 0){
cy.remove(args.edges);
cy.add(args.oldEdges);
}
}
return result;
}
function expandEdges(args){
var options = args.options;
var result ={};
result.options = options;
if(args.firstTime){
var expandResult = api.expandEdges(args.edges);
result.edges = expandResult.edges;
result.oldEdges = expandResult.oldEdges;
result.firstTime = false;
}else{
result.oldEdges = args.edges;
result.edges = args.oldEdges;
if(args.edges.length > 0 && args.oldEdges.length > 0){
cy.remove(args.edges);
cy.add(args.oldEdges);
}
}
return result;
}
function expandEdgesBetweenNodes(args){
var options = args.options;
var result = {};
result.options = options;
if(args.firstTime){
var collapseAllResult = api.expandEdgesBetweenNodes(args.nodes,options);
result.edges = collapseAllResult.edges;
result.oldEdges = collapseAllResult.oldEdges;
result.firstTime = false;
}else{
result.edges = args.oldEdges;
result.oldEdges = args.edges;
if(args.edges.length > 0 && args.oldEdges.length > 0){
cy.remove(args.edges);
cy.add(args.oldEdges);
}
}
return result;
}
function expandAllEdges(args){
var options = args.options;
var result = {};
result.options = options;
if(args.firstTime){
var expandResult = api.expandAllEdges(options);
result.edges = expandResult.edges;
result.oldEdges = expandResult.oldEdges;
result.firstTime = false;
}else{
result.edges = args.oldEdges;
result.oldEdges = args.edges;
if(args.edges.length > 0 && args.oldEdges.length > 0){
cy.remove(args.edges);
cy.add(args.oldEdges);
}
}
return result;
}
ur.action("collapseEdges", collapseEdges, expandEdges);
ur.action("expandEdges", expandEdges, collapseEdges);
ur.action("collapseEdgesBetweenNodes", collapseEdgesBetweenNodes, expandEdgesBetweenNodes);
ur.action("expandEdgesBetweenNodes", expandEdgesBetweenNodes, collapseEdgesBetweenNodes);
ur.action("collapseAllEdges", collapseAllEdges, expandAllEdges);
ur.action("expandAllEdges", expandAllEdges, collapseAllEdges);
};