diff --git a/src/gui/GraphEditorWidget.cpp b/src/gui/GraphEditorWidget.cpp index 57f4505..42d7037 100644 --- a/src/gui/GraphEditorWidget.cpp +++ b/src/gui/GraphEditorWidget.cpp @@ -719,18 +719,60 @@ void GraphEditorWidget::onConnectionCreated(QtNodes::ConnectionId const connecti } if (connectionId.outPortIndex >= static_cast(outInfo->outputPorts.size())) { + qWarning() << "Output port index out of bounds:" << connectionId.outPortIndex << ">=" << outInfo->outputPorts.size(); + m_model->deleteConnection(connectionId); return; } if (connectionId.inPortIndex >= static_cast(inInfo->inputPorts.size())) { + qWarning() << "Input port index out of bounds:" << connectionId.inPortIndex << ">=" << inInfo->inputPorts.size(); + m_model->deleteConnection(connectionId); return; } const uint32_t outputPortId = outInfo->outputPorts.at(connectionId.outPortIndex).id; const uint32_t inputPortId = inInfo->inputPorts.at(connectionId.inPortIndex).id; + const Potato::NodeInfo freshOutInfo = m_controller->nodeById(outInfo->id); + const Potato::NodeInfo freshInInfo = m_controller->nodeById(inInfo->id); + + if (!freshOutInfo.isValid() || !freshInInfo.isValid()) { + qWarning() << "Node no longer exists in PipeWire"; + m_model->deleteConnection(connectionId); + return; + } + + bool outputPortExists = false; + for (const auto &port : freshOutInfo.outputPorts) { + if (port.id == outputPortId) { + outputPortExists = true; + break; + } + } + + bool inputPortExists = false; + for (const auto &port : freshInInfo.inputPorts) { + if (port.id == inputPortId) { + inputPortExists = true; + break; + } + } + + if (!outputPortExists) { + qWarning() << "Output port" << outputPortId << "does not exist in PipeWire node" << outInfo->id; + m_model->deleteConnection(connectionId); + return; + } + + if (!inputPortExists) { + qWarning() << "Input port" << inputPortId << "does not exist in PipeWire node" << inInfo->id; + m_model->deleteConnection(connectionId); + return; + } + const uint32_t linkId = m_controller->createLink(outInfo->id, outputPortId, inInfo->id, inputPortId); if (linkId == 0) { + qWarning() << "Failed to create link between" << outInfo->id << ":" << outputPortId << "->" << inInfo->id << ":" << inputPortId; m_model->deleteConnection(connectionId); return; }