Refactor LayoutOptions to improve readability

* Make it possible to use designated initializer list
- remove default constructor
- move static member to outer scope

* Add helper function to add field on same row
This commit is contained in:
Magne Sjaastad
2023-11-10 14:48:56 +01:00
committed by GitHub
parent 860f086af6
commit 678a368361
30 changed files with 198 additions and 204 deletions

View File

@@ -48,10 +48,10 @@ namespace caf
//--------------------------------------------------------------------------------------------------
PdmUiOrdering::~PdmUiOrdering()
{
for ( size_t i = 0; i < m_createdGroups.size(); ++i )
for ( auto& createdGroup : m_createdGroups )
{
delete m_createdGroups[i];
m_createdGroups[i] = nullptr;
delete createdGroup;
createdGroup = nullptr;
}
}
@@ -60,11 +60,11 @@ PdmUiOrdering::~PdmUiOrdering()
//--------------------------------------------------------------------------------------------------
PdmUiGroup* PdmUiOrdering::addNewGroup( const QString& displayName, LayoutOptions layout )
{
PdmUiGroup* group = new PdmUiGroup;
auto* group = new PdmUiGroup;
group->setUiName( displayName );
m_createdGroups.push_back( group );
m_ordering.push_back( std::make_pair( group, layout ) );
m_ordering.emplace_back( group, layout );
return group;
}
@@ -93,10 +93,8 @@ bool PdmUiOrdering::insertBeforeGroup( const QString& groupId, const PdmFieldHan
pos.parent->insert( pos.indexInParent, field, layout );
return true;
}
else
{
return false;
}
return false;
}
//--------------------------------------------------------------------------------------------------
@@ -110,10 +108,8 @@ bool PdmUiOrdering::insertBeforeItem( const PdmUiItem* item, const PdmFieldHandl
pos.parent->insert( pos.indexInParent, field, layout );
return true;
}
else
{
return false;
}
return false;
}
//--------------------------------------------------------------------------------------------------
@@ -184,7 +180,7 @@ caf::PdmUiGroup* PdmUiOrdering::insertNewGroupWithKeyword( size_t index,
const QString& groupKeyword,
LayoutOptions layout )
{
PdmUiGroup* group = new PdmUiGroup;
auto* group = new PdmUiGroup;
group->setUiName( displayName );
m_createdGroups.push_back( group );
@@ -248,7 +244,7 @@ void PdmUiOrdering::add( const PdmFieldHandle* field, LayoutOptions layout )
CAF_ASSERT( uiItem );
CAF_ASSERT( !this->contains( uiItem ) );
m_ordering.push_back( std::make_pair( uiItem, layout ) );
m_ordering.emplace_back( uiItem, layout );
}
//--------------------------------------------------------------------------------------------------
@@ -259,7 +255,15 @@ void PdmUiOrdering::add( const PdmObjectHandle* obj, LayoutOptions layout )
PdmUiObjectHandle* uiItem = uiObj( const_cast<PdmObjectHandle*>( obj ) );
CAF_ASSERT( uiItem );
CAF_ASSERT( !this->contains( uiItem ) );
m_ordering.push_back( std::make_pair( uiItem, layout ) );
m_ordering.emplace_back( uiItem, layout );
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void PdmUiOrdering::appendToRow( const PdmFieldHandle* field )
{
add( field, { .newRow = false } );
}
//--------------------------------------------------------------------------------------------------
@@ -325,7 +329,7 @@ PdmUiOrdering::TableLayout PdmUiOrdering::calculateTableLayout( const QString& u
if ( m_ordering[i].second.newRow || i == 0u )
{
tableLayout.push_back( RowLayout() );
tableLayout.emplace_back();
}
tableLayout.back().push_back( m_ordering[i] );
}
@@ -370,7 +374,7 @@ int PdmUiOrdering::nrOfExpandingItemsInRow( const RowLayout& rowItems ) const
int nrOfExpandingItems = 0;
for ( const FieldAndLayout& item : rowItems )
{
if ( item.second.totalColumnSpan == LayoutOptions::MAX_COLUMN_SPAN ) nrOfExpandingItems++;
if ( item.second.totalColumnSpan == MAX_COLUMN_SPAN ) nrOfExpandingItems++;
}
return nrOfExpandingItems;
}
@@ -401,7 +405,7 @@ void PdmUiOrdering::nrOfColumnsRequiredForItem( const FieldAndLayout& fieldAndLa
if ( uiItem->uiLabelPosition() == PdmUiItemInfo::LEFT )
{
*labelColumnsRequired = 1;
if ( layoutOption.leftLabelColumnSpan != LayoutOptions::MAX_COLUMN_SPAN )
if ( layoutOption.leftLabelColumnSpan != MAX_COLUMN_SPAN )
{
*labelColumnsRequired = layoutOption.leftLabelColumnSpan;
}
@@ -409,7 +413,7 @@ void PdmUiOrdering::nrOfColumnsRequiredForItem( const FieldAndLayout& fieldAndLa
*totalColumnsRequired = *labelColumnsRequired + *fieldColumnsRequired;
}
if ( layoutOption.totalColumnSpan != LayoutOptions::MAX_COLUMN_SPAN )
if ( layoutOption.totalColumnSpan != MAX_COLUMN_SPAN )
{
*totalColumnsRequired = layoutOption.totalColumnSpan;
}
@@ -424,10 +428,8 @@ caf::PdmUiItem* PdmUiOrdering::PositionFound::item()
{
return parent->uiItems()[indexInParent];
}
else
{
return nullptr;
}
return nullptr;
}
//--------------------------------------------------------------------------------------------------
@@ -440,10 +442,8 @@ caf::PdmUiGroup* PdmUiOrdering::PositionFound::group()
{
return static_cast<PdmUiGroup*>( g );
}
else
{
return nullptr;
}
return nullptr;
}
} // End of namespace caf

