define default transforms in global options

adds QgsCoordinateTransformContext::readSettings()/writeSettings to read/write from settings
This commit is contained in:
Denis Rouzaud 2017-11-28 22:04:43 -04:00 committed by Nyall Dawson
parent 8798cf0680
commit 44ed7bd9fb
9 changed files with 247 additions and 174 deletions

View File

@ -12,6 +12,7 @@
class QgsCoordinateTransformContext
{
%Docstring
@ -149,6 +150,19 @@ class QgsCoordinateTransformContext
%End
void readSettings();
%Docstring
Reads the context's state from application settings.
.. seealso:: readSettings()
%End
void writeSettings();
%Docstring
Write the context's state to application settings.
.. seealso:: writeSettings()
%End
};

View File

@ -38,6 +38,7 @@
#include "qgsattributetablefiltermodel.h"
#include "qgsrasterformatsaveoptionswidget.h"
#include "qgsrasterpyramidsoptionswidget.h"
#include "qgsdatumtransformdialog.h"
#include "qgsdialog.h"
#include "qgscomposer.h"
#include "qgscolorschemeregistry.h"
@ -454,56 +455,21 @@ QgsOptions::QgsOptions( QWidget *parent, Qt::WindowFlags fl, const QList<QgsOpti
leProjectGlobalCrs->setCrs( mDefaultCrs );
leProjectGlobalCrs->setOptionVisible( QgsProjectionSelectionWidget::DefaultCrs, false );
//default datum transformations
mSettings->beginGroup( QStringLiteral( "/Projections" ) );
mShowDatumTransformDialogCheckBox->setChecked( mSettings->value( QStringLiteral( "/Projections/showDatumTransformDialog" ), false ).toBool() );
QStringList projectionKeys = mSettings->allKeys();
// Datum transforms
QgsCoordinateTransformContext context;
context.readSettings();
mDefaultDatumTransformTableModel->setTransformContext( context );
mDefaultDatumTransformTableView->setModel( mDefaultDatumTransformTableModel );
mDefaultDatumTransformTableView->resizeColumnToContents( 0 );
mDefaultDatumTransformTableView->horizontalHeader()->show();
mDefaultDatumTransformTableView->setSelectionMode( QAbstractItemView::SingleSelection );
mDefaultDatumTransformTableView->setSelectionBehavior( QAbstractItemView::SelectRows );
connect( mAddDefaultTransformButton, &QToolButton::clicked, this, &QgsOptions::addDefaultDatumTransform );
connect( mRemoveDefaultTransformButton, &QToolButton::clicked, this, &QgsOptions::removeDefaultDatumTransform );
connect( mEditDefaultTransformButton, &QToolButton::clicked, this, &QgsOptions::editDefaultDatumTransform );
//collect src and dest entries that belong together
QMap< QPair< QString, QString >, QPair< int, int > > transforms;
QStringList::const_iterator pkeyIt = projectionKeys.constBegin();
for ( ; pkeyIt != projectionKeys.constEnd(); ++pkeyIt )
{
if ( pkeyIt->contains( QLatin1String( "srcTransform" ) ) || pkeyIt->contains( QLatin1String( "destTransform" ) ) )
{
QStringList split = pkeyIt->split( '/' );
QString srcAuthId, destAuthId;
if ( ! split.isEmpty() )
{
srcAuthId = split.at( 0 );
}
if ( split.size() > 1 )
{
destAuthId = split.at( 1 ).split( '_' ).at( 0 );
}
if ( pkeyIt->contains( QLatin1String( "srcTransform" ) ) )
{
transforms[ qMakePair( srcAuthId, destAuthId )].first = mSettings->value( *pkeyIt ).toInt();
}
else if ( pkeyIt->contains( QLatin1String( "destTransform" ) ) )
{
transforms[ qMakePair( srcAuthId, destAuthId )].second = mSettings->value( *pkeyIt ).toInt();
}
}
}
mSettings->endGroup();
QMap< QPair< QString, QString >, QPair< int, int > >::const_iterator transformIt = transforms.constBegin();
for ( ; transformIt != transforms.constEnd(); ++transformIt )
{
const QPair< int, int > &v = transformIt.value();
QTreeWidgetItem *item = new QTreeWidgetItem();
item->setText( 0, transformIt.key().first );
item->setText( 1, transformIt.key().second );
item->setText( 2, QString::number( v.first ) );
item->setText( 3, QString::number( v.second ) );
mDefaultDatumTransformTreeWidget->addTopLevelItem( item );
}
connect( mAddDefaultTransformButton, &QAbstractButton::clicked, this, &QgsOptions::addDefaultTransformation );
connect( mRemoveDefaultTransformButton, &QAbstractButton::clicked, this, &QgsOptions::removeDefaultTransformation );
// Set the units for measuring
mDistanceUnitsComboBox->addItem( tr( "Meters" ), QgsUnitTypes::DistanceMeters );
@ -1560,7 +1526,7 @@ void QgsOptions::saveOptions()
mStyleSheetBuilder->saveToSettings( mStyleSheetNewOpts );
}
saveDefaultDatumTransformations();
mDefaultDatumTransformTableModel->transformContext().writeSettings();
mLocatorOptionsWidget->commitChanges();
@ -2255,72 +2221,71 @@ void QgsOptions::saveMinMaxLimits( QComboBox *cbox, const QString &name )
mSettings->setValue( "/Raster/defaultContrastEnhancementLimits/" + name, value );
}
void QgsOptions::removeDefaultTransformation()
void QgsOptions::addDefaultDatumTransform()
{
QList<QTreeWidgetItem *> items = mDefaultDatumTransformTreeWidget->selectedItems();
for ( int i = 0; i < items.size(); ++i )
QgsDatumTransformDialog *dlg = new QgsDatumTransformDialog();
if ( dlg->exec() )
{
int idx = mDefaultDatumTransformTreeWidget->indexOfTopLevelItem( items.at( i ) );
if ( idx >= 0 )
{
delete mDefaultDatumTransformTreeWidget->takeTopLevelItem( idx );
}
QPair< QPair<QgsCoordinateReferenceSystem, int>, QPair<QgsCoordinateReferenceSystem, int > > dt = dlg->selectedDatumTransforms();
QgsCoordinateTransformContext context = mDefaultDatumTransformTableModel->transformContext();
context.addSourceDestinationDatumTransform( dt.first.first, dt.second.first, dt.first.second, dt.second.second );
mDefaultDatumTransformTableModel->setTransformContext( context );
}
}
void QgsOptions::addDefaultTransformation()
void QgsOptions::removeDefaultDatumTransform()
{
QTreeWidgetItem *item = new QTreeWidgetItem();
item->setText( 0, QLatin1String( "" ) );
item->setText( 1, QLatin1String( "" ) );
item->setText( 2, QLatin1String( "" ) );
item->setText( 3, QLatin1String( "" ) );
item->setFlags( Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsEditable );
mDefaultDatumTransformTreeWidget->addTopLevelItem( item );
QModelIndexList selectedIndexes = mDefaultDatumTransformTableView->selectionModel()->selectedIndexes();
if ( selectedIndexes.count() > 0 )
{
mDefaultDatumTransformTableModel->removeTransform( selectedIndexes );
}
}
void QgsOptions::saveDefaultDatumTransformations()
void QgsOptions::editDefaultDatumTransform()
{
QgsSettings s;
s.beginGroup( QStringLiteral( "/Projections" ) );
QStringList groupKeys = s.allKeys();
QStringList::const_iterator groupKeyIt = groupKeys.constBegin();
for ( ; groupKeyIt != groupKeys.constEnd(); ++groupKeyIt )
QModelIndexList selectedIndexes = mDefaultDatumTransformTableView->selectionModel()->selectedIndexes();
if ( selectedIndexes.count() > 0 )
{
if ( groupKeyIt->contains( QLatin1String( "srcTransform" ) ) || groupKeyIt->contains( QLatin1String( "destTransform" ) ) )
QgsCoordinateReferenceSystem sourceCrs;
QgsCoordinateReferenceSystem destinationCrs;
int sourceTransform = -1;
int destinationTransform = -1;
for ( QModelIndexList::const_iterator it = selectedIndexes.constBegin(); it != selectedIndexes.constEnd(); it ++ )
{
s.remove( *groupKeyIt );
if ( it->column() == QgsDatumTransformTableModel::SourceCrsColumn )
{
sourceCrs = QgsCoordinateReferenceSystem( mDefaultDatumTransformTableModel->data( *it, Qt::DisplayRole ).toString() );
}
if ( it->column() == QgsDatumTransformTableModel::DestinationCrsColumn )
{
destinationCrs = QgsCoordinateReferenceSystem( mDefaultDatumTransformTableModel->data( *it, Qt::DisplayRole ).toString() );
}
if ( it->column() == QgsDatumTransformTableModel::SourceTransformColumn )
{
sourceTransform = mDefaultDatumTransformTableModel->data( *it, Qt::UserRole ).toInt();
}
if ( it->column() == QgsDatumTransformTableModel::DestinationTransformColumn )
{
destinationTransform = mDefaultDatumTransformTableModel->data( *it, Qt::UserRole ).toInt();
}
}
if ( sourceCrs.isValid() && destinationCrs.isValid() &&
( sourceTransform != -1 || destinationTransform != -1 ) )
{
QgsDatumTransformDialog *dlg = new QgsDatumTransformDialog( sourceCrs, destinationCrs, qMakePair( sourceTransform, destinationTransform ) );
if ( dlg->exec() )
{
QPair< QPair<QgsCoordinateReferenceSystem, int>, QPair<QgsCoordinateReferenceSystem, int > > dt = dlg->selectedDatumTransforms();
QgsCoordinateTransformContext context = mDefaultDatumTransformTableModel->transformContext();
// QMap::insert takes care of replacing existing value
context.addSourceDestinationDatumTransform( sourceCrs, destinationCrs, dt.first.second, dt.second.second );
mDefaultDatumTransformTableModel->setTransformContext( context );
}
}
}
int nDefaultTransforms = mDefaultDatumTransformTreeWidget->topLevelItemCount();
for ( int i = 0; i < nDefaultTransforms; ++i )
{
QTreeWidgetItem *item = mDefaultDatumTransformTreeWidget->topLevelItem( i );
QString srcAuthId = item->text( 0 );
QString destAuthId = item->text( 1 );
if ( srcAuthId.isEmpty() || destAuthId.isEmpty() )
{
continue;
}
bool conversionOk;
int srcDatumTransform = item->text( 2 ).toInt( &conversionOk );
if ( conversionOk )
{
s.setValue( srcAuthId + "//" + destAuthId + "_srcTransform", srcDatumTransform );
}
int destDatumTransform = item->text( 3 ).toInt( &conversionOk );
if ( conversionOk )
{
s.setValue( srcAuthId + "//" + destAuthId + "_destTransform", destDatumTransform );
}
}
s.endGroup();
}
void QgsOptions::addColor()
{
QColor newColor = QgsColorDialog::getColor( QColor(), this->parentWidget(), tr( "Select color" ), true );

View File

@ -25,6 +25,7 @@
#include "qgshelp.h"
#include "qgscoordinatereferencesystem.h"
#include "qgsdatumtransformtablemodel.h"
#include <QList>
#include "qgis_app.h"
@ -227,11 +228,17 @@ class APP_EXPORT QgsOptions : public QgsOptionsDialogBase, private Ui::QgsOption
/* Save the list of which gdal drivers should be used. */
void saveGdalDriverList();
void removeDefaultTransformation();
void addDefaultTransformation();
void addColor();
//! add a new datum transform
void addDefaultDatumTransform();
//! remove currently selected datum transform
void removeDefaultDatumTransform();
//! edit currently selected datum transform
void editDefaultDatumTransform();
private:
QgsSettings *mSettings = nullptr;
QStringList i18nList();
@ -248,8 +255,6 @@ class APP_EXPORT QgsOptions : public QgsOptionsDialogBase, private Ui::QgsOption
//! Generate table row for custom environment variables
void addCustomEnvVarRow( const QString &varName, const QString &varVal, const QString &varApply = QString() );
void saveDefaultDatumTransformations();
void showHelp();
QListWidgetItem *addScaleToScaleList( const QString &newScale );
@ -267,7 +272,7 @@ class APP_EXPORT QgsOptions : public QgsOptionsDialogBase, private Ui::QgsOption
QList< QgsOptionsPageWidget * > mAdditionalOptionWidgets;
QgsLocatorOptionsWidget *mLocatorOptionsWidget = nullptr;
QgsDatumTransformTableModel *mDefaultDatumTransformTableModel = new QgsDatumTransformTableModel( this );
};
#endif // #ifndef QGSOPTIONS_H

