AppFwk: Change interface of uiOrder insertion to direct insert

Instead of find + insert
This commit is contained in:
Jacob Støren 2018-06-22 17:15:52 +02:00
parent 73a52c4929
commit ad709d76a2
2 changed files with 117 additions and 27 deletions

View File

@ -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<PdmUiOrdering*>(this), i};
if (m_ordering[i] && m_ordering[i]->isUiGroup())
{
FindResult result = static_cast<PdmUiGroup*>(m_ordering[i])->findItem(item);
PositionFound result = static_cast<PdmUiGroup*>(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<PdmUiGroup*>(m_ordering[i])->keyword() == groupKeyword) return { const_cast<PdmUiOrdering*>(this), i};
FindResult result = static_cast<PdmUiGroup*>(m_ordering[i])->findGroup(groupKeyword);
PositionFound result = static_cast<PdmUiGroup*>(m_ordering[i])->findGroupPosition(groupKeyword);
if (result.parent ) return result;
}
}
@ -217,7 +296,7 @@ const std::vector<PdmUiItem*>& 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() )

View File

@ -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<PdmUiItem*> m_ordering; ///< The order of groups and fields
std::vector<PdmUiGroup*> m_createdGroups; ///< Owned PdmUiGroups, for memory management only
bool m_skipRemainingFields;