31 bool preserveDanglingCables,
bool resetConstantValues)
34 map<VuoRendererNode *, VuoRendererNode *> newNodeForOldNode;
35 newNodeForOldNode[oldNode] = newNode;
37 initialize(window, commandDescription, newNodeForOldNode, preserveDanglingCables, resetConstantValues);
44 bool preserveDanglingCables,
bool resetConstantValues)
47 initialize(window, commandDescription, newNodeForOldNode, preserveDanglingCables, resetConstantValues);
54 void VuoCommandReplaceNode::initialize(
VuoEditorWindow *window,
string commandDescription, map<VuoRendererNode *, VuoRendererNode *> newNodeForOldNode,
55 bool preserveDanglingCables,
bool resetConstantValues)
59 for (map<VuoRendererNode *, VuoRendererNode *>::iterator i = newNodeForOldNode.begin(); i != newNodeForOldNode.end(); ++i)
66 setText(commandDescription.c_str());
67 this->window = window;
69 vector<string> descriptions;
73 this->operationInvolvesGenericPort =
false;
74 vector<VuoCommandReplaceNode::SingleNodeReplacement *> singleNodeReplacements;
76 for (map<VuoRendererNode *, VuoRendererNode *>::iterator i = newNodeForOldNode.begin(); i != newNodeForOldNode.end(); ++i)
82 this->operationInvolvesGenericPort =
true;
84 VuoCommandReplaceNode::SingleNodeReplacement *nodeReplacement =
new SingleNodeReplacement(oldNode,
87 preserveDanglingCables,
89 singleNodeReplacements.push_back(nodeReplacement);
99 for (vector<SingleNodeReplacement *>::iterator i = singleNodeReplacements.begin(); i != singleNodeReplacements.end(); ++i)
101 (*i)->createAllMappings();
106 for (SingleNodeReplacement *nodeReplacement : singleNodeReplacements)
108 nodeReplacement->oldNode,
109 nodeReplacement->newNode,
110 nodeReplacement->updatedPortForOriginalPort,
118 commandDescription.c_str(),
140 if (operationInvolvesGenericPort)
156 if (operationInvolvesGenericPort)
168 this->oldNode = oldNode;
169 this->newNode = newNode;
170 this->composition = composition;
171 this->preserveDanglingCables = preserveDanglingCables;
172 this->resetConstantValues = resetConstantValues;
174 replacingDictionaryKeyList =
false;
175 replacingDictionaryValueList =
false;
181 void VuoCommandReplaceNode::SingleNodeReplacement::createAllMappings()
188 for (vector<VuoPort *>::iterator inputPort = oldInputPorts.begin(); inputPort != oldInputPorts.end(); ++inputPort)
190 if ((*inputPort)->getRenderer()->getDataType())
191 constantValueForOriginalPort[*inputPort] = (*inputPort)->getRenderer()->getConstantAsString();
193 vector<VuoCable *> inputCables = (*inputPort)->getConnectedCables(
true);
194 foreach(
VuoCable *cable, inputCables)
200 this->revertedPublishedInternalExternalPortCombinations.push_back(make_pair(internalPublishedPort, externalPublishedPort));
205 this->incomingCables.insert(cable);
213 this->collapsedTypecasts.push_back(typecastNode);
219 foreach (
VuoCable *cable, typecastInputCables)
225 this->publishedInternalExternalPortCombinationsForTypecast[typecastNode].push_back(make_pair(internalPublishedPort, externalPublishedPort));
231 this->incomingCablesForTypecast[typecastNode].insert(cable);
232 originalFromPortForCable[cable] = cable->
getFromPort();
233 originalToPortForCable[cable] = cable->
getToPort();
237 hostPortForTypecast[typecastNode] = (*inputPort);
243 for(vector<VuoPort *>::iterator outputPort = oldOutputPorts.begin(); outputPort != oldOutputPorts.end(); ++outputPort)
245 vector<VuoCable *> outputCables = (*outputPort)->getConnectedCables(
true);
246 foreach(
VuoCable *cable, outputCables)
252 this->revertedPublishedInternalExternalPortCombinations.push_back(make_pair(internalPublishedPort, externalPublishedPort));
257 this->outgoingCables.insert(cable);
261 createPortMappings();
268 void VuoCommandReplaceNode::SingleNodeReplacement::redo()
273 composition->uncollapseTypecastNode(oldNode);
276 for (vector<VuoRendererNode *>::iterator i = collapsedTypecasts.begin(); i != collapsedTypecasts.end(); ++i)
277 composition->uncollapseTypecastNode(*i);
279 for (vector<pair<VuoPort *, VuoPublishedPort *> >::iterator i = revertedPublishedInternalExternalPortCombinations.begin(); i != revertedPublishedInternalExternalPortCombinations.end(); ++i)
281 bool unpublishIsolatedExternalPort =
false;
286 composition->replaceNode(oldNode, newNode->
getBase());
289 if (!resetConstantValues)
291 for (map<VuoPort *, string>::iterator i = constantValueForOriginalPort.begin(); i != constantValueForOriginalPort.end(); ++i)
293 VuoPort *oldInputPort = (*i).first;
294 VuoPort *newInputPort = updatedPortForOriginalPort[oldInputPort];
295 if (valueShouldCarryOver(oldInputPort, newInputPort))
301 for (set<VuoCable *>::iterator i = outgoingCables.begin(); i != outgoingCables.end(); ++i)
304 updatedPortForOriginalPort[originalFromPortForCable[*i] ],
305 updatedPortForOriginalPort[originalToPortForCable[*i] ],
307 preserveDanglingCables);
310 for (set<VuoCable *>::iterator i = incomingCables.begin(); i != incomingCables.end(); ++i)
313 updatedPortForOriginalPort[originalFromPortForCable[*i] ],
314 updatedPortForOriginalPort[originalToPortForCable[*i] ],
316 preserveDanglingCables);
320 for (vector<pair<VuoPort *, VuoPublishedPort *> >::iterator i = revertedPublishedInternalExternalPortCombinations.begin(); i != revertedPublishedInternalExternalPortCombinations.end(); ++i)
322 if (updatedPortForOriginalPort[(*i).first])
324 bool forceEventOnlyPublication = !publishedConnectionCarriedData[(*i)];
326 updatedPublishedInternalExternalPortCombinations.push_back(make_pair(updatedPortForOriginalPort[(*i).first], updatedExternalPublishedPort));
327 publishedConnectionCarriedData[make_pair(updatedPortForOriginalPort[(*i).first], updatedExternalPublishedPort)] = publishedConnectionCarriedData[(*i)];
332 for (vector<VuoRendererNode *>::iterator i = collapsedTypecasts.begin(); i != collapsedTypecasts.end(); ++i)
334 if (updatedPortForOriginalPort[hostPortForTypecast[*i] ])
335 composition->collapseTypecastNode(*i);
339 composition->removeNode(*i);
340 foreach (
VuoCable *cable, incomingCablesForTypecast[*i])
343 for (vector<pair<VuoPort *, VuoPublishedPort *> >::iterator j = publishedInternalExternalPortCombinationsForTypecast[*i].begin(); j != publishedInternalExternalPortCombinationsForTypecast[*i].end(); ++j)
345 bool unpublishIsolatedExternalPort =
false;
352 composition->collapseTypecastNode(newNode);
368 void VuoCommandReplaceNode::SingleNodeReplacement::createPortMappings()
370 for (set<VuoCable *>::iterator i = incomingCables.begin(); i != incomingCables.end(); ++i)
374 originalFromPortForCable[cable] = cable->
getFromPort();
375 originalToPortForCable[cable] = cable->
getToPort();
378 updatedPortForOriginalPort[cable->
getToPort()] = getEquivalentInputPortInNewNode(cable->
getToPort(), oldNode, newNode);
381 for (set<VuoCable *>::iterator i = outgoingCables.begin(); i != outgoingCables.end(); ++i)
385 originalFromPortForCable[cable] = cable->
getFromPort();
386 originalToPortForCable[cable] = cable->
getToPort();
393 updatedPortForOriginalPort[originalInputPort] = getEquivalentInputPortInNewNode(originalInputPort, oldNode, newNode);
407 if (!replacingDictionaryKeyList && !replacingDictionaryValueList)
409 else if (replacingDictionaryKeyList)
416 if (!oldKeyInputCompilerPort || !oldKeyInputCompilerPort->
getData())
424 if (!newKeyInputPort)
427 return newKeyInputPort->
getBase();
430 else if (replacingDictionaryValueList)
437 if (!(oldKeyList && newKeyList))
440 vector<VuoPort *> oldKeyListInputs = oldKeyList->
getInputPorts();
442 VuoPort *oldKeyInputPort = NULL;
445 if (oldValueListInputs[i] == oldInputPort)
446 oldKeyInputPort = oldKeyListInputs[i];
449 if (!oldKeyInputPort)
455 vector<VuoPort *> newKeyListInputs = newKeyList->
getInputPorts();
457 VuoPort *newValueInputPort = NULL;
462 return newValueListInputs[i];
474 bool VuoCommandReplaceNode::SingleNodeReplacement::valueShouldCarryOver(
VuoPort *oldInputPort,
VuoPort *newInputPort)
476 if (resetConstantValues)
479 if (!(oldInputPort && newInputPort))
484 if (isOldPortGeneric || isNewPortGeneric)