View File

@ -1297,7 +1297,6 @@ void QgsProjectProperties::editDatumTransform()
}
}
}
}
void QgsProjectProperties::cbxWFSPubliedStateChanged( int aIdx )

View File

@ -17,6 +17,8 @@
#include "qgscoordinatetransformcontext.h"
#include "qgscoordinatetransformcontext_p.h"
#include "qgssettings.h"
QgsCoordinateTransformContext::QgsCoordinateTransformContext()
: d( new QgsCoordinateTransformContextPrivate() )
{}
@ -37,8 +39,10 @@ void QgsCoordinateTransformContext::clear()
// play it safe
d->mLock.lockForWrite();
d->mSourceDestDatumTransforms.clear();
#if 0
d->mSourceDatumTransforms.clear();
d->mDestDatumTransforms.clear();
#endif
d->mLock.unlock();
}
@ -163,8 +167,10 @@ void QgsCoordinateTransformContext::readXml( const QDomElement &element, const Q
d->mLock.lockForWrite();
d->mSourceDestDatumTransforms.clear();
#if 0
d->mSourceDatumTransforms.clear();
d->mDestDatumTransforms.clear();
#endif
const QDomNodeList contextNodes = element.elementsByTagName( QStringLiteral( "transformContext" ) );
if ( contextNodes.count() < 1 )
@ -192,6 +198,7 @@ void QgsCoordinateTransformContext::readXml( const QDomElement &element, const Q
}
}
#if 0
// src transforms
const QDomNodeList srcNodes = contextElem.elementsByTagName( QStringLiteral( "source" ) );
for ( int i = 0; i < srcNodes .size(); ++i )
@ -219,6 +226,7 @@ void QgsCoordinateTransformContext::readXml( const QDomElement &element, const Q
d->mDestDatumTransforms.insert( key, value );
}
}
#endif
d->mLock.unlock();
}
@ -240,6 +248,7 @@ void QgsCoordinateTransformContext::writeXml( QDomElement &element, QDomDocument
contextElem.appendChild( transformElem );
}
#if 0
// src transforms
for ( auto it = d->mSourceDatumTransforms.constBegin(); it != d->mSourceDatumTransforms.constEnd(); ++ it )
{
@ -257,7 +266,92 @@ void QgsCoordinateTransformContext::writeXml( QDomElement &element, QDomDocument
transformElem.setAttribute( QStringLiteral( "transform" ), it.value() );
contextElem.appendChild( transformElem );
}
#endif
element.appendChild( contextElem );
d->mLock.unlock();
}
void QgsCoordinateTransformContext::readSettings()
{
d.detach();
d->mLock.lockForWrite();
d->mSourceDestDatumTransforms.clear();
#if 0
d->mSourceDatumTransforms.clear();
d->mDestDatumTransforms.clear();
#endif
QgsSettings *settings = new QgsSettings();
settings->beginGroup( QStringLiteral( "/Projections" ) );
QStringList projectionKeys = settings->allKeys();
//collect src and dest entries that belong together
QMap< QPair< QString, QString >, QPair< int, int > > transforms;
QStringList::const_iterator pkeyIt = projectionKeys.constBegin();
for ( ; pkeyIt != projectionKeys.constEnd(); ++pkeyIt )
{
if ( pkeyIt->contains( QLatin1String( "srcTransform" ) ) || pkeyIt->contains( QLatin1String( "destTransform" ) ) )
{
QStringList split = pkeyIt->split( '/' );
QString srcAuthId, destAuthId;
if ( ! split.isEmpty() )
{
srcAuthId = split.at( 0 );
}
if ( split.size() > 1 )
{
destAuthId = split.at( 1 ).split( '_' ).at( 0 );
}
if ( pkeyIt->contains( QLatin1String( "srcTransform" ) ) )
{
transforms[ qMakePair( srcAuthId, destAuthId )].first = settings->value( *pkeyIt ).toInt();
}
else if ( pkeyIt->contains( QLatin1String( "destTransform" ) ) )
{
transforms[ qMakePair( srcAuthId, destAuthId )].second = settings->value( *pkeyIt ).toInt();
}
}
}
// add transforms to context
QMap< QPair< QString, QString >, QPair< int, int > >::const_iterator transformIt = transforms.constBegin();
for ( ; transformIt != transforms.constEnd(); ++transformIt )
{
d->mSourceDestDatumTransforms.insert( transformIt.key(), transformIt.value() );
}
d->mLock.unlock();
settings->endGroup();
}
void QgsCoordinateTransformContext::writeSettings()
{
QgsSettings s;
s.beginGroup( QStringLiteral( "/Projections" ) );
QStringList groupKeys = s.allKeys();
QStringList::const_iterator groupKeyIt = groupKeys.constBegin();
for ( ; groupKeyIt != groupKeys.constEnd(); ++groupKeyIt )
{
if ( groupKeyIt->contains( QLatin1String( "srcTransform" ) ) || groupKeyIt->contains( QLatin1String( "destTransform" ) ) )
{
s.remove( *groupKeyIt );
}
}
QMap< QPair< QString, QString >, QPair< int, int > >::const_iterator transformIt = d->mSourceDestDatumTransforms.constBegin();
for ( ; transformIt != d->mSourceDestDatumTransforms.constEnd(); ++transformIt )
{
QString srcAuthId = transformIt.key().first;
QString destAuthId = transformIt.key().second;
int sourceDatumTransform = transformIt.value().first;
int destinationDatumTransform = transformIt.value().second;
s.setValue( srcAuthId + "//" + destAuthId + "_srcTransform", sourceDatumTransform );
s.setValue( srcAuthId + "//" + destAuthId + "_destTransform", destinationDatumTransform );
}
s.endGroup();
}

