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; PositionFound pos = findGroupPosition(groupId);
group->setUiName(displayName); 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& displayName,
const QString& groupKeyword) 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); group->setKeyword(groupKeyword);
return group; return group;
@ -115,20 +194,20 @@ caf::PdmUiGroup* PdmUiOrdering::insertNewGroupWithKeyword(size_t index,
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
bool PdmUiOrdering::contains(const PdmUiItem* item) const 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) 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] == item) return { const_cast<PdmUiOrdering*>(this), i};
if (m_ordering[i] && m_ordering[i]->isUiGroup()) 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; 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) for (size_t i = 0; i < m_ordering.size(); ++i)
{ {
if (m_ordering[i] && m_ordering[i]->isUiGroup()) if (m_ordering[i] && m_ordering[i]->isUiGroup())
{ {
if (static_cast<PdmUiGroup*>(m_ordering[i])->keyword() == groupKeyword) return { const_cast<PdmUiOrdering*>(this), i}; 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; 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 ) if ( parent )
{ {
@ -232,7 +311,7 @@ caf::PdmUiItem* PdmUiOrdering::FindResult::item()
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
/// ///
//-------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------------------------------
caf::PdmUiGroup* PdmUiOrdering::FindResult::group() caf::PdmUiGroup* PdmUiOrdering::PositionFound::group()
{ {
PdmUiItem* g = item(); PdmUiItem* g = item();
if ( g && g->isUiGroup() ) if ( g && g->isUiGroup() )

View File

@ -62,24 +62,19 @@ public:
PdmUiOrdering& operator=(const PdmUiOrdering&) = delete; PdmUiOrdering& operator=(const PdmUiOrdering&) = delete;
void add(const PdmFieldHandle* field); void add(const PdmFieldHandle* field);
void insert(size_t index, const PdmFieldHandle* field);
void add(const PdmObjectHandle* obj); 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* 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* addNewGroupWithKeyword(const QString& displayName, const QString& groupKeyword);
PdmUiGroup* insertNewGroup(size_t index, const QString& displayName); PdmUiGroup* createGroupWithIdBeforeGroup(const QString& groupId, const QString& displayName, const QString& newGroupId);
PdmUiGroup* insertNewGroupWithKeyword(size_t index, const QString& displayName, const QString& groupKeyword); PdmUiGroup* createGroupWithIdBeforeItem(const PdmUiItem* item, const QString& displayName, const QString& newGroupId);
struct FindResult PdmUiGroup* findGroup(const QString& groupId);
{
PdmUiOrdering* parent;
size_t indexInParent;
PdmUiItem* item();
PdmUiGroup* group();
};
FindResult findGroup(const QString& groupKeyword) const;
FindResult findItem(const PdmUiItem* item) const;
void skipRemainingFields(bool doSkip = true); void skipRemainingFields(bool doSkip = true);
@ -89,7 +84,23 @@ public:
bool contains(const PdmUiItem* item) const; bool contains(const PdmUiItem* item) const;
bool isIncludingRemainingFields() 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: 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<PdmUiItem*> m_ordering; ///< The order of groups and fields
std::vector<PdmUiGroup*> m_createdGroups; ///< Owned PdmUiGroups, for memory management only std::vector<PdmUiGroup*> m_createdGroups; ///< Owned PdmUiGroups, for memory management only
bool m_skipRemainingFields; bool m_skipRemainingFields;