[LOW] The 'program' path is a placeholder. This should be updated to point to the actual build output or a configurable variable to make it usable out-of-the-box.
[HIGH] The header for PropertyWindow is not included, which is required for its use in onProperties().
[HIGH] This line adds the 'Add Node' menu a second time. The preceding addMenu("Add Node") already adds it and returns it. This line should be removed.
[MEDIUM] PropertyWindow is allocated with new but is not deleted, which will cause a memory leak. Consider setting the Qt::WA_DeleteOnClose attribute on the window to have it delete itself upon closing.
[HIGH] Inheritance from QObject must be public for the meta-object system (signals, slots, etc.) to function correctly. Change class Document : QObject to class Document : public QObject.
[MEDIUM] The static activeDocument() method introduces global state, which can complicate testing and future extensions (e.g., multi-document support). Consider using dependency injection instead of a static accessor.
[LOW] The lambda functions in the m_node_factories map are repetitive. To improve maintainability, consider creating a template helper function to generate these factories and reduce boilerplate code.
[LOW] Consider adding a newline at the end of the file for POSIX compatibility and better diff handling.
[LOW] The call to m_label->clear() is redundant as m_label->setText() replaces the existing content. This line can be removed.
[MEDIUM] This qDebug() statement appears to be for debugging and should be removed from production code.
[LOW] For an empty virtual destructor, prefer = default over an empty body {} to be more expressive and align with modern C++ practices.
See comment for Line 35 regarding potential redundancy between name and properties.label.
For glm::vec2 initial value, glm::vec2(0.0f, 0.0f) or glm::vec2{0.0f, 0.0f} could be slightly more explicit than glm::vec2(0.0f), even though the latter correctly zero-initializes all components.
See comment for Line 35 regarding potential redundancy between name and properties.label.
See comment for Line 35 regarding potential redundancy between name and properties.label.
See comment for Line 35 regarding potential redundancy between name and properties.label.
The LineEditProperties struct currently only contains std::string label;. If this struct isn't intended to grow significantly, consider if passing label directly to constructors might be simpler.