void ViewerNode::refreshInputFromChoiceMenu(int internalInputIdx) { assert(internalInputIdx == 0 || internalInputIdx == 1); // Get the "Input" nodes std::vector<NodePtr> groupInputNodes; getInputs(&groupInputNodes); KnobChoicePtr knob = internalInputIdx == 0 ? _imp->aInputNodeChoiceKnob.lock() : _imp->bInputNodeChoiceKnob.lock(); // Read from the choice menu the current selected node ChoiceOption curLabel = internalInputIdx == 0 ? _imp->aInputNodeChoiceKnob.lock()->getCurrentEntry() : _imp->bInputNodeChoiceKnob.lock()->getCurrentEntry(); // Find recursively the node that we should connect to the "Input" node NodePtr nodeToConnect = _imp->getInputRecursive(internalInputIdx); if (curLabel.id == "-") { if (nodeToConnect->getEffectInstance().get() == this) { nodeToConnect->disconnectInput(internalInputIdx); } else { int prefInput = nodeToConnect->getPreferredInput(); if (prefInput != -1) { nodeToConnect->disconnectInput(prefInput); } } } else { int groupInputIndex = QString::fromUtf8(curLabel.id.c_str()).toInt(); if (groupInputIndex < (int)groupInputNodes.size() && groupInputIndex >= 0) { if (nodeToConnect == _imp->internalViewerProcessNode[internalInputIdx].lock()) { nodeToConnect->swapInput(groupInputNodes[groupInputIndex], 0); } else { int prefInput = nodeToConnect->getPreferredInputForConnection(); if (prefInput != -1) { nodeToConnect->swapInput(groupInputNodes[groupInputIndex], prefInput); } } } } } // refreshInputFromChoiceMenu
void ViewerNode::connectInputToIndex(int groupInputIndex, int internalInputIndex) { // We want to connect the node upstream of the internal viewer process node (or this node if there's nothing else upstream) // to the appropriate GroupInput node inside the group NodePtr internalNodeToConnect = _imp->getInputRecursive(internalInputIndex); assert(internalNodeToConnect); std::vector<NodePtr> inputNodes; getInputs(&inputNodes); if (groupInputIndex >= (int)inputNodes.size() || groupInputIndex < 0) { // Invalid input index return; } // This is the GroupInput node inside the group to connect to NodePtr groupInput = inputNodes[groupInputIndex]; // Update the input choice _imp->refreshInputChoiceMenu(internalInputIndex, groupInputIndex); // Connect the node recursive upstream of the internal viewer process to the corresponding GroupInput node if (internalNodeToConnect == _imp->internalViewerProcessNode[internalInputIndex].lock()) { internalNodeToConnect->disconnectInput(0); internalNodeToConnect->connectInput(groupInput, 0); } else { int prefInput = internalNodeToConnect->getPreferredInputForConnection(); if (prefInput == -1) { // Preferred input might be connected, disconnect it first prefInput = internalNodeToConnect->getPreferredInput(); if (prefInput != -1) { internalNodeToConnect->disconnectInput(prefInput); } internalNodeToConnect->connectInput(groupInput, prefInput); } } }
void JoinViewsNode::onMetadataChanged(const NodeMetadata& metadata) { NodePtr node = getNode(); std::size_t nInputs, oldNInputs; const std::vector<std::string>& views = getApp()->getProject()->getProjectViewNames(); //Reverse names oldNInputs = getNInputs(); nInputs = views.size(); std::vector<NodePtr> inputs(oldNInputs); for (std::size_t i = 0; i < oldNInputs; ++i) { inputs[i] = node->getInput(i); } node->beginInputEdition(); node->removeAllInputs(); for (std::size_t i = 0; i < nInputs; ++i) { const std::string& inputName = views[nInputs - 1 - i]; InputDescriptionPtr desc = InputDescription::create(inputName, inputName, "", false, false, std::bitset<4>(std::string("1111"))); node->addInput(desc); } //Reconnect the inputs int index = oldNInputs - 1; if (index >= 0) { for (int i = (int)nInputs - 1; i >= 0; --i, --index) { node->disconnectInput(i); if (index >= 0) { if (inputs[index]) { node->connectInput(inputs[index], i); } } } } node->endInputEdition(true); EffectInstance::onMetadataChanged(metadata); }