#ifndef TREEBUILDER_H #define TREEBUILDER_H #include "dslkeys.h" #include #include #include #include class XTreeWidget; class XTreeWidgetItem; class TypeRegistry; class TreeBuilder { public: TreeBuilder() : m_tree(nullptr), m_registry(nullptr) {} TreeBuilder(XTreeWidget* tree, const TypeRegistry& registry); // Build tree from parsed data void addParsedFile(const QString& typeName, const QVariantMap& vars, const QString& fileName); // Category management XTreeWidgetItem* ensureTypeCategoryRoot(const QString& typeName, const QString& displayOverride = {}); XTreeWidgetItem* ensureSubcategory(XTreeWidgetItem* parent, const QString& childTypeName); // Instance management XTreeWidgetItem* addInstanceNode(XTreeWidgetItem* parent, const QString& displayName, const QString& typeName, const QVariantMap& vars); // Recursively route nested objects into tree void routeNestedObjects(XTreeWidgetItem* parent, const QVariantMap& vars); // Post-processing void organizeChildrenByExtension(XTreeWidgetItem* parent); void updateNodeCounts(XTreeWidgetItem* node); // Utilities QString pluralizeType(const QString& typeName) const; static QString instanceDisplayFor(const QVariantMap& obj, const QString& fallbackType, const QString& fallbackKey = {}, std::optional index = std::nullopt); // Clear all category roots void reset(); private: XTreeWidget* m_tree; const TypeRegistry* m_registry; QHash m_categoryRoots; }; #endif // TREEBUILDER_H