View File

@@ -54,23 +54,22 @@ class PdmObjectHandle;
class PdmUiOrdering
{
public:
static const int MAX_COLUMN_SPAN = -1;
struct LayoutOptions
{
static const int MAX_COLUMN_SPAN = -1;
LayoutOptions( bool newRow = true, int totalColumnSpan = MAX_COLUMN_SPAN, int leftLabelColumnSpan = MAX_COLUMN_SPAN )
: newRow( newRow )
, totalColumnSpan( totalColumnSpan )
, leftLabelColumnSpan( leftLabelColumnSpan )
{
}
bool newRow;
int totalColumnSpan;
int leftLabelColumnSpan;
bool newRow{ true };
int totalColumnSpan{ MAX_COLUMN_SPAN };
int leftLabelColumnSpan{ MAX_COLUMN_SPAN };
};
typedef std::pair<PdmUiItem*, LayoutOptions> FieldAndLayout;
typedef std::vector<FieldAndLayout> RowLayout;
typedef std::vector<RowLayout> TableLayout;
// Required to use a static function as workaround instead of using LayoutOptions()
// https://stackoverflow.com/questions/53408962/try-to-understand-compiler-error-message-default-member-initializer-required-be
static LayoutOptions defaultLayoutOptions() { return {}; }
using FieldAndLayout = std::pair<PdmUiItem*, LayoutOptions>;
using RowLayout = std::vector<FieldAndLayout>;
using TableLayout = std::vector<RowLayout>;
PdmUiOrdering()
: m_skipRemainingFields( false ){};
@@ -79,33 +78,38 @@ public:
PdmUiOrdering( const PdmUiOrdering& ) = delete;
PdmUiOrdering& operator=( const PdmUiOrdering& ) = delete;
void add( const PdmFieldHandle* field, LayoutOptions layout = LayoutOptions() );
void add( const PdmObjectHandle* obj, LayoutOptions layout = LayoutOptions() );
void add( const PdmFieldHandle* field, LayoutOptions layout = defaultLayoutOptions() );
// Add a field without creating a new row
void appendToRow( const PdmFieldHandle* field );
void add( const PdmObjectHandle* obj, LayoutOptions layout = defaultLayoutOptions() );
bool insertBeforeGroup( const QString& groupId,
const PdmFieldHandle* fieldToInsert,
LayoutOptions layout = LayoutOptions() );
LayoutOptions layout = defaultLayoutOptions() );
bool insertBeforeItem( const PdmUiItem* item,
const PdmFieldHandle* fieldToInsert,
LayoutOptions layout = LayoutOptions() );
LayoutOptions layout = defaultLayoutOptions() );
PdmUiGroup* addNewGroup( const QString& displayName, LayoutOptions layout = LayoutOptions() );
PdmUiGroup* addNewGroup( const QString& displayName, LayoutOptions layout = defaultLayoutOptions() );
PdmUiGroup* createGroupBeforeGroup( const QString& groupId,
const QString& displayName,
LayoutOptions layout = LayoutOptions() );
PdmUiGroup*
createGroupBeforeItem( const PdmUiItem* item, const QString& displayName, LayoutOptions layout = LayoutOptions() );
LayoutOptions layout = defaultLayoutOptions() );
PdmUiGroup* createGroupBeforeItem( const PdmUiItem* item,
const QString& displayName,
LayoutOptions layout = defaultLayoutOptions() );
PdmUiGroup* addNewGroupWithKeyword( const QString& displayName,
const QString& groupKeyword,
LayoutOptions layout = LayoutOptions() );
LayoutOptions layout = defaultLayoutOptions() );
PdmUiGroup* createGroupWithIdBeforeGroup( const QString& groupId,
const QString& displayName,
const QString& newGroupId,
LayoutOptions layout = LayoutOptions() );
LayoutOptions layout = defaultLayoutOptions() );
PdmUiGroup* createGroupWithIdBeforeItem( const PdmUiItem* item,
const QString& displayName,
const QString& newGroupId,
LayoutOptions layout = LayoutOptions() );
LayoutOptions layout = defaultLayoutOptions() );
PdmUiGroup* findGroup( const QString& groupId ) const;
@@ -140,11 +144,11 @@ protected:
PositionFound findItemPosition( const PdmUiItem* item ) const;
private:
void insert( size_t index, const PdmFieldHandle* field, LayoutOptions layout = LayoutOptions() );
void insert( size_t index, const PdmFieldHandle* field, LayoutOptions layout = defaultLayoutOptions() );
PdmUiGroup* insertNewGroupWithKeyword( size_t index,
const QString& displayName,
const QString& groupKeyword,
LayoutOptions layout = LayoutOptions() );
LayoutOptions layout = defaultLayoutOptions() );
std::vector<FieldAndLayout> m_ordering; ///< The order of groups and fields
std::vector<PdmUiGroup*> m_createdGroups; ///< Owned PdmUiGroups, for memory management only
@@ -153,4 +157,4 @@ private:
} // End of namespace caf
#include "cafPdmUiGroup.h"
#include "cafPdmUiGroup.h"