D&D forms show as group box collapsible

Funded by: ARPA Piemonte
This commit is contained in:
Alessandro Pasotti 2022-03-01 16:19:46 +01:00
parent 667886b3b9
commit 735f1c703e
9 changed files with 297 additions and 84 deletions

View File

@ -52,6 +52,28 @@ Returns if this container is going to be rendered as a group box
:return: ``True`` if it will be a group box, ``False`` if it will be a tab
%End
bool collapsed() const;
%Docstring
For containers rendedered a group box returns if this group box is collapsed.
:return: ``True`` if the group box, ``False`` otherwise.
.. seealso:: :py:func:`collapsed`
.. seealso:: :py:func:`setCollapsed`
.. versionadded:: 3.26
%End
void setCollapsed( bool collapsed );
%Docstring
For containers rendedered a group box sets if this group box is ``collapsed``.
.. seealso:: :py:func:`collapsed`
.. seealso:: :py:func:`setCollapsed`
.. versionadded:: 3.26
%End
QList<QgsAttributeEditorElement *> children() const;
%Docstring
Gets a list of the children elements of this container
@ -112,6 +134,26 @@ show or hide this container based on an expression incorporating
the field value controlled by editor widgets.
.. versionadded:: 3.0
%End
QgsOptionalExpression collapsedExpression() const;
%Docstring
The collapsed expression is used in the attribute form to
set the collapsed status of the group box container container based on an expression incorporating
the field value controlled by editor widgets. This property is ignored if the container is not
rendered as a group box.
.. versionadded:: 3.26
%End
void setCollapsedExpression( const QgsOptionalExpression &collapsedExpression );
%Docstring
The visibility expression is used in the attribute form to
set the collapsed status of the group box of this container based on an expression incorporating
the field value controlled by editor widgets. This property is ignored if the container is not
rendered as a group box.
.. versionadded:: 3.26
%End
QColor backgroundColor() const;

View File

