From 479a02cc162cbbd2eff24036b41fa72d85968dd8 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Wed, 25 Jun 2014 10:30:52 +0100 Subject: [PATCH] Enable npm nodes to provide custom icons --- red/nodes/registry.js | 8 ++++++++ red/ui.js | 21 +++++++++++++++------ 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/red/nodes/registry.js b/red/nodes/registry.js index 63dbf8938..d53d84f08 100644 --- a/red/nodes/registry.js +++ b/red/nodes/registry.js @@ -88,8 +88,16 @@ function loadNode(nodeDir, nodeFn, nodeLabel) { function loadNodesFromModule(moduleDir,pkg) { var nodes = pkg['node-red'].nodes||{}; var promises = []; + var iconDirs = []; for (var n in nodes) { promises.push(loadNode(moduleDir,nodes[n],pkg.name+":"+n)); + var iconDir = path.join(moduleDir,path.dirname(nodes[n]),"icons"); + if (iconDirs.indexOf(iconDir) == -1) { + if (fs.existsSync(iconDir)) { + events.emit("node-icon-dir",iconDir); + iconDirs.push(iconDir); + }; + } } return promises; } diff --git a/red/ui.js b/red/ui.js index 33449d34a..ffd586448 100644 --- a/red/ui.js +++ b/red/ui.js @@ -41,15 +41,24 @@ function setupUI(settings) { } }); + var iconCache = {}; + //TODO: create a default icon + var defaultIcon = path.resolve(__dirname + '/../public/icons/arrow-in.png'); + app.get("/icons/:icon",function(req,res) { - for (var p in icon_paths) { - if (fs.existsSync(icon_paths[p]+'/'+req.params.icon)) { - res.sendfile(icon_paths[p]+'/'+req.params.icon); - return; + if (iconCache[req.params.icon]) { + res.sendfile(iconCache[req.params.icon]); + } else { + for (var p in icon_paths) { + var iconPath = path.join(icon_paths[p],req.params.icon); + if (fs.existsSync(iconPath)) { + res.sendfile(iconPath); + iconCache[req.params.icon] = iconPath; + return; + } } + res.sendfile(defaultIcon); } - //TODO: create a default icon - res.sendfile(path.resolve(__dirname + '/../public/icons/arrow-in.png')); }); app.get("/settings", function(req,res) {