From ad709d76a22d7360b579c2453e01f8be08ad1c01 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jacob=20St=C3=B8ren?= Date: Fri, 22 Jun 2018 17:15:52 +0200 Subject: [PATCH] AppFwk: Change interface of uiOrder insertion to direct insert Instead of find + insert --- .../cafPdmUiCore/cafPdmUiOrdering.cpp | 107 +++++++++++++++--- .../cafPdmUiCore/cafPdmUiOrdering.h | 37 +++--- 2 files changed, 117 insertions(+), 27 deletions(-) diff --git a/Fwk/AppFwk/cafProjectDataModel/cafPdmUiCore/cafPdmUiOrdering.cpp b/Fwk/AppFwk/cafProjectDataModel/cafPdmUiCore/cafPdmUiOrdering.cpp index 10483d2a87..ce28cbab19 100644 --- a/Fwk/AppFwk/cafProjectDataModel/cafPdmUiCore/cafPdmUiOrdering.cpp +++ b/Fwk/AppFwk/cafProjectDataModel/cafPdmUiCore/cafPdmUiOrdering.cpp @@ -86,15 +86,88 @@ caf::PdmUiGroup* PdmUiOrdering::addNewGroupWithKeyword(const QString& displayNam //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -caf::PdmUiGroup* PdmUiOrdering::insertNewGroup(size_t index, const QString& displayName) +bool PdmUiOrdering::insertBeforeGroup(const QString& groupId, const PdmFieldHandle* field) { - PdmUiGroup* group = new PdmUiGroup; - group->setUiName(displayName); + PositionFound pos = findGroupPosition(groupId); + if (pos.parent) + { + pos.parent->insert(pos.indexInParent, field); + return true; + } + else + { + return false; + } +} - m_createdGroups.push_back(group); - m_ordering.insert(m_ordering.begin() + index, group); - return group; +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +bool PdmUiOrdering::insertBeforeItem(const PdmUiItem* item, const PdmFieldHandle* field) +{ + PositionFound pos = findItemPosition(item); + if (pos.parent) + { + pos.parent->insert(pos.indexInParent, field); + return true; + } + else + { + return false; + } +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +caf::PdmUiGroup* PdmUiOrdering::createGroupBeforeGroup(const QString& groupId, const QString& displayName) +{ + return createGroupWithIdBeforeGroup(groupId, displayName, ""); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +caf::PdmUiGroup* PdmUiOrdering::createGroupBeforeItem(const PdmUiItem* item, const QString& displayName) +{ + return createGroupWithIdBeforeItem(item, displayName, ""); +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +caf::PdmUiGroup* PdmUiOrdering::createGroupWithIdBeforeGroup(const QString& groupId, const QString& displayName, const QString& newGroupId) +{ + PositionFound pos = findGroupPosition(groupId); + if (pos.parent) + { + return pos.parent->insertNewGroupWithKeyword(pos.indexInParent, displayName, newGroupId); + } + + return nullptr; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +caf::PdmUiGroup* PdmUiOrdering::createGroupWithIdBeforeItem(const PdmUiItem* item, const QString& displayName, const QString& newGroupId) +{ + PositionFound pos = findItemPosition(item); + if (pos.parent) + { + return pos.parent->insertNewGroupWithKeyword(pos.indexInParent, displayName, newGroupId); + } + + return nullptr; +} + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +caf::PdmUiGroup* PdmUiOrdering::findGroup(const QString& groupId) +{ + return findGroupPosition(groupId).group(); } //-------------------------------------------------------------------------------------------------- @@ -104,7 +177,13 @@ caf::PdmUiGroup* PdmUiOrdering::insertNewGroupWithKeyword(size_t index, const QString& displayName, const QString& groupKeyword) { - PdmUiGroup* group = insertNewGroup(index, displayName); + PdmUiGroup* group = new PdmUiGroup; + group->setUiName(displayName); + + m_createdGroups.push_back(group); + + m_ordering.insert(m_ordering.begin() + index, group); + group->setKeyword(groupKeyword); return group; @@ -115,20 +194,20 @@ caf::PdmUiGroup* PdmUiOrdering::insertNewGroupWithKeyword(size_t index, //-------------------------------------------------------------------------------------------------- bool PdmUiOrdering::contains(const PdmUiItem* item) const { - return this->findItem(item).parent != nullptr; + return this->findItemPosition(item).parent != nullptr; } //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -caf::PdmUiOrdering::FindResult PdmUiOrdering::findItem(const PdmUiItem* item) const +caf::PdmUiOrdering::PositionFound PdmUiOrdering::findItemPosition(const PdmUiItem* item) const { for (size_t i = 0; i < m_ordering.size(); ++i) { if (m_ordering[i] == item) return { const_cast(this), i}; if (m_ordering[i] && m_ordering[i]->isUiGroup()) { - FindResult result = static_cast(m_ordering[i])->findItem(item); + PositionFound result = static_cast(m_ordering[i])->findItemPosition(item); if (result.parent ) return result; } } @@ -138,14 +217,14 @@ caf::PdmUiOrdering::FindResult PdmUiOrdering::findItem(const PdmUiItem* item) co //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -caf::PdmUiOrdering::FindResult PdmUiOrdering::findGroup(const QString& groupKeyword) const +caf::PdmUiOrdering::PositionFound PdmUiOrdering::findGroupPosition(const QString& groupKeyword) const { for (size_t i = 0; i < m_ordering.size(); ++i) { if (m_ordering[i] && m_ordering[i]->isUiGroup()) { if (static_cast(m_ordering[i])->keyword() == groupKeyword) return { const_cast(this), i}; - FindResult result = static_cast(m_ordering[i])->findGroup(groupKeyword); + PositionFound result = static_cast(m_ordering[i])->findGroupPosition(groupKeyword); if (result.parent ) return result; } } @@ -217,7 +296,7 @@ const std::vector& PdmUiOrdering::uiItems() const //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -caf::PdmUiItem* PdmUiOrdering::FindResult::item() +caf::PdmUiItem* PdmUiOrdering::PositionFound::item() { if ( parent ) { @@ -232,7 +311,7 @@ caf::PdmUiItem* PdmUiOrdering::FindResult::item() //-------------------------------------------------------------------------------------------------- /// //-------------------------------------------------------------------------------------------------- -caf::PdmUiGroup* PdmUiOrdering::FindResult::group() +caf::PdmUiGroup* PdmUiOrdering::PositionFound::group() { PdmUiItem* g = item(); if ( g && g->isUiGroup() ) diff --git a/Fwk/AppFwk/cafProjectDataModel/cafPdmUiCore/cafPdmUiOrdering.h b/Fwk/AppFwk/cafProjectDataModel/cafPdmUiCore/cafPdmUiOrdering.h index 7a24ae80f3..9658e76666 100644 --- a/Fwk/AppFwk/cafProjectDataModel/cafPdmUiCore/cafPdmUiOrdering.h +++ b/Fwk/AppFwk/cafProjectDataModel/cafPdmUiCore/cafPdmUiOrdering.h @@ -62,24 +62,19 @@ public: PdmUiOrdering& operator=(const PdmUiOrdering&) = delete; void add(const PdmFieldHandle* field); - void insert(size_t index, const PdmFieldHandle* field); void add(const PdmObjectHandle* obj); + bool insertBeforeGroup(const QString& groupId, const PdmFieldHandle* fieldToInsert); + bool insertBeforeItem(const PdmUiItem* item, const PdmFieldHandle* fieldToInsert); PdmUiGroup* addNewGroup(const QString& displayName); + PdmUiGroup* createGroupBeforeGroup(const QString& groupId, const QString& displayName); + PdmUiGroup* createGroupBeforeItem(const PdmUiItem* item, const QString& displayName); + PdmUiGroup* addNewGroupWithKeyword(const QString& displayName, const QString& groupKeyword); - PdmUiGroup* insertNewGroup(size_t index, const QString& displayName); - PdmUiGroup* insertNewGroupWithKeyword(size_t index, const QString& displayName, const QString& groupKeyword); + PdmUiGroup* createGroupWithIdBeforeGroup(const QString& groupId, const QString& displayName, const QString& newGroupId); + PdmUiGroup* createGroupWithIdBeforeItem(const PdmUiItem* item, const QString& displayName, const QString& newGroupId); - struct FindResult - { - PdmUiOrdering* parent; - size_t indexInParent; - PdmUiItem* item(); - PdmUiGroup* group(); - }; - - FindResult findGroup(const QString& groupKeyword) const; - FindResult findItem(const PdmUiItem* item) const; + PdmUiGroup* findGroup(const QString& groupId); void skipRemainingFields(bool doSkip = true); @@ -89,7 +84,23 @@ public: bool contains(const PdmUiItem* item) const; bool isIncludingRemainingFields() const; +protected: + + struct PositionFound + { + PdmUiOrdering* parent; + size_t indexInParent; + PdmUiItem* item(); + PdmUiGroup* group(); + }; + + PositionFound findGroupPosition(const QString& groupKeyword) const; + PositionFound findItemPosition(const PdmUiItem* item) const; + private: + void insert(size_t index, const PdmFieldHandle* field); + PdmUiGroup* insertNewGroupWithKeyword(size_t index, const QString& displayName, const QString& groupKeyword); + std::vector m_ordering; ///< The order of groups and fields std::vector m_createdGroups; ///< Owned PdmUiGroups, for memory management only bool m_skipRemainingFields;