diff --git a/VQI_PathwayEditorGUI.js b/VQI_PathwayEditorGUI.js index 8c49c2b..9d4a1ba 100644 --- a/VQI_PathwayEditorGUI.js +++ b/VQI_PathwayEditorGUI.js @@ -70,9 +70,10 @@ var VQI_PathwayEditorGUI = function (parent) { strVar += "
  • "; strVar += "
  • <\/input><\/li>"; strVar += "
  • <\/input><\/li>"; - strVar += "
  • <\/input><\/li>"; - strVar += "
  • <\/input><\/li>"; strVar += "
  • <\/input><\/li>"; + strVar += "
  • <\/input><\/li>"; + strVar += "
  • <\/input><\/li>"; + strVar += "
  • <\/input><\/li>"; strVar += "
  • <\/input><\/li>"; strVar += "
  • "; strVar += "
  • <\/input><\/li>"; @@ -335,19 +336,18 @@ var VQI_PathwayEditorGUI = function (parent) { function focus(name) { var cy = $('#' + parent + '-cy').cytoscape('get'); cy.elements("node[name *= \"" + name + "\"]").select(); - cy.$('node').style("opacity", 0.2); - cy.$('edge').style("opacity", 0.2); - cy.$('node:selected').style("opacity", 1.0); - cy.$('edge:selected').style("opacity", 1.0); + cy.$('node').addClass('unfocused'); + cy.$('edge').addClass('unfocused'); + cy.$('node:selected').addClass('focused'); + cy.$('edge:selected').addClass('focused'); } function unFocus() { var cy = $('#' + parent + '-cy').cytoscape('get'); - cy.$('node').unselect(); - cy.$('node').removeStyle("opacity"); - cy.$('edge').removeStyle("opacity"); - cy.$('node:selected').removeStyle("opacity"); - cy.$('edge:selected').removeStyle("opacity"); + cy.$('node').unselect(); + cy.$('edge').unselect(); + cy.$('node').removeClass('unfocused').removeClass('focused'); + cy.$('edge').removeClass('unfocused').removeClass('focused'); } function search(event) { @@ -376,12 +376,11 @@ var VQI_PathwayEditorGUI = function (parent) { function collapseBundleInformative(event) { var cy = $('#' + parent + '-cy').cytoscape('get'); for (var i = 0; i < selectedForEditNodes.size(); i++) { - if (selectedForEditNodes[i].isParent()) { + if (selectedForEditNodes[i].isParent() && !selectedForEditNodes[i].descendants()[0].hasClass('collapsed_informative')) { var staticOldPosX = selectedForEditNodes[i].position('x'); var staticOldPosY = selectedForEditNodes[i].position('y'); - selectedForEditNodes[i].descendants().data('Type','circle') - selectedForEditNodes[i].descendants().data('Width',10); - selectedForEditNodes[i].descendants().data('Height',10); + selectedForEditNodes[i].descendants().addClass('collapsed_informative'); + selectedForEditNodes[i].descendants().unselectify(); var xGap=0; var yGap=0; for(var j = 0; selectedForEditNodes[i].children().length > j; j++){ @@ -402,14 +401,24 @@ var VQI_PathwayEditorGUI = function (parent) { } saveState(); } + + function expandBundleInformative(event) { + var cy = $('#' + parent + '-cy').cytoscape('get'); + for (var i = 0; i < selectedForEditNodes.size(); i++) { + if (selectedForEditNodes[i].isParent() && selectedForEditNodes[i].descendants()[0].hasClass('collapsed_informative')) { + selectedForEditNodes[i].descendants().removeClass('collapsed_informative'); + selectedForEditNodes[i].descendants().selectify(); + } + } + saveState(); + } function collapseBundle(event) { var cy = $('#' + parent + '-cy').cytoscape('get'); for (var i = 0; i < selectedForEditNodes.size(); i++) { - if (selectedForEditNodes[i].isParent()) { + if (selectedForEditNodes[i].isParent() && !selectedForEditNodes[i].descendants()[0].hasClass('collapsed')) { selectedForEditNodes[i].descendants().addClass('collapsed'); - selectedForEditNodes[i].descendants().unselectify(); - selectedForEditNodes[i].descendants().ungrabify(); + selectedForEditNodes[i].descendants().unselectify(); selectedForEditNodes[i].descendants().positions({ x: selectedForEditNodes[i].position('x') + selectedForEditNodes[i].width() / 2, y: selectedForEditNodes[i].position('y') + selectedForEditNodes[i].height() / 2 @@ -422,10 +431,9 @@ var VQI_PathwayEditorGUI = function (parent) { function expandBundle(event) { var cy = $('#' + parent + '-cy').cytoscape('get'); for (var i = 0; i < selectedForEditNodes.size(); i++) { - if (selectedForEditNodes[i].isParent()) { + if (selectedForEditNodes[i].isParent() && selectedForEditNodes[i].descendants()[0].hasClass('collapsed')) { selectedForEditNodes[i].descendants().removeClass('collapsed'); - selectedForEditNodes[i].descendants().selectify(); - selectedForEditNodes[i].descendants().grabify(); + selectedForEditNodes[i].descendants().selectify(); } } saveState(); @@ -1196,16 +1204,16 @@ var VQI_PathwayEditorGUI = function (parent) { btn.appendChild(t); btn.addEventListener('click', function (event) { var k = parseInt(event.currentTarget.innerHTML); - cy.$('node').unselect(); - cy.$('edge').unselect(); - cy.$('node').style("opacity", 0.2); - cy.$('edge').style("opacity", 0.2); + cy.$('node').removeClass('focused'); + cy.$('edge').removeClass('focused'); + cy.$('node').addClass('unfocused'); + cy.$('edge').addClass('unfocused'); for (var j = 0; j < result[k].edges.length; j++) { - cy.elements("edge[id = \"" + result[k].edges[j] + "\"]").style("opacity", 1.0); + cy.elements("edge[id = \"" + result[k].edges[j] + "\"]").addClass('focused'); var sourceNode = cy.elements("edge[id = \"" + result[k].edges[j] + "\"]").data('source'); var targetNode = cy.elements("edge[id = \"" + result[k].edges[j] + "\"]").data('target'); - cy.elements("node[id = \"" + sourceNode + "\"]").style("opacity", 1.0); - cy.elements("node[id = \"" + targetNode + "\"]").style("opacity", 1.0); + cy.elements("node[id = \"" + sourceNode + "\"]").addClass('focused'); + cy.elements("node[id = \"" + targetNode + "\"]").addClass('focused'); } }); path.appendChild(btn); @@ -1912,8 +1920,24 @@ var VQI_PathwayEditorGUI = function (parent) { // collapse .selector('.collapsed').css({ - 'opacity': 0.01 - }), + 'opacity': 0.01, + 'width': .01, + 'height': .01 + }).selector('.collapsed_informative').css({ + 'shape': 'circle', + 'width': 10, + 'height': 10, + 'color': 'black', + 'text-valign': 'center', + 'background-color': 'white', + 'border-color': 'black', + 'border-style': 'solid', + 'border-width': 1 + }).selector('.unfocused').css({ + 'opacity': 0.2 + }).selector('.focused').css({ + 'opacity': 1.0 + }), layout: { name: 'preset', padding: 10 @@ -1931,6 +1955,7 @@ var VQI_PathwayEditorGUI = function (parent) { $('#' + parent + '-unbundle').removeClass('disabled'); $('#' + parent + '-collapse').removeClass('disabled'); $('#' + parent + '-collapse-informative').removeClass('disabled'); + $('#' + parent + '-expand-informative').removeClass('disabled'); $('#' + parent + '-expand').removeClass('disabled'); $('#' + parent + '-findpath').removeClass('disabled'); $('#' + parent + '-find-object').removeClass('disabled'); @@ -1949,7 +1974,7 @@ var VQI_PathwayEditorGUI = function (parent) { postAddProcessing(); - // add custom events + // custom events var tappedBefore = null; cy.on('tap', function (event) { var tappedNow = event.cyTarget; @@ -2012,21 +2037,6 @@ var VQI_PathwayEditorGUI = function (parent) { // saveState(); }); - cy.on('grab', 'node', function (event) { - if (cy.$('node:grabbed').isParent() && !cy.$('node:grabbed').descendants()[0].grabbable()) { - grabbedCollapsedForEditNodes = cy.$('node:grabbed'); - grabbedCollapsedForEditNodes.descendants().grabify(); - } - saveState(); - }); - - cy.on('free', 'node', function (event) { - // saveState(); - if (grabbedCollapsedForEditNodes.constructor !== Array) - grabbedCollapsedForEditNodes.descendants().ungrabify(); - grabbedCollapsedForEditNodes = []; - }); - cy.on('data', 'node', function (event) { // saveState(); }); @@ -2034,6 +2044,12 @@ var VQI_PathwayEditorGUI = function (parent) { cy.on('style', 'node', function (event) { // saveState(); }); + + cy.nodes().nonorphans() + .on('grab', function(){ if(this.hasClass("collapsed") || this.hasClass("collapsed_informative")) + {this.ungrabify();} }) + .on('free', function(){ if(this.hasClass("collapsed") || this.hasClass("collapsed_informative")) + {this.grabify();} }); saveState(); if(typeof(self.sprayData) != "undefined") @@ -2084,18 +2100,14 @@ var VQI_PathwayEditorGUI = function (parent) { Cancel: function () { dialogTable.dialog("close"); var cy = $('#' + parent + '-cy').cytoscape('get'); - cy.$('node').removeStyle("opacity"); - cy.$('edge').removeStyle("opacity"); - cy.$('node:selected').removeStyle("opacity"); - cy.$('edge:selected').removeStyle("opacity"); + cy.$('node').removeClass("unfocused"); + cy.$('edge').removeClass("focused"); } }, close: function () { var cy = $('#' + parent + '-cy').cytoscape('get'); - cy.$('node').removeStyle("opacity"); - cy.$('edge').removeStyle("opacity"); - cy.$('node:selected').removeStyle("opacity"); - cy.$('edge:selected').removeStyle("opacity"); + cy.$('node').removeClass("unfocused"); + cy.$('edge').removeClass("focused"); } }); @@ -2310,8 +2322,9 @@ var VQI_PathwayEditorGUI = function (parent) { document.getElementById(parent + '-delete-elements').addEventListener('click', removeElements); document.getElementById(parent + '-add-node').addEventListener('click', addNode); document.getElementById(parent + '-add-edge').addEventListener('click', addEdge); + document.getElementById(parent + '-expand-informative').addEventListener('click', expandBundleInformative); document.getElementById(parent + '-collapse-informative').addEventListener('click', collapseBundleInformative); - document.getElementById(parent + '-expand').addEventListener('click', expandBundle); + document.getElementById(parent + '-expand').addEventListener('click', expandBundle); document.getElementById(parent + '-collapse').addEventListener('click', collapseBundle); document.getElementById(parent + '-bundle').addEventListener('click', dialogBundleOpen); document.getElementById(parent + '-unbundle').addEventListener('click', unbundle);