Skip to content

Qtfred sexp tree refactor#7301

Open
MjnMixael wants to merge 63 commits intoscp-fs2open:masterfrom
MjnMixael:qtfred-sexp-tree-refactor
Open

Qtfred sexp tree refactor#7301
MjnMixael wants to merge 63 commits intoscp-fs2open:masterfrom
MjnMixael:qtfred-sexp-tree-refactor

Conversation

@MjnMixael
Copy link
Copy Markdown
Contributor

This is the long-promised sexp_tree refactor. The main goal was to move all logic out of FRED's sexp_tree.cpp into a model that could be shared between both FRED and QtFRED. This would not only simplify how much duplicate maintenance we have to do but would also open up sexp editing to new kinds of UIs layered on top (such as the graph editor as requested in #4809 .

The model ended up being split into 4 files: the main sexp tree model, an actions helper, an OPF helper, and an Event Annotations model. While reviewing it may be helpful to start with the main model, then actions and opf, then events. Then with that knowledge take a look at the old sexp_tree files (renamed to sexp_tree_view).

I'm making builds of FRED available to mission designers for testing as well while the review process gets under way.

Because of how intertwined the logic and UI was in sexp_tree I did not see an easy way to split this up into manageable pieces. I'm so sorry.

Fixes #6982

@MjnMixael MjnMixael added this to the Release 26.0 milestone Mar 20, 2026
@MjnMixael MjnMixael added the qtfred A feature or issue related to qtFred. label Mar 20, 2026
@github-project-automation github-project-automation bot moved this to Work In Progress (PRs) in qtFRED2 Mar 20, 2026
@MjnMixael MjnMixael mentioned this pull request Mar 20, 2026
@MjnMixael MjnMixael force-pushed the qtfred-sexp-tree-refactor branch from 82e332d to ec76cc1 Compare March 24, 2026 05:21
@wookieejedi
Copy link
Copy Markdown
Member

Does adding comments to nodes, then deleting and readding nodes result in comments being incorrectly placed?

More specifically, with this update it looks like sexp_tree_actions.cpp and sexp_tree_model.cpp use the function allocate_node() to search for SEXPT_UNUSED slots and reuse them. I think this means that if a node with an active annotation is freed (like if a user deletes a branch), and a new node is later allocated at the same tree_nodes[] slot (same index), the annotation will be incorrect? IE node_index now points to the wrong node b/c saveToGlobal checks tree_nodes[key].type != SEXPT_UNUSED, and this would be true for the new node, so the annotation path would be incorrectly attributed to it.

@MjnMixael
Copy link
Copy Markdown
Contributor Author

MjnMixael commented Mar 31, 2026

Does adding comments to nodes, then deleting and readding nodes result in comments being incorrectly placed?

More specifically, with this update it looks like sexp_tree_actions.cpp and sexp_tree_model.cpp use the function allocate_node() to search for SEXPT_UNUSED slots and reuse them. I think this means that if a node with an active annotation is freed (like if a user deletes a branch), and a new node is later allocated at the same tree_nodes[] slot (same index), the annotation will be incorrect? IE node_index now points to the wrong node b/c saveToGlobal checks tree_nodes[key].type != SEXPT_UNUSED, and this would be true for the new node, so the annotation path would be incorrectly attributed to it.

Good catch. I have committed a fix for this so that free_node2() will now clear annotations if we're using a version of the model that's annotations-enabled.

@MjnMixael MjnMixael force-pushed the qtfred-sexp-tree-refactor branch 2 times, most recently from b9312b9 to ab5363a Compare April 3, 2026 18:30
@MjnMixael MjnMixael force-pushed the qtfred-sexp-tree-refactor branch from ab5363a to 7b91af1 Compare April 4, 2026 15:12
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

qtfred A feature or issue related to qtFred.

Projects

Status: Work In Progress (PRs)

Development

Successfully merging this pull request may close these issues.

QtFRED Sexp_tree widget needs refactoring

2 participants