From 003a4b26fa6f4a39758b83ffadb2a2cce9794285 Mon Sep 17 00:00:00 2001 From: wimrijnders Date: Tue, 30 May 2017 23:12:02 +0200 Subject: [PATCH] Changed order of (de)select events for network (#3113) * Changed order of (de)select events for network * Fixed parameters to _generateClickEvent() to be compatible with previous. --- lib/network/modules/InteractionHandler.js | 98 ++++++++++------------- 1 file changed, 42 insertions(+), 56 deletions(-) diff --git a/lib/network/modules/InteractionHandler.js b/lib/network/modules/InteractionHandler.js index c0b8dade..663608cd 100644 --- a/lib/network/modules/InteractionHandler.js +++ b/lib/network/modules/InteractionHandler.js @@ -170,60 +170,53 @@ class InteractionHandler { /** + * Select and deselect nodes depending current selection change. + * + * For changing nodes, select/deselect events are fired. + * + * NOTE: For a given edge, if one connecting node is deselected and with the same + * click the other node is selected, no events for the edge will fire. + * It was selected and it will remain selected. + * + * TODO: This is all SelectionHandler calls; the method should be moved to there. * * @param pointer * @param add */ checkSelectionChanges(pointer, event, add = false) { - let previouslySelectedEdgeCount = this.selectionHandler._getSelectedEdgeCount(); - let previouslySelectedNodeCount = this.selectionHandler._getSelectedNodeCount(); let previousSelection = this.selectionHandler.getSelection(); - let selected; + let selected = false; if (add === true) { selected = this.selectionHandler.selectAdditionalOnPoint(pointer); } else { selected = this.selectionHandler.selectOnPoint(pointer); } - let selectedEdgesCount = this.selectionHandler._getSelectedEdgeCount(); - let selectedNodesCount = this.selectionHandler._getSelectedNodeCount(); let currentSelection = this.selectionHandler.getSelection(); - let {nodesChanged, edgesChanged} = this._determineIfDifferent(previousSelection, currentSelection); - let nodeSelected = false; + // See NOTE in method comment for the reason to do it like this + let deselectedItems = this._determineDifference(previousSelection, currentSelection); + let selectedItems = this._determineDifference(currentSelection , previousSelection); - if (selectedNodesCount - previouslySelectedNodeCount > 0) { // node was selected - this.selectionHandler._generateClickEvent('selectNode', event, pointer); - selected = true; - nodeSelected = true; - } - else if (nodesChanged === true && selectedNodesCount > 0) { - this.selectionHandler._generateClickEvent('deselectNode', event, pointer, previousSelection); - this.selectionHandler._generateClickEvent('selectNode', event, pointer); - nodeSelected = true; + if (deselectedItems.edges.length > 0) { + this.selectionHandler._generateClickEvent('deselectEdge', event, pointer, previousSelection); selected = true; } - else if (selectedNodesCount - previouslySelectedNodeCount < 0) { // node was deselected + + if (deselectedItems.nodes.length > 0) { this.selectionHandler._generateClickEvent('deselectNode', event, pointer, previousSelection); selected = true; } - - // handle the selected edges - if (selectedEdgesCount - previouslySelectedEdgeCount > 0 && nodeSelected === false) { // edge was selected - this.selectionHandler._generateClickEvent('selectEdge', event, pointer); + if (selectedItems.nodes.length > 0) { + this.selectionHandler._generateClickEvent('selectNode', event, pointer); selected = true; } - else if (selectedEdgesCount > 0 && edgesChanged === true) { - this.selectionHandler._generateClickEvent('deselectEdge', event, pointer, previousSelection); + + if (selectedItems.edges.length > 0) { this.selectionHandler._generateClickEvent('selectEdge', event, pointer); selected = true; } - else if (selectedEdgesCount - previouslySelectedEdgeCount < 0) { // edge was deselected - this.selectionHandler._generateClickEvent('deselectEdge', event, pointer, previousSelection); - selected = true; - } - // fire the select event if anything has been selected or deselected if (selected === true) { // select or unselect @@ -233,38 +226,31 @@ class InteractionHandler { /** - * This function checks if the nodes and edges previously selected have changed. - * @param previousSelection - * @param currentSelection - * @returns {{nodesChanged: boolean, edgesChanged: boolean}} + * Remove all node and edge id's from the first set that are present in the second one. + * + * @param firstSet + * @param secondSet + * @returns {{nodes: array, edges: array}} * @private */ - _determineIfDifferent(previousSelection,currentSelection) { - let nodesChanged = false; - let edgesChanged = false; - - for (let i = 0; i < previousSelection.nodes.length; i++) { - if (currentSelection.nodes.indexOf(previousSelection.nodes[i]) === -1) { - nodesChanged = true; - } - } - for (let i = 0; i < currentSelection.nodes.length; i++) { - if (previousSelection.nodes.indexOf(previousSelection.nodes[i]) === -1) { - nodesChanged = true; - } - } - for (let i = 0; i < previousSelection.edges.length; i++) { - if (currentSelection.edges.indexOf(previousSelection.edges[i]) === -1) { - edgesChanged = true; - } - } - for (let i = 0; i < currentSelection.edges.length; i++) { - if (previousSelection.edges.indexOf(previousSelection.edges[i]) === -1) { - edgesChanged = true; + _determineDifference(firstSet, secondSet) { + let arrayDiff = function(firstArr, secondArr) { + let result = []; + + for (let i = 0; i < firstArr.length; i++) { + let value = firstArr[i]; + if (secondArr.indexOf(value) === -1) { + result.push(value); + } } - } - return {nodesChanged, edgesChanged}; + return result; + }; + + return { + nodes: arrayDiff(firstSet.nodes, secondSet.nodes), + edges: arrayDiff(firstSet.edges, secondSet.edges) + }; }