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"

View File

@@ -577,53 +577,47 @@ protected:
void defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) override
{
uiOrdering.add( &m_intFieldStandard );
uiOrdering.add( &m_intFieldUseFullSpace,
caf::PdmUiOrdering::LayoutOptions( true,
caf::PdmUiOrdering::LayoutOptions::MAX_COLUMN_SPAN,
caf::PdmUiOrdering::LayoutOptions::MAX_COLUMN_SPAN ) );
uiOrdering.add( &m_intFieldUseFullSpaceLabel,
caf::PdmUiOrdering::LayoutOptions( true, 3, caf::PdmUiOrdering::LayoutOptions::MAX_COLUMN_SPAN ) );
uiOrdering.add( &m_intFieldUseFullSpaceField,
caf::PdmUiOrdering::LayoutOptions( true, caf::PdmUiOrdering::LayoutOptions::MAX_COLUMN_SPAN, 1 ) );
uiOrdering.add( &m_intFieldWideLabel, caf::PdmUiOrdering::LayoutOptions( true, 4, 3 ) );
uiOrdering.add( &m_intFieldWideField, caf::PdmUiOrdering::LayoutOptions( true, 4, 1 ) );
uiOrdering.add( &m_intFieldLeft, caf::PdmUiOrdering::LayoutOptions( true ) );
uiOrdering.add( &m_intFieldRight, caf::PdmUiOrdering::LayoutOptions( false ) );
uiOrdering.add( &m_intFieldWideBoth, caf::PdmUiOrdering::LayoutOptions( true, 4, 2 ) );
uiOrdering.add( &m_intFieldUseFullSpace );
uiOrdering.add( &m_intFieldUseFullSpaceLabel, { .totalColumnSpan = 3 } );
uiOrdering.add( &m_intFieldUseFullSpaceField, { .leftLabelColumnSpan = 1 } );
uiOrdering.add( &m_intFieldWideLabel, { .totalColumnSpan = 4, .leftLabelColumnSpan = 3 } );
uiOrdering.add( &m_intFieldWideField, { .totalColumnSpan = 4, .leftLabelColumnSpan = 1 } );
uiOrdering.add( &m_intFieldLeft );
uiOrdering.appendToRow( &m_intFieldRight );
uiOrdering.add( &m_intFieldWideBoth, { .totalColumnSpan = 4, .leftLabelColumnSpan = 2 } );
QString dynamicGroupName = QString( "Dynamic Group Text (%1)" ).arg( m_intFieldStandard );
caf::PdmUiGroup* group = uiOrdering.addNewGroup( "Wide Group", { true, 4 } );
group->add( &m_intFieldWideBoth2, caf::PdmUiOrdering::LayoutOptions( true, 6, 3 ) );
group->add( &m_intFieldLeft2, caf::PdmUiOrdering::LayoutOptions( true ) );
group->add( &m_intFieldCenter, caf::PdmUiOrdering::LayoutOptions( false ) );
group->add( &m_intFieldRight2, caf::PdmUiOrdering::LayoutOptions( false ) );
group->add( &m_intFieldLabelTop, caf::PdmUiOrdering::LayoutOptions( true, 6 ) );
group->add( &m_stringFieldLabelHidden, caf::PdmUiOrdering::LayoutOptions( true, 6 ) );
caf::PdmUiGroup* group = uiOrdering.addNewGroup( "Wide Group", { .totalColumnSpan = 4 } );
group->add( &m_intFieldWideBoth2, { .totalColumnSpan = 6, .leftLabelColumnSpan = 3 } );
group->add( &m_intFieldLeft2 );
group->appendToRow( &m_intFieldCenter );
group->appendToRow( &m_intFieldRight2 );
group->add( &m_intFieldLabelTop, { .totalColumnSpan = 6 } );
group->add( &m_stringFieldLabelHidden, { .totalColumnSpan = 6 } );
caf::PdmUiGroup* autoGroup =
uiOrdering.addNewGroup( "Automatic Full Width Group", caf::PdmUiOrdering::LayoutOptions( true ) );
autoGroup->add( &m_intFieldWideBothAuto, caf::PdmUiOrdering::LayoutOptions( true ) );
autoGroup->add( &m_intFieldLeftAuto, caf::PdmUiOrdering::LayoutOptions( true ) );
autoGroup->add( &m_intFieldCenterAuto, false );
autoGroup->add( &m_intFieldRightAuto, caf::PdmUiOrdering::LayoutOptions( false ) );
autoGroup->add( &m_intFieldLabelTopAuto, true );
autoGroup->add( &m_stringFieldLabelHiddenAuto, true );
caf::PdmUiGroup* autoGroup = uiOrdering.addNewGroup( "Automatic Full Width Group" );
autoGroup->add( &m_intFieldWideBothAuto );
autoGroup->add( &m_intFieldLeftAuto );
autoGroup->appendToRow( &m_intFieldCenterAuto );
autoGroup->appendToRow( &m_intFieldRightAuto );
autoGroup->add( &m_intFieldLabelTopAuto );
autoGroup->add( &m_stringFieldLabelHiddenAuto );
uiOrdering.add( &m_intFieldLeftOfGroup );
caf::PdmUiGroup* group2 = uiOrdering.addNewGroup( "Right Group", caf::PdmUiOrdering::LayoutOptions( false, 2, 0 ) );
caf::PdmUiGroup* group2 =
uiOrdering.addNewGroup( "Right Group", { .newRow = false, .totalColumnSpan = 2, .leftLabelColumnSpan = 0 } );
group2->setEnableFrame( false );
group2->add( &m_intFieldInsideGroup1 );
caf::PdmUiGroup* group3 = uiOrdering.addNewGroup( "Narrow L", caf::PdmUiOrdering::LayoutOptions( true, 1 ) );
caf::PdmUiGroup* group3 = uiOrdering.addNewGroup( "Narrow L", { .totalColumnSpan = 1 } );
group3->add( &m_intFieldInsideGroup2 );
uiOrdering.add( &m_intFieldRightOfGroup, caf::PdmUiOrdering::LayoutOptions( false, 3, 2 ) );
uiOrdering.add( &m_intFieldRightOfGroup, { .newRow = false, .totalColumnSpan = 3, .leftLabelColumnSpan = 2 } );
caf::PdmUiGroup* groupL = uiOrdering.addNewGroup( "Left Group", caf::PdmUiOrdering::LayoutOptions( true, 1 ) );
caf::PdmUiGroup* groupL = uiOrdering.addNewGroup( "Left Group", { .totalColumnSpan = 1 } );
groupL->add( &m_intFieldInsideGroup3 );
groupL->add( &m_intFieldInsideGroup5 );
caf::PdmUiGroup* groupR =
uiOrdering.addNewGroup( "Right Wide Group", caf::PdmUiOrdering::LayoutOptions( false, 3 ) );
caf::PdmUiGroup* groupR = uiOrdering.addNewGroup( "Right Wide Group", { .newRow = false, .totalColumnSpan = 3 } );
groupR->setEnableFrame( false );
groupR->add( &m_intFieldInsideGroup4 );
groupR->add( &m_intFieldInsideGroup6 );
@@ -690,7 +684,8 @@ public:
CAF_PDM_InitField( &m_toggleField,
"Toggle",
false,
"Toggle Field much text much text much much text much text muchmuch text much text muchmuch "
"Toggle Field much text much text much much text much text muchmuch text much text "
"muchmuch "
"text much "
"text muchmuch text much text muchmuch text much text much",
"",

View File

@@ -139,7 +139,7 @@ int caf::PdmUiFormLayoutObjectEditor::recursivelyConfigureAndUpdateUiOrderingInG
&minimumItemColumnSpan,
&minimumLabelColumnSpan,
&minimumFieldColumnSpan );
bool isExpandingItem = currentLayout.totalColumnSpan == PdmUiOrdering::LayoutOptions::MAX_COLUMN_SPAN;
bool isExpandingItem = currentLayout.totalColumnSpan == PdmUiOrdering::MAX_COLUMN_SPAN;
int spareColumnsToAssign = 0;
if ( isExpandingItem )
@@ -225,13 +225,13 @@ int caf::PdmUiFormLayoutObjectEditor::recursivelyConfigureAndUpdateUiOrderingInG
{
CAF_ASSERT( labelPos == PdmUiItemInfo::LEFT );
int leftLabelColumnSpan = minimumLabelColumnSpan;
if ( currentLayout.leftLabelColumnSpan == PdmUiOrdering::LayoutOptions::MAX_COLUMN_SPAN &&
currentLayout.totalColumnSpan != PdmUiOrdering::LayoutOptions::MAX_COLUMN_SPAN )
if ( currentLayout.leftLabelColumnSpan == PdmUiOrdering::MAX_COLUMN_SPAN &&
currentLayout.totalColumnSpan != PdmUiOrdering::MAX_COLUMN_SPAN )
{
leftLabelColumnSpan += spareColumnsToAssign;
spareColumnsToAssign = 0;
}
else if ( currentLayout.leftLabelColumnSpan == PdmUiOrdering::LayoutOptions::MAX_COLUMN_SPAN )
else if ( currentLayout.leftLabelColumnSpan == PdmUiOrdering::MAX_COLUMN_SPAN )
{
leftLabelColumnSpan += spareColumnsToAssign / 2;
spareColumnsToAssign -= spareColumnsToAssign / 2;