diff --git a/tools/fm-editor/FeatureModelEditor.cpp b/tools/fm-editor/FeatureModelEditor.cpp index bbbe5a84..6597b87f 100644 --- a/tools/fm-editor/FeatureModelEditor.cpp +++ b/tools/fm-editor/FeatureModelEditor.cpp @@ -55,8 +55,7 @@ void FeatureModelEditor::loadFeatureFromSelection( if (Index.isValid()) { auto *Item = static_cast(Index.internalPointer()) ->child(Index.row()); - if (Item->getKind() == - vara::feature::FeatureTreeNode::NodeKind::NK_FEATURE) { + if (Item->getKind() == ItemKind::IK_Feature) { loadFeature(dynamic_cast(Item)->getFeature()); } } diff --git a/tools/fm-editor/tree/FeatureTreeItem.cpp b/tools/fm-editor/tree/FeatureTreeItem.cpp index f0be10b0..c3c0cc59 100644 --- a/tools/fm-editor/tree/FeatureTreeItem.cpp +++ b/tools/fm-editor/tree/FeatureTreeItem.cpp @@ -60,9 +60,7 @@ FeatureTreeItem::createFeatureTreeItem(vara::feature::FeatureTreeNode *Item) { } void FeatureTreeItem::addChild(FeatureTreeItem *Child) { - if (!Children.empty() && - Children[0]->getKind() == - vara::feature::FeatureTreeNode::NodeKind::NK_RELATIONSHIP) { + if (!Children.empty() && Children[0]->getKind() == ItemKind::IK_Relation) { Children[0]->addChild(Child); } else { Children.push_back(Child); diff --git a/tools/fm-editor/tree/FeatureTreeItem.h b/tools/fm-editor/tree/FeatureTreeItem.h index 182060da..344e65c7 100644 --- a/tools/fm-editor/tree/FeatureTreeItem.h +++ b/tools/fm-editor/tree/FeatureTreeItem.h @@ -12,6 +12,13 @@ #include +enum ItemKind { + IK_Feature, + IK_Relation, + IK_Root + +}; + class FeatureTreeItem : public QObject { Q_OBJECT @@ -48,10 +55,10 @@ class FeatureTreeItem : public QObject { [[nodiscard]] virtual QVariant data(int Column) const = 0; std::unique_ptr static createFeatureTreeItem( vara::feature::FeatureTreeNode *Item); - bool booleanColumn(int Column) { return false; } + bool booleanColumn(int Column) { return false; }; virtual void contextMenu(QPoint Pos) = 0; virtual vara::feature::FeatureTreeNode *getItem() const = 0; - vara::feature::FeatureTreeNode::NodeKind getKind() { return Kind; } + virtual ItemKind getKind() = 0; virtual string getName() { return ""; }; void setParent(FeatureTreeItem *ParentItem) { this->Parent = ParentItem; } @@ -61,14 +68,25 @@ class FeatureTreeItem : public QObject { void removeFeature(bool Recursive, vara::feature::Feature *Feature); protected: - FeatureTreeItem(vara::feature::FeatureTreeNode::NodeKind Kind) : Kind(Kind) {} + FeatureTreeItem() = default; FeatureTreeItem *Parent = nullptr; std::vector Children = {}; +}; -private: - const vara::feature::FeatureTreeNode::NodeKind Kind; +class FeatureTreeItemRoot : public FeatureTreeItem { + Q_OBJECT + +public: + FeatureTreeItemRoot(){}; + [[nodiscard]] int columnCount() const override { return 5; }; + [[nodiscard]] QVariant data(int Column) const override { return {}; }; + void contextMenu(QPoint Pos) override{}; + [[nodiscard]] vara::feature::FeatureTreeNode *getItem() const override { + return nullptr; + }; + ItemKind getKind() override { return IK_Root; }; }; class FeatureTreeItemFeature : public FeatureTreeItem { @@ -76,8 +94,7 @@ class FeatureTreeItemFeature : public FeatureTreeItem { public: FeatureTreeItemFeature(vara::feature::Feature *Item) - : FeatureTreeItem(vara::feature::FeatureTreeNode::NodeKind::NK_FEATURE), - Item(Item) { + : FeatureTreeItem(), Item(Item) { ContextMenu = std::make_unique(); ContextMenu->addAction("Inspect Sources", this, &FeatureTreeItemFeature::inspect); @@ -87,16 +104,20 @@ class FeatureTreeItemFeature : public FeatureTreeItem { connect(RemoveAction.get(), &QAction::triggered, this, &FeatureTreeItemFeature::remove, Qt::QueuedConnection); } - virtual ~FeatureTreeItemFeature() = default; + ~FeatureTreeItemFeature() override = default; [[nodiscard]] QVariant data(int Column) const override; [[nodiscard]] int columnCount() const override { return 5; } bool booleanColumn(int Column) { return Column == 1; } void contextMenu(QPoint Pos) override; - vara::feature::FeatureTreeNode *getItem() const override { return Item; } - const vara::feature::Feature *getFeature() const { return Item; } + [[nodiscard]] vara::feature::FeatureTreeNode *getItem() const override { + return Item; + } + [[nodiscard]] const vara::feature::Feature *getFeature() const { + return Item; + } string getName() override { return Item->getName().str(); } - + ItemKind getKind() override { return IK_Feature; } public slots: void inspect(); void addChild(); @@ -110,10 +131,7 @@ public slots: class FeatureTreeItemRelation : public FeatureTreeItem { public: - FeatureTreeItemRelation(vara::feature::Relationship *Item) - : FeatureTreeItem( - vara::feature::FeatureTreeNode::NodeKind::NK_RELATIONSHIP), - Item(Item) {} + FeatureTreeItemRelation(vara::feature::Relationship *Item) : Item(Item){}; ~FeatureTreeItemRelation() override = default; [[nodiscard]] QVariant data(int Column) const override { @@ -124,13 +142,13 @@ class FeatureTreeItemRelation : public FeatureTreeItem { } [[nodiscard]] int columnCount() const override { return 1; } void contextMenu(QPoint Pos) override {} - vara::feature::FeatureTreeNode *getItem() const override { return Item; } + [[nodiscard]] vara::feature::FeatureTreeNode *getItem() const override { + return Item; + } + ItemKind getKind() override { return IK_Relation; } private: vara::feature::Relationship *Item; - static const vara::feature::FeatureTreeNode::NodeKind Kind = - vara::feature::FeatureTreeNode::NodeKind::NK_RELATIONSHIP; - [[nodiscard]] std::string relationType() const { std::string Type; switch (Item->getKind()) { diff --git a/tools/fm-editor/tree/FeatureTreeViewModel.h b/tools/fm-editor/tree/FeatureTreeViewModel.h index a6071f3d..00ae1acc 100644 --- a/tools/fm-editor/tree/FeatureTreeViewModel.h +++ b/tools/fm-editor/tree/FeatureTreeViewModel.h @@ -11,7 +11,7 @@ class FeatureTreeViewModel : public QAbstractItemModel { FeatureTreeViewModel(vara::feature::FeatureModel *Model, QObject *Parent) : QAbstractItemModel(Parent) { auto UniqueRoot = FeatureTreeItem::createFeatureTreeItem(Model->getRoot()); - RootItem = new FeatureTreeItemFeature(nullptr); + RootItem = new FeatureTreeItemRoot(); RootItem->addChild(UniqueRoot.get()); auto RawRoot = UniqueRoot.get(); Items.push_back(std::move(UniqueRoot));