/** * Copyright JS Foundation and other contributors, http://js.foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. **/ RED.group = (function() { var _groupEditTemplate = ''; var colorPalette = [ "#ff0000", "#ffC000", "#ffff00", "#92d04f", "#0070c0", "#001f60", "#6f2fa0", "#000000", "#777777" ] var colorSteps = 3; var colorCount = colorPalette.length; for (var i=0,len=colorPalette.length*colorSteps;i 0) { historyEvent.events.push(ungroupHistoryEvent); } // Finally, create the new group var group = createGroup(nodes); if (group) { RED.view.select({nodes:[group]}) } historyEvent.events.push({ t:"createGroup", groups: [ group ], dirty: RED.nodes.dirty() }); RED.history.push(historyEvent); RED.nodes.dirty(true); } } function removeSelection() { var selection = RED.view.selection(); if (selection.nodes) { var nodes = []; var n; var parentGroup = RED.nodes.group(selection.nodes[0].g); if (parentGroup) { try { removeFromGroup(parentGroup,selection.nodes,true); var historyEvent = { t: "removeFromGroup", dirty: RED.nodes.dirty(), group: parentGroup, nodes: selection.nodes } RED.history.push(historyEvent); RED.nodes.dirty(true); } catch(err) { RED.notify(err,"error"); return; } } RED.view.select({nodes:selection.nodes}) } } function createGroup(nodes) { if (nodes.length === 0) { return; } // nodes is an array // each node must be on the same tab (z) var group = { id: RED.nodes.id(), type: 'group', nodes: [], style: { stroke: "#999", fill: "none" }, x: Number.POSITIVE_INFINITY, y: Number.POSITIVE_INFINITY, w: 0, h: 0, _def: RED.group.def } try { addToGroup(group,nodes); } catch(err) { RED.notify(err,"error"); return; } group.z = nodes[0].z; RED.nodes.addGroup(group); return group; } function addToGroup(group,nodes) { if (!Array.isArray(nodes)) { nodes = [nodes]; } var i,n,z; var g; // First pass - validate we can safely add these nodes to the group for (i=0;i -1) { g.nodes.splice(ni,1) } } n.g = group.id; n.dirty = true; group.nodes.push(n); group.x = Math.min(group.x,n.x-n.w/2-25-((n._def.button && n._def.align!=="right")?20:0)); group.y = Math.min(group.y,n.y-n.h/2-25); group.w = Math.max(group.w,n.x+n.w/2+25+((n._def.button && n._def.align=="right")?20:0) - group.x); group.h = Math.max(group.h,n.y+n.h/2+25-group.y); } } function removeFromGroup(group, nodes, reparent) { if (!Array.isArray(nodes)) { nodes = [nodes]; } var n; // First pass, check they are all in the same parent // TODO: DRY mergeSelection,removeSelection,... for (var i=0; i