From eacf41a4f6d9e8b5e1db223f554e894d2e5954f2 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Thu, 12 Mar 2015 11:21:05 +0000 Subject: [PATCH] Minimise filtering of nodes on redraw --- public/red/history.js | 2 +- public/red/main.js | 17 +---------------- public/red/ui/library.js | 12 ++++++++++++ public/red/ui/subflow.js | 11 ++++++++++- public/red/ui/view.js | 35 ++++++++++++++++++++++++++++------- 5 files changed, 52 insertions(+), 25 deletions(-) diff --git a/public/red/history.js b/public/red/history.js index 91afc810c..36ab451a2 100644 --- a/public/red/history.js +++ b/public/red/history.js @@ -192,7 +192,7 @@ RED.history = (function() { } } RED.view.dirty(ev.dirty); - RED.view.redraw(); + RED.view.redraw(true); RED.palette.refresh(); } } diff --git a/public/red/main.js b/public/red/main.js index 383fe94b5..8165a3322 100644 --- a/public/red/main.js +++ b/public/red/main.js @@ -169,7 +169,7 @@ var RED = (function() { success: function(nodes) { RED.nodes.import(nodes); RED.view.dirty(false); - RED.view.redraw(); + RED.view.redraw(true); RED.comms.subscribe("status/#",function(topic,msg) { var parts = topic.split("/"); var node = RED.nodes.node(parts[1]); @@ -359,21 +359,6 @@ var RED = (function() { RED.subflow.init(); RED.view.init(); - RED.view.on("selection-changed",function(selection) { - if (!selection.nodes) { - RED.menu.setDisabled("btn-export-menu",true); - RED.menu.setDisabled("btn-export-clipboard",true); - RED.menu.setDisabled("btn-export-library",true); - RED.menu.setDisabled("btn-convert-subflow",true); - } else { - RED.menu.setDisabled("btn-export-menu",false); - RED.menu.setDisabled("btn-export-clipboard",false); - RED.menu.setDisabled("btn-export-library",false); - RED.menu.setDisabled("btn-convert-subflow",false); - } - }); - - RED.keyboard.add(/* ? */ 191,{shift:true},function(){showHelp();d3.event.preventDefault();}); RED.comms.connect(); loadNodeList(); diff --git a/public/red/ui/library.js b/public/red/ui/library.js index f2934f69c..28beb7e74 100644 --- a/public/red/ui/library.js +++ b/public/red/ui/library.js @@ -382,6 +382,18 @@ RED.library = (function() { return { init: function() { + RED.view.on("selection-changed",function(selection) { + if (!selection.nodes) { + RED.menu.setDisabled("btn-export-menu",true); + RED.menu.setDisabled("btn-export-clipboard",true); + RED.menu.setDisabled("btn-export-library",true); + } else { + RED.menu.setDisabled("btn-export-menu",false); + RED.menu.setDisabled("btn-export-clipboard",false); + RED.menu.setDisabled("btn-export-library",false); + } + }); + loadFlowLibrary(); }, create: createUI, diff --git a/public/red/ui/subflow.js b/public/red/ui/subflow.js index d0edb952d..d187f7140 100644 --- a/public/red/ui/subflow.js +++ b/public/red/ui/subflow.js @@ -174,6 +174,15 @@ RED.subflow = (function() { RED.view.dirty(true); RED.view.redraw(); }); + + RED.view.on("selection-changed",function(selection) { + if (!selection.nodes) { + RED.menu.setDisabled("btn-convert-subflow",true); + } else { + RED.menu.setDisabled("btn-convert-subflow",false); + } + }); + } function createSubflow() { @@ -379,7 +388,7 @@ RED.subflow = (function() { }); RED.view.dirty(true); - RED.view.redraw(); + RED.view.redraw(true); } diff --git a/public/red/ui/view.js b/public/red/ui/view.js index 0994f6e4e..b64516218 100644 --- a/public/red/ui/view.js +++ b/public/red/ui/view.js @@ -32,6 +32,8 @@ RED.view = (function() { var activeWorkspace = 0; var activeSubflow = null; + var activeNodes = []; + var activeLinks = []; var workspaceScrollPositions = {}; @@ -231,6 +233,15 @@ RED.view = (function() { var drag_line = vis.append("svg:path").attr("class", "drag_line"); + function updateActiveNodes() { + activeNodes = RED.nodes.nodes.filter(function(d) { + return d.z == activeWorkspace; + }); + activeLinks = RED.nodes.links.filter(function(d) { + return d.source.z == activeWorkspace && d.target.z == activeWorkspace; + }) + } + var workspace_tabs = RED.tabs.create({ id: "workspace-tabs", onchange: function(tab) { @@ -273,9 +284,10 @@ RED.view = (function() { clearSelection(); RED.nodes.eachNode(function(n) { - n.dirty = true; + n.dirty = true; }); updateSelection(); + updateActiveNodes(); redraw(); }, ondblclick: function(tab) { @@ -294,10 +306,12 @@ RED.view = (function() { } }); RED.menu.setDisabled("btn-workspace-delete",workspace_tabs.count() == 1); + updateActiveNodes(); }, onremove: function(tab) { RED.menu.setDisabled("btn-workspace-delete",workspace_tabs.count() == 1); RED.menu.removeItem("btn-workspace-menu-"+tab.id.replace(".","-")); + updateActiveNodes(); } }); @@ -327,6 +341,7 @@ RED.view = (function() { RED.menu.setAction('btn-workspace-delete',function() { deleteWorkspace(activeWorkspace); }); + updateActiveNodes(); } function deleteWorkspace(id) { @@ -563,6 +578,7 @@ RED.view = (function() { } if (mouse_mode == RED.state.IMPORT_DRAGGING) { RED.keyboard.remove(/* ESCAPE */ 27); + updateActiveNodes(); setDirty(true); } redraw(); @@ -644,6 +660,7 @@ RED.view = (function() { clearSelection(); nn.selected = true; moving_set.push({n:nn}); + updateActiveNodes(); updateSelection(); redraw(); @@ -886,6 +903,7 @@ RED.view = (function() { RED.history.push({t:'delete',nodes:removedNodes,links:removedLinks,subflowOutputs:removedSubflowOutputs,subflowInputs:removedSubflowInputs,dirty:startDirty}); selected_link = null; + updateActiveNodes(); updateSelection(); redraw(); } @@ -980,6 +998,7 @@ RED.view = (function() { var link = {source: src, sourcePort:src_port, target: dst}; RED.nodes.addLink(link); RED.history.push({t:'add',links:[link],dirty:dirty}); + updateActiveNodes(); setDirty(true); } else { } @@ -1220,7 +1239,8 @@ RED.view = (function() { vis.selectAll(".subflowinput").remove(); } - var node = vis.selectAll(".nodegroup").data(RED.nodes.nodes.filter(function(d) { return d.z == activeWorkspace }),function(d){return d.id}); + //var node = vis.selectAll(".nodegroup").data(RED.nodes.nodes.filter(function(d) { return d.z == activeWorkspace }),function(d){return d.id}); + var node = vis.selectAll(".nodegroup").data(activeNodes,function(d){return d.id}); node.exit().remove(); var nodeEnter = node.enter().insert("svg:g").attr("class", "node nodegroup"); @@ -1579,9 +1599,7 @@ RED.view = (function() { } var link = vis.selectAll(".link").data( - RED.nodes.links.filter(function(d) { - return d.source.z == activeWorkspace && d.target.z == activeWorkspace; - }), + activeLinks, function(d) { return d.source.id+":"+d.sourcePort+":"+d.target.id+":"+d.target.i; } @@ -1756,7 +1774,7 @@ RED.view = (function() { dirty:RED.view.dirty() }); - + updateActiveNodes(); redraw(); } } catch(error) { @@ -1972,7 +1990,10 @@ RED.view = (function() { showWorkspace: function(id) { workspace_tabs.activateTab(id); }, - redraw: function() { + redraw: function(updateActive) { + if (updateActive) { + updateActiveNodes(); + } RED.nodes.eachSubflow(function(sf) { if (workspace_tabs.contains(sf.id)) { workspace_tabs.renameTab(sf.id,"Subflow: "+sf.name);