Rework caf Layout to work better when number of columns isn't fully specified

This commit is contained in:
Gaute Lindkvist
2019-02-11 15:48:01 +01:00
parent 0fd51b2088
commit fac9870c76
4 changed files with 246 additions and 165 deletions
@@ -311,35 +311,105 @@ const std::vector<PdmUiOrdering::FieldAndLayout>& PdmUiOrdering::uiItemsWithLayo
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
int PdmUiOrdering::nrOfColumns() const
PdmUiOrdering::TableLayout PdmUiOrdering::calculateTableLayout(const QString& uiConfigName) const
{
int maxColumns = 0;
int currentRowColumns = 0;
for (const FieldAndLayout& itemAndLayout : m_ordering)
{
int currentColumnSpan = itemAndLayout.second.totalColumnSpan;
if (currentColumnSpan == LayoutOptions::MAX_COLUMN_SPAN)
{
int minimumFieldColumnSpan = 1;
int minimumLabelColumnSpan = 0;
if (itemAndLayout.first->uiLabelPosition() == PdmUiItemInfo::LEFT)
{
minimumLabelColumnSpan = 1;
}
currentColumnSpan = minimumLabelColumnSpan + minimumFieldColumnSpan;
}
TableLayout tableLayout;
if (itemAndLayout.second.newRow)
for (size_t i = 0; i < m_ordering.size(); ++i)
{
if (m_ordering[i].first->isUiHidden(uiConfigName)) continue;
if (m_ordering[i].second.newRow || i == 0u)
{
currentRowColumns = currentColumnSpan;
tableLayout.push_back(RowLayout());
}
else
{
currentRowColumns += currentColumnSpan;
}
maxColumns = std::max(maxColumns, currentRowColumns);
tableLayout.back().push_back(m_ordering[i]);
}
return tableLayout;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
int PdmUiOrdering::nrOfColumns(const TableLayout& tableLayout) const
{
int maxNrOfColumns = 0;
for (const auto& rowContent : tableLayout)
{
maxNrOfColumns = std::max(maxNrOfColumns, nrOfRequiredColumnsInRow(rowContent));
}
return maxNrOfColumns;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
int PdmUiOrdering::nrOfRequiredColumnsInRow(const RowLayout& rowItems) const
{
int totalColumns = 0;
for (const FieldAndLayout& item : rowItems)
{
int totalItemColumns = 0, labelItemColumns = 0, fieldItemColumns = 0;
nrOfColumnsRequiredForItem(item, &totalItemColumns, &labelItemColumns, &fieldItemColumns);
totalColumns += totalItemColumns;
}
return totalColumns;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
int PdmUiOrdering::nrOfExpandingItemsInRow(const RowLayout& rowItems) const
{
int nrOfExpandingItems = 0;
for (const FieldAndLayout& item : rowItems)
{
if (item.second.totalColumnSpan == LayoutOptions::MAX_COLUMN_SPAN)
nrOfExpandingItems++;
}
return nrOfExpandingItems;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void PdmUiOrdering::nrOfColumnsRequiredForItem(const FieldAndLayout& fieldAndLayout,
int* totalColumnsRequired,
int* labelColumnsRequired,
int* fieldColumnsRequired) const
{
const PdmUiItem* uiItem = fieldAndLayout.first;
CAF_ASSERT(uiItem && totalColumnsRequired && labelColumnsRequired && fieldColumnsRequired);
LayoutOptions layoutOption = fieldAndLayout.second;
if (uiItem->isUiGroup())
{
*totalColumnsRequired = 1;
*labelColumnsRequired = 0;
*fieldColumnsRequired = 0;
}
else
{
*fieldColumnsRequired = 1;
*labelColumnsRequired = 0;
if (uiItem->uiLabelPosition() == PdmUiItemInfo::LEFT)
{
*labelColumnsRequired = 1;
if (layoutOption.leftLabelColumnSpan != LayoutOptions::MAX_COLUMN_SPAN)
{
*labelColumnsRequired = layoutOption.leftLabelColumnSpan;
}
}
*totalColumnsRequired = *labelColumnsRequired + *fieldColumnsRequired;
}
if (layoutOption.totalColumnSpan != LayoutOptions::MAX_COLUMN_SPAN)
{
*totalColumnsRequired = layoutOption.totalColumnSpan;
}
return maxColumns;
}
//--------------------------------------------------------------------------------------------------
@@ -67,6 +67,8 @@ public:
int leftLabelColumnSpan;
};
typedef std::pair<PdmUiItem*, LayoutOptions> FieldAndLayout;
typedef std::vector<FieldAndLayout> RowLayout;
typedef std::vector<RowLayout> TableLayout;
PdmUiOrdering(): m_skipRemainingFields(false) { };
virtual ~PdmUiOrdering();
@@ -92,10 +94,18 @@ public:
void skipRemainingFields(bool doSkip = true);
// Pdm internal methods
const std::vector<PdmUiItem*> uiItems() const;
const std::vector<FieldAndLayout>& uiItemsWithLayout() const;
const std::vector<PdmUiItem*> uiItems() const;
const std::vector<FieldAndLayout>& uiItemsWithLayout() const;
int nrOfColumns() const;
std::vector<std::vector<FieldAndLayout>> calculateTableLayout(const QString& uiConfigName) const;
int nrOfColumns(const TableLayout& tableLayout) const;
int nrOfRequiredColumnsInRow(const RowLayout& rowItems) const;
int nrOfExpandingItemsInRow(const RowLayout& rowItems) const;
void nrOfColumnsRequiredForItem(const FieldAndLayout& fieldAndLayout,
int* totalColumnsRequired,
int* labelColumnsRequired,
int* fieldColumnsRequired) const;
bool contains(const PdmUiItem* item) const;
bool isIncludingRemainingFields() const;