fix: node graph edge display, teardown crashes, and event/audio lifetime bugs
- capi: oakengine_node_output_connection_at/_at_ex returned the source node as the connection destination; the actual destination is conn.second.node(). Out-edge enumeration was useless, so the node view could only draw in-edges and randomly lost whichever edges needed the out-edge path (random per context build order). Regression test in oakengine_node_test - project teardown: Project::clear() pre-notifies node removal while nodes are fully constructed (observers used to crash on half-destroyed nodes); childEvent suppresses the removal dance while clearing; Node::disconnect_all/disconnect_edge get a silent mode for teardown so no invalidation/events touch dying members (is_being_cleared); ClipBlock marker disconnect guarded against dead viewer/markers; ProjectCopier and PreviewAutoCacher drop project references on Project::destroyed instead of disconnecting dead objects at shutdown - preview: add oakengine_preview_request_get_audio_sample_count; the viewer queried sample count by passing nullptr to get_audio_samples which rejects it, so all playback audio was silently dropped - app: fix unterminated input-id memcpy in ResolveGroupInput (nodeparamviewitem, widgetbridge) that corrupted every parameter id - app: unsubscribe raw C-API event subscriptions in destructors of NodeParamViewKeyframeControl, NodeParamViewConnectedLabel and ExportDialog; playhead events used to fire into dead widgets (crash when dragging the playhead) - tests: preview request roundtrip (video frame + audio range) and free-while-active teardown coverage; env-gated OAK_DEBUG_EDGES / OAK_DEBUG_INVALID_INPUT diagnostics - docs: investigation notes in docs/zh/
This commit is contained in:
@@ -134,6 +134,12 @@ NodeEdgeAddCommand::~NodeEdgeAddCommand()
|
||||
|
||||
void NodeEdgeAddCommand::redo()
|
||||
{
|
||||
if (qEnvironmentVariableIsSet("OAK_DEBUG_EDGES")) {
|
||||
qWarning("EDGE-DEBUG: NodeEdgeAddCommand::redo %p -> %p (%s)",
|
||||
(void *)output_, (void *)input_.node(),
|
||||
qPrintable(input_.input()));
|
||||
}
|
||||
|
||||
if (input_.is_connected()) {
|
||||
if (!remove_command_) {
|
||||
remove_command_ =
|
||||
@@ -148,6 +154,12 @@ void NodeEdgeAddCommand::redo()
|
||||
|
||||
void NodeEdgeAddCommand::undo()
|
||||
{
|
||||
if (qEnvironmentVariableIsSet("OAK_DEBUG_EDGES")) {
|
||||
qWarning("EDGE-DEBUG: NodeEdgeAddCommand::undo %p -> %p (%s)",
|
||||
(void *)output_, (void *)input_.node(),
|
||||
qPrintable(input_.input()));
|
||||
}
|
||||
|
||||
Node::disconnect_edge(output_, input_);
|
||||
|
||||
if (remove_command_) {
|
||||
@@ -169,11 +181,23 @@ NodeEdgeRemoveCommand::NodeEdgeRemoveCommand(Node *output,
|
||||
|
||||
void NodeEdgeRemoveCommand::redo()
|
||||
{
|
||||
if (qEnvironmentVariableIsSet("OAK_DEBUG_EDGES")) {
|
||||
qWarning("EDGE-DEBUG: NodeEdgeRemoveCommand::redo %p -> %p (%s)",
|
||||
(void *)output_, (void *)input_.node(),
|
||||
qPrintable(input_.input()));
|
||||
}
|
||||
|
||||
Node::disconnect_edge(output_, input_);
|
||||
}
|
||||
|
||||
void NodeEdgeRemoveCommand::undo()
|
||||
{
|
||||
if (qEnvironmentVariableIsSet("OAK_DEBUG_EDGES")) {
|
||||
qWarning("EDGE-DEBUG: NodeEdgeRemoveCommand::undo %p -> %p (%s)",
|
||||
(void *)output_, (void *)input_.node(),
|
||||
qPrintable(input_.input()));
|
||||
}
|
||||
|
||||
Node::connect_edge(output_, input_);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user