@ -45,6 +45,19 @@ void QgsAttributeEditorContainer::setVisibilityExpression( const QgsOptionalExpr
mVisibilityExpression = visibilityExpression;
}
QgsOptionalExpression QgsAttributeEditorContainer::collapsedExpression() const
{
return mCollapsedExpression;
}
void QgsAttributeEditorContainer::setCollapsedExpression( const QgsOptionalExpression &collapsedExpression )
{
if ( collapsedExpression == mCollapsedExpression )
return;
mCollapsedExpression = collapsedExpression;
}
QColor QgsAttributeEditorContainer::backgroundColor() const
{
return mBackgroundColor;
@ -107,6 +120,7 @@ QgsAttributeEditorElement *QgsAttributeEditorContainer::clone( QgsAttributeEdito
element->mIsGroupBox = mIsGroupBox;
element->mColumnCount = mColumnCount;
element->mVisibilityExpression = mVisibilityExpression;
element->mCollapsed = mCollapsed;
return element;
}
@ -116,6 +130,9 @@ void QgsAttributeEditorContainer::saveConfiguration( QDomElement &elem, QDomDocu
Q_UNUSED( doc )
elem.setAttribute( QStringLiteral( "columnCount" ), mColumnCount );
elem.setAttribute( QStringLiteral( "groupBox" ), mIsGroupBox ? 1 : 0 );
elem.setAttribute( QStringLiteral( "collapsed" ), mCollapsed );
elem.setAttribute( QStringLiteral( "collapsedExpressionEnabled" ), mCollapsedExpression.enabled() ? 1 : 0 );
elem.setAttribute( QStringLiteral( "collapsedExpression" ), mCollapsedExpression->expression() );
elem.setAttribute( QStringLiteral( "visibilityExpressionEnabled" ), mVisibilityExpression.enabled() ? 1 : 0 );
elem.setAttribute( QStringLiteral( "visibilityExpression" ), mVisibilityExpression->expression() );
if ( mBackgroundColor.isValid() )
@ -143,6 +160,22 @@ void QgsAttributeEditorContainer::loadConfiguration( const QDomElement &element,
else
setIsGroupBox( mParent );
const bool isCollapsed = element.attribute( QStringLiteral( "collapsed" ) ).toInt( &ok );
if ( ok )
setCollapsed( isCollapsed );
else
setCollapsed( false );
const bool collapsedExpressionEnabled = element.attribute( QStringLiteral( "collapsedExpressionEnabled" ) ).toInt( &ok );
QgsOptionalExpression collapsedExpression;
if ( ok )
{
collapsedExpression.setEnabled( collapsedExpressionEnabled );
collapsedExpression.setData( QgsExpression( element.attribute( QStringLiteral( "collapsedExpression" ) ) ) );
}
setCollapsedExpression( collapsedExpression );
const bool visibilityExpressionEnabled = element.attribute( QStringLiteral( "visibilityExpressionEnabled" ) ).toInt( &ok );
QgsOptionalExpression visibilityExpression;
if ( ok )

View File

@ -66,6 +66,25 @@ class CORE_EXPORT QgsAttributeEditorContainer : public QgsAttributeEditorElement
*/
virtual bool isGroupBox() const { return mIsGroupBox; }
/**
* For containers rendedered a group box returns if this group box is collapsed.
*
* \returns TRUE if the group box, FALSE otherwise.
* \see collapsed()
* \see setCollapsed()
* \since QGIS 3.26
*/
bool collapsed() const { return mCollapsed; };
/**
* For containers rendedered a group box sets if this group box is \a collapsed.
*
* \see collapsed()
* \see setCollapsed()
* \since QGIS 3.26
*/
void setCollapsed( bool collapsed ) { mCollapsed = collapsed; };
/**
* Gets a list of the children elements of this container
*
@ -127,6 +146,26 @@ class CORE_EXPORT QgsAttributeEditorContainer : public QgsAttributeEditorElement
*/
void setVisibilityExpression( const QgsOptionalExpression &visibilityExpression );
/**
* The collapsed expression is used in the attribute form to
* set the collapsed status of the group box container container based on an expression incorporating
* the field value controlled by editor widgets. This property is ignored if the container is not
* rendered as a group box.
*
* \since QGIS 3.26
*/
QgsOptionalExpression collapsedExpression() const;
/**
* The visibility expression is used in the attribute form to
* set the collapsed status of the group box of this container based on an expression incorporating
* the field value controlled by editor widgets. This property is ignored if the container is not
* rendered as a group box.
*
* \since QGIS 3.26
*/
void setCollapsedExpression( const QgsOptionalExpression &collapsedExpression );
/**
* \brief backgroundColor
* \return background color of the container
@ -149,6 +188,8 @@ class CORE_EXPORT QgsAttributeEditorContainer : public QgsAttributeEditorElement
int mColumnCount;
QgsOptionalExpression mVisibilityExpression;
QColor mBackgroundColor;
bool mCollapsed = false;
QgsOptionalExpression mCollapsedExpression;
};

View File

@ -31,28 +31,36 @@ QgsAttributeFormContainerEdit::QgsAttributeFormContainerEdit( QTreeWidgetItem *i
{
// only top level items can be tabs
// i.e. it's always a group box if it's a nested container
mShowAsGroupBoxCheckBox->hide();
mShowAsGroupBoxCheckBox->setEnabled( false );
mShowAsGroupBox->hide();
mShowAsGroupBox->setEnabled( false );
}
mTitleLineEdit->setText( itemData.name() );
mShowLabelCheckBox->setChecked( itemData.showLabel() );
mShowLabelCheckBox->setEnabled( itemData.showAsGroupBox() ); // show label makes sense for group box, not for tabs
mShowAsGroupBoxCheckBox->setChecked( itemData.showAsGroupBox() );
mShowAsGroupBox->setChecked( itemData.showAsGroupBox() );
mControlVisibilityGroupBox->setChecked( itemData.visibilityExpression().enabled() );
mVisibilityExpressionWidget->setLayer( layer );
mVisibilityExpressionWidget->setExpression( itemData.visibilityExpression()->expression() );
mColumnCountSpinBox->setValue( itemData.columnCount() );
mBackgroundColorButton->setColor( itemData.backgroundColor() );
mCollapsedCheckBox->setChecked( itemData.collapsed() );
mCollapsedCheckBox->setEnabled( itemData.showAsGroupBox() );
mControlCollapsedGroupBox->setChecked( itemData.collapsedExpression().enabled() );
mControlCollapsedGroupBox->setEnabled( itemData.showAsGroupBox() );
mCollapsedExpressionWidget->setExpression( itemData.collapsedExpression()->expression() );
// show label makes sense for group box, not for tabs
connect( mShowAsGroupBoxCheckBox, &QCheckBox::stateChanged, mShowLabelCheckBox, &QCheckBox::setEnabled );
connect( mShowAsGroupBox, &QCheckBox::toggled, mShowLabelCheckBox, &QCheckBox::setEnabled );
connect( mShowAsGroupBox, &QCheckBox::toggled, mCollapsedCheckBox, &QCheckBox::setEnabled );
connect( mShowAsGroupBox, &QCheckBox::toggled, mControlCollapsedGroupBox, &QCheckBox::setEnabled );
}
void QgsAttributeFormContainerEdit::registerExpressionContextGenerator( QgsExpressionContextGenerator *generator )
{
mVisibilityExpressionWidget->registerExpressionContextGenerator( generator );
mCollapsedExpressionWidget->registerExpressionContextGenerator( generator );
}
void QgsAttributeFormContainerEdit::updateItemData()
@ -60,7 +68,7 @@ void QgsAttributeFormContainerEdit::updateItemData()
QgsAttributesFormProperties::DnDTreeItemData itemData = mTreeItem->data( 0, QgsAttributesFormProperties::DnDTreeRole ).value<QgsAttributesFormProperties::DnDTreeItemData>();
itemData.setColumnCount( mColumnCountSpinBox->value() );
itemData.setShowAsGroupBox( mShowAsGroupBoxCheckBox->isEnabled() ? mShowAsGroupBoxCheckBox->isChecked() : false );
itemData.setShowAsGroupBox( mShowAsGroupBox->isEnabled() ? mShowAsGroupBox->isChecked() : false );
itemData.setName( mTitleLineEdit->text() );
itemData.setShowLabel( mShowLabelCheckBox->isChecked() );
itemData.setBackgroundColor( mBackgroundColorButton->color() );
@ -70,6 +78,12 @@ void QgsAttributeFormContainerEdit::updateItemData()
visibilityExpression.setEnabled( mControlVisibilityGroupBox->isChecked() );
itemData.setVisibilityExpression( visibilityExpression );
QgsOptionalExpression collapsedExpression;
collapsedExpression.setData( QgsExpression( mCollapsedExpressionWidget->expression() ) );
collapsedExpression.setEnabled( mControlCollapsedGroupBox->isChecked() );
itemData.setCollapsedExpression( collapsedExpression );
itemData.setCollapsed( mCollapsedCheckBox->isEnabled() ? mCollapsedCheckBox->isChecked() : false );
mTreeItem->setData( 0, QgsAttributesFormProperties::DnDTreeRole, itemData );
mTreeItem->setText( 0, itemData.name() );
}

View File

@ -59,7 +59,6 @@
#include <QFile>
#include <QFormLayout>
#include <QGridLayout>
#include <QGroupBox>
#include <QKeyEvent>
#include <QLabel>
#include <QPushButton>
@ -1088,7 +1087,7 @@ void QgsAttributeForm::updateConstraints( QgsEditorWidgetWrapper *eww )
QgsExpressionContext context = createExpressionContext( ft );
// Recheck visibility for all containers which are controlled by this value
// Recheck visibility/collapsed state for all containers which are controlled by this value
const QVector<ContainerInformation *> infos = mContainerInformationDependency.value( eww->field().name() );
for ( ContainerInformation *info : infos )
{
@ -1101,7 +1100,7 @@ void QgsAttributeForm::updateContainersVisibility()
{
QgsExpressionContext context = createExpressionContext( mFeature );
const QVector<ContainerInformation *> infos = mContainerVisibilityInformation;
const QVector<ContainerInformation *> infos = mContainerVisibilityCollapsedInformation;
for ( ContainerInformation *info : infos )
{
@ -1224,9 +1223,9 @@ bool QgsAttributeForm::currentFormValuesFeature( QgsFeature &feature )
void QgsAttributeForm::registerContainerInformation( QgsAttributeForm::ContainerInformation *info )
{
mContainerVisibilityInformation.append( info );
mContainerVisibilityCollapsedInformation.append( info );
const QSet<QString> referencedColumns = info->expression.referencedColumns();
const QSet<QString> referencedColumns = info->expression.referencedColumns().unite( info->collapsedExpression.referencedColumns() );
for ( const QString &col : referencedColumns )
{
@ -1611,9 +1610,9 @@ void QgsAttributeForm::init()
tabWidget = nullptr;
WidgetInfo widgetInfo = createWidgetFromDef( widgDef, formWidget, mLayer, mContext );
layout->addWidget( widgetInfo.widget, row, column, 1, 2 );
if ( containerDef->visibilityExpression().enabled() )
if ( containerDef->visibilityExpression().enabled() || containerDef->collapsedExpression().enabled() )
{
registerContainerInformation( new ContainerInformation( widgetInfo.widget, containerDef->visibilityExpression().data() ) );
registerContainerInformation( new ContainerInformation( widgetInfo.widget, containerDef->visibilityExpression().enabled() ? containerDef->visibilityExpression().data() : QgsExpression(), containerDef->collapsed(), containerDef->collapsedExpression().enabled() ? containerDef->collapsedExpression().data() : QgsExpression() ) );
}
column += 2;
}
@ -2232,12 +2231,13 @@ QgsAttributeForm::WidgetInfo QgsAttributeForm::createWidgetFromDef( const QgsAtt
QWidget *myContainer = nullptr;
if ( container->isGroupBox() )
{
QGroupBox *groupBox = new QGroupBox( parent );
QgsCollapsibleGroupBoxBasic *groupBox = new QgsCollapsibleGroupBoxBasic();
widgetName = QStringLiteral( "QGroupBox" );
if ( container->showLabel() )
groupBox->setTitle( container->name() );
myContainer = groupBox;
newWidgetInfo.widget = myContainer;
groupBox->setCollapsed( container->collapsed() );
}
else
{
@ -2274,9 +2274,9 @@ QgsAttributeForm::WidgetInfo QgsAttributeForm::createWidgetFromDef( const QgsAtt
if ( childDef->type() == QgsAttributeEditorElement::AeTypeContainer )
{
QgsAttributeEditorContainer *containerDef = static_cast<QgsAttributeEditorContainer *>( childDef );
if ( containerDef->visibilityExpression().enabled() )
if ( containerDef->visibilityExpression().enabled() || containerDef->collapsedExpression().enabled() )
{
registerContainerInformation( new ContainerInformation( widgetInfo.widget, containerDef->visibilityExpression().data() ) );
registerContainerInformation( new ContainerInformation( widgetInfo.widget, containerDef->visibilityExpression().enabled() ? containerDef->visibilityExpression().data() : QgsExpression(), containerDef->collapsed(), containerDef->collapsedExpression().enabled() ? containerDef->collapsedExpression().data() : QgsExpression() ) );
}
}
@ -2679,9 +2679,10 @@ void QgsAttributeForm::setExtraContextScope( QgsExpressionContextScope *extraSco
void QgsAttributeForm::ContainerInformation::apply( QgsExpressionContext *expressionContext )
{
bool newVisibility = expression.evaluate( expressionContext ).toBool();
if ( newVisibility != isVisible )
const bool newVisibility = expression.evaluate( expressionContext ).toBool();
if ( expression.isValid() && ! expression.hasEvalError() && newVisibility != isVisible )
{
if ( tabWidget )
{
@ -2694,6 +2695,19 @@ void QgsAttributeForm::ContainerInformation::apply( QgsExpressionContext *expres
isVisible = newVisibility;
}
const bool newCollapsedState = collapsedExpression.evaluate( expressionContext ).toBool();
if ( collapsedExpression.isValid() && ! collapsedExpression.hasEvalError() && newCollapsedState != isCollapsed )
{
QgsCollapsibleGroupBoxBasic *collapsibleGroupBox { qobject_cast<QgsCollapsibleGroupBoxBasic *>( widget ) };
if ( collapsibleGroupBox )
{
collapsibleGroupBox->setCollapsed( newCollapsedState );
isCollapsed = newCollapsedState;
}
}
}
void QgsAttributeForm::updateJoinedFields( const QgsEditorWidgetWrapper &eww )

View File

@ -488,10 +488,21 @@ class GUI_EXPORT QgsAttributeForm : public QWidget
, isVisible( true )
{}
ContainerInformation( QWidget *widget, const QgsExpression &visibilityExpression, bool collapsed, const QgsExpression &collapsedExpression )
: widget( widget )
, expression( visibilityExpression )
, isVisible( true )
, isCollapsed( collapsed )
, collapsedExpression( collapsedExpression )
{}
QgsTabWidget *tabWidget = nullptr;
QWidget *widget = nullptr;
QgsExpression expression;
bool isVisible;
bool isCollapsed = false;
QgsExpression collapsedExpression;
void apply( QgsExpressionContext *expressionContext );
};
@ -502,8 +513,8 @@ class GUI_EXPORT QgsAttributeForm : public QWidget
void reloadIcon( const QString &file, const QString &tooltip, QSvgWidget *sw );
// Contains information about tabs and groupboxes, their visibility state visibility conditions
QVector<ContainerInformation *> mContainerVisibilityInformation;
// Contains information about tabs and groupboxes, their visibility/collapsed state conditions
QVector<ContainerInformation *> mContainerVisibilityCollapsedInformation;
QMap<QString, QVector<ContainerInformation *> > mContainerInformationDependency;
// Variables below are used for Python

View File

@ -479,6 +479,8 @@ QTreeWidgetItem *QgsAttributesFormProperties::loadAttributeEditorTreeItem( QgsAt
itemData.setShowAsGroupBox( container->isGroupBox() );
itemData.setBackgroundColor( container->backgroundColor() );
itemData.setVisibilityExpression( container->visibilityExpression() );
itemData.setCollapsedExpression( container->collapsedExpression() );
itemData.setCollapsed( container->collapsed() );
newWidget = tree->addItem( parent, itemData );
const QList<QgsAttributeEditorElement *> children = container->children();
@ -733,6 +735,8 @@ QgsAttributeEditorElement *QgsAttributesFormProperties::createAttributeEditorWid
QgsAttributeEditorContainer *container = new QgsAttributeEditorContainer( item->text( 0 ), parent, itemData.backgroundColor() );
container->setColumnCount( itemData.columnCount() );
container->setIsGroupBox( forceGroup ? true : itemData.showAsGroupBox() );
container->setCollapsed( itemData.collapsed() );
container->setCollapsedExpression( itemData.collapsedExpression() );
container->setVisibilityExpression( itemData.visibilityExpression() );
container->setBackgroundColor( itemData.backgroundColor( ) );
@ -1542,6 +1546,16 @@ void QgsAttributesFormProperties::DnDTreeItemData::setVisibilityExpression( cons
mVisibilityExpression = visibilityExpression;
}
QgsOptionalExpression QgsAttributesFormProperties::DnDTreeItemData::collapsedExpression() const
{
return mCollapsedExpression;
}
void QgsAttributesFormProperties::DnDTreeItemData::setCollapsedExpression( const QgsOptionalExpression &collapsedExpression )
{
mCollapsedExpression = collapsedExpression;
}
QgsAttributesFormProperties::RelationEditorConfiguration QgsAttributesFormProperties::DnDTreeItemData::relationEditorConfiguration() const
{
return mRelationEditorConfiguration;

View File

@ -137,11 +137,33 @@ class GUI_EXPORT QgsAttributesFormProperties : public QWidget, public QgsExpress
bool showAsGroupBox() const;
void setShowAsGroupBox( bool showAsGroupBox );
/**
* For containers rendedered a group box returns if this group box is collapsed.
*
* \returns TRUE if the group box, FALSE otherwise.
* \see collapsed()
* \see setCollapsed()
* \since QGIS 3.26
*/
bool collapsed() const { return mCollapsed; };
/**
* For containers rendedered a group box sets if this group box is \a collapsed.
*
* \see collapsed()
* \see setCollapsed()
* \since QGIS 3.26
*/
void setCollapsed( bool collapsed ) { mCollapsed = collapsed; };
bool showLabel() const;
void setShowLabel( bool showLabel );
QgsOptionalExpression visibilityExpression() const;
void setVisibilityExpression( const QgsOptionalExpression &visibilityExpression );
void setVisibilityExpression( const QgsOptionalExpression &collapsedExpression );
QgsOptionalExpression collapsedExpression() const;
void setCollapsedExpression( const QgsOptionalExpression &collapsedExpression );
RelationEditorConfiguration relationEditorConfiguration() const;
void setRelationEditorConfiguration( RelationEditorConfiguration relationEditorConfiguration );
@ -167,6 +189,8 @@ class GUI_EXPORT QgsAttributesFormProperties : public QWidget, public QgsExpress
QmlElementEditorConfiguration mQmlElementEditorConfiguration;
HtmlElementEditorConfiguration mHtmlElementEditorConfiguration;
QColor mBackgroundColor;
bool mCollapsed = false;
QgsOptionalExpression mCollapsedExpression;
};

View File

@ -7,48 +7,14 @@
<x>0</x>
<y>0</y>
<width>401</width>
<height>303</height>
<height>320</height>
</rect>
</property>
<property name="windowTitle">
<string notr="true">Form</string>
</property>
<layout class="QGridLayout" name="gridLayout">
<item row="3" column="0">
<widget class="QLabel" name="label_2">
<property name="text">
<string>Columns</string>
</property>
</widget>
</item>
<item row="0" column="0" colspan="2">
<widget class="QCheckBox" name="mShowLabelCheckBox">
<property name="text">
<string>Show label</string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label">
<property name="text">
<string>Title</string>
</property>
</widget>
</item>
<item row="6" column="0">
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item row="4" column="0" colspan="3">
<item row="4" column="0" colspan="2">
<widget class="QgsCollapsibleGroupBox" name="mControlVisibilityGroupBox">
<property name="title">
<string>Control Visibility by Expression</string>
@ -63,27 +29,7 @@
</layout>
</widget>
</item>
<item row="3" column="1">
<widget class="QgsSpinBox" name="mColumnCountSpinBox">
<property name="minimum">
<number>1</number>
</property>
<property name="maximum">
<number>10</number>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QLineEdit" name="mTitleLineEdit"/>
</item>
<item row="1" column="0" colspan="2">
<widget class="QCheckBox" name="mShowAsGroupBoxCheckBox">
<property name="text">
<string>Show as group box</string>
</property>
</widget>
</item>
<item row="5" column="0" colspan="2">
<item row="9" column="0" colspan="2">
<widget class="QgsCollapsibleGroupBox" name="mGroupBox">
<property name="title">
<string>Style</string>
@ -102,20 +48,96 @@
</layout>
</widget>
</item>
<item row="10" column="0">
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item row="0" column="0" colspan="2">
<widget class="QCheckBox" name="mShowLabelCheckBox">
<property name="text">
<string>Show label</string>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="label_2">
<property name="text">
<string>Columns</string>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QgsSpinBox" name="mColumnCountSpinBox">
<property name="minimum">
<number>1</number>
</property>
<property name="maximum">
<number>10</number>
</property>
</widget>
</item>
<item row="5" column="0">
<widget class="QCheckBox" name="mShowAsGroupBox">
<property name="text">
<string>Show as Group Box</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QLineEdit" name="mTitleLineEdit"/>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label">
<property name="text">
<string>Title</string>
</property>
</widget>
</item>
<item row="6" column="0">
<widget class="QCheckBox" name="mCollapsedCheckBox">
<property name="text">
<string>Collapsed</string>
</property>
</widget>
</item>
<item row="7" column="0" colspan="2">
<widget class="QgsCollapsibleGroupBox" name="mControlCollapsedGroupBox">
<property name="title">
<string>Control Collapsed by Expression</string>
</property>
<property name="checkable">
<bool>true</bool>
</property>
<layout class="QGridLayout" name="gridLayout_4">
<item row="0" column="0">
<widget class="QgsFieldExpressionWidget" name="mCollapsedExpressionWidget" native="true"/>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
<customwidgets>
<customwidget>
<class>QgsSpinBox</class>
<extends>QSpinBox</extends>
<header>qgsspinbox.h</header>
</customwidget>
<customwidget>
<class>QgsCollapsibleGroupBox</class>
<extends>QGroupBox</extends>
<header>qgscollapsiblegroupbox.h</header>
<container>1</container>
</customwidget>
<customwidget>
<class>QgsSpinBox</class>
<extends>QSpinBox</extends>
<header>qgsspinbox.h</header>
</customwidget>
<customwidget>
<class>QgsFieldExpressionWidget</class>
<extends>QWidget</extends>
@ -131,10 +153,8 @@
</customwidgets>
<tabstops>
<tabstop>mShowLabelCheckBox</tabstop>
<tabstop>mShowAsGroupBoxCheckBox</tabstop>
<tabstop>mTitleLineEdit</tabstop>
<tabstop>mColumnCountSpinBox</tabstop>
<tabstop>mControlVisibilityGroupBox</tabstop>
<tabstop>mBackgroundColorButton</tabstop>
</tabstops>
<resources/>