View File

@ -24,6 +24,7 @@
class QgsReadWriteContext;
/***************************************************************************
* This class is considered CRITICAL and any change MUST be accompanied with
* full unit tests in testqgsfeature.cpp.
@ -242,6 +243,19 @@ class CORE_EXPORT QgsCoordinateTransformContext
void writeXml( QDomElement &element, QDomDocument &document, const QgsReadWriteContext &context ) const;
/**
* Reads the context's state from application settings.
* \see readSettings()
*/
void readSettings();
/**
* Write the context's state to application settings.
* \see writeSettings()
*/
void writeSettings();
private:
QExplicitlySharedDataPointer<QgsCoordinateTransformContextPrivate> d;

View File

@ -50,8 +50,10 @@ class QgsCoordinateTransformContextPrivate : public QSharedData
{
other.mLock.lockForRead();
mSourceDestDatumTransforms = other.mSourceDestDatumTransforms;
#if 0
mSourceDatumTransforms = other.mSourceDatumTransforms;
mDestDatumTransforms = other.mDestDatumTransforms;
#endif
other.mLock.unlock();
}
@ -61,11 +63,13 @@ class QgsCoordinateTransformContextPrivate : public QSharedData
*/
QMap< QPair< QString, QString >, QPair< int, int > > mSourceDestDatumTransforms;
#if 0
//! Mapping for datum transforms to use for source CRS
QMap< QString, int > mSourceDatumTransforms;
//! Mapping for datum transforms to use for destination CRS
QMap< QString, int > mDestDatumTransforms;
#endif
//! Mutex for making QgsCoordinateTransformContextPrivate thread safe
mutable QReadWriteLock mLock;

View File

@ -337,8 +337,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>848</width>
<height>812</height>
<width>577</width>
<height>766</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_28">
@ -1032,7 +1032,7 @@
<rect>
<x>0</x>
<y>0</y>
<width>848</width>
<width>545</width>
<height>1114</height>
</rect>
</property>
@ -1568,8 +1568,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>848</width>
<height>812</height>
<width>540</width>
<height>705</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_27">
@ -1936,7 +1936,7 @@
<rect>
<x>0</x>
<y>0</y>
<width>848</width>
<width>717</width>
<height>1020</height>
</rect>
</property>
@ -2687,8 +2687,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>848</width>
<height>812</height>
<width>140</width>
<height>276</height>
</rect>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_46">
@ -2838,8 +2838,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>848</width>
<height>812</height>
<width>532</width>
<height>236</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_25">
@ -4679,30 +4679,6 @@ The bigger the number, the faster zooming with the mouse wheel will be.</string>
</item>
</layout>
</item>
<item row="4" column="0">
<widget class="QTreeWidget" name="mDefaultDatumTransformTreeWidget">
<column>
<property name="text">
<string>Source CRS</string>
</property>
</column>
<column>
<property name="text">
<string>Destination CRS</string>
</property>
</column>
<column>
<property name="text">
<string>Source datum transform</string>
</property>
</column>
<column>
<property name="text">
<string>Destination datum transform</string>
</property>
</column>
</widget>
</item>
<item row="1" column="0">
<widget class="Line" name="line_2">
<property name="orientation">
@ -4710,6 +4686,9 @@ The bigger the number, the faster zooming with the mouse wheel will be.</string>
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QTableView" name="mDefaultDatumTransformTableView"/>
</item>
</layout>
</widget>
</item>
@ -4796,8 +4775,8 @@ The bigger the number, the faster zooming with the mouse wheel will be.</string>
<rect>
<x>0</x>
<y>0</y>
<width>848</width>
<height>812</height>
<width>641</width>
<height>764</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_33">

View File

@ -259,8 +259,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>676</width>
<height>764</height>
<width>565</width>
<height>697</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_8">
@ -797,8 +797,7 @@
</property>
<layout class="QVBoxLayout" name="verticalLayout_21">
<item>
<widget class="QgsProjectionSelectionTreeWidget" name="projectionSelector" native="true">
</widget>
<widget class="QgsProjectionSelectionTreeWidget" name="projectionSelector" native="true"/>
</item>
</layout>
</widget>
@ -831,9 +830,6 @@
</property>
</widget>
</item>
<item row="2" column="0" colspan="4">
<widget class="QTableView" name="mDatumTransformTableView"/>
</item>
<item row="1" column="0">
<widget class="QToolButton" name="mDatumTransformAddButton">
<property name="text">
@ -868,8 +864,10 @@
</property>
</widget>
</item>
<item row="2" column="0" colspan="4">
<widget class="QTableView" name="mDatumTransformTableView"/>
</item>
</layout>
<zorder>cbxProjectionEnabled</zorder>
<zorder>mDatumTransformTableView</zorder>
<zorder>mDatumTransformAddButton</zorder>
<zorder>mDatumTransformRemoveButton</zorder>
@ -910,8 +908,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>676</width>
<height>764</height>
<width>133</width>
<height>100</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_10">
@ -996,8 +994,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>676</width>
<height>764</height>
<width>269</width>
<height>597</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_12">
@ -1434,7 +1432,7 @@
<rect>
<x>0</x>
<y>0</y>
<width>676</width>
<width>598</width>
<height>2363</height>
</rect>
</property>
@ -2535,8 +2533,8 @@
<rect>
<x>0</x>
<y>0</y>
<width>676</width>
<height>764</height>
<width>156</width>
<height>59</height>
</rect>
</property>
<layout class="QVBoxLayout" name="verticalLayout_17">
@ -2689,47 +2687,47 @@
</layout>
</widget>
<customwidgets>
<customwidget>
<class>QgsCollapsibleGroupBox</class>
<extends>QGroupBox</extends>
<header>qgscollapsiblegroupbox.h</header>
<container>1</container>
</customwidget>
<customwidget>
<class>QgsFilterLineEdit</class>
<extends>QLineEdit</extends>
<header>qgsfilterlineedit.h</header>
</customwidget>
<customwidget>
<class>QgsScrollArea</class>
<extends>QScrollArea</extends>
<header>qgsscrollarea.h</header>
<container>1</container>
</customwidget>
<customwidget>
<class>QgsCollapsibleGroupBox</class>
<extends>QGroupBox</extends>
<header>qgscollapsiblegroupbox.h</header>
<container>1</container>
</customwidget>
<customwidget>
<class>QgsColorButton</class>
<extends>QToolButton</extends>
<header>qgscolorbutton.h</header>
<container>1</container>
</customwidget>
<customwidget>
<class>QgsOpacityWidget</class>
<extends>QWidget</extends>
<header>qgsopacitywidget.h</header>
<container>1</container>
</customwidget>
<customwidget>
<class>QgsVariableEditorWidget</class>
<extends>QWidget</extends>
<header location="global">qgsvariableeditorwidget.h</header>
<container>1</container>
</customwidget>
<customwidget>
<class>QgsFilterLineEdit</class>
<extends>QLineEdit</extends>
<header>qgsfilterlineedit.h</header>
</customwidget>
<customwidget>
<class>QgsColorSchemeList</class>
<extends>QWidget</extends>
<header location="global">qgscolorschemelist.h</header>
<container>1</container>
</customwidget>
<customwidget>
<class>QgsOpacityWidget</class>
<extends>QWidget</extends>
<header>qgsopacitywidget.h</header>
<container>1</container>
</customwidget>
<customwidget>
<class>QgsCodeEditorPython</class>
<extends>QWidget</extends>
@ -2882,6 +2880,7 @@
<include location="../../images/images.qrc"/>
<include location="../../images/images.qrc"/>
<include location="../../images/images.qrc"/>
<include location="../../images/images.qrc"/>
</resources>
<connections>
<connection>