Skip to content

Commit

Permalink
Move default file extension code to c++
Browse files Browse the repository at this point in the history
  • Loading branch information
nyalldawson committed Jun 21, 2017
1 parent b1879df commit e8a03b9
Show file tree
Hide file tree
Showing 5 changed files with 78 additions and 17 deletions.
8 changes: 0 additions & 8 deletions python/plugins/processing/tools/system.py
Expand Up @@ -74,14 +74,6 @@ def tempFolder():
return str(os.path.abspath(tempDir))


def setTempOutput(out, alg):
if hasattr(out, 'directory'):
out.value = getTempDirInTempFolder()
else:
ext = out.getDefaultFileExtension(alg)
out.value = getTempFilenameInTempFolder(out.name + '.' + ext)


def getTempFilename(ext=None):
tmpPath = tempFolder()
t = time.time()
Expand Down
12 changes: 11 additions & 1 deletion src/core/processing/qgsprocessingalgorithm.cpp
Expand Up @@ -95,6 +95,16 @@ QgsProcessingProvider *QgsProcessingAlgorithm::provider() const
void QgsProcessingAlgorithm::setProvider( QgsProcessingProvider *provider )
{
mProvider = provider;

// need to update all destination parameters to set whether the provider supports non file based outputs
Q_FOREACH ( const QgsProcessingParameterDefinition *definition, mParameters )
{
if ( definition->isDestination() && mProvider )
{
const QgsProcessingDestinationParameter *destParam = static_cast< const QgsProcessingDestinationParameter *>( definition );
const_cast< QgsProcessingDestinationParameter *>( destParam )->setSupportsNonFileBasedOutputs( mProvider->supportsNonFileBasedOutput() );
}
}
}

QWidget *QgsProcessingAlgorithm::createCustomParametersWidget( QWidget * ) const
Expand Down Expand Up @@ -214,7 +224,7 @@ bool QgsProcessingAlgorithm::addParameter( QgsProcessingParameterDefinition *def
if ( QgsProcessingAlgorithm::parameterDefinition( definition->name() ) )
return false;

if ( definition->isDestination() )
if ( definition->isDestination() && mProvider )
{
QgsProcessingDestinationParameter *destParam = static_cast< QgsProcessingDestinationParameter *>( definition );
destParam->setSupportsNonFileBasedOutputs( mProvider->supportsNonFileBasedOutput() );
Expand Down
41 changes: 40 additions & 1 deletion src/core/processing/qgsprocessingparameters.cpp
Expand Up @@ -20,6 +20,7 @@
#include "qgsprocessingutils.h"
#include "qgsvectorlayerfeatureiterator.h"
#include "qgsprocessingoutputs.h"
#include "qgssettings.h"

bool QgsProcessingParameters::isDynamic( const QVariantMap &parameters, const QString &name )
{
Expand Down Expand Up @@ -2057,6 +2058,19 @@ QgsProcessingOutputDefinition *QgsProcessingParameterFeatureSink::toOutputDefini
return new QgsProcessingOutputVectorLayer( name(), description(), mDataType );
}

QString QgsProcessingParameterFeatureSink::defaultFileExtension() const
{
QgsSettings settings;
if ( hasGeometry() )
{
return settings.value( QStringLiteral( "Processing/DefaultOutputVectorLayerExt" ), QStringLiteral( "shp" ), QgsSettings::Core ).toString();
}
else
{
return QStringLiteral( "dbf" );
}
}

QgsProcessingParameterDefinition::LayerType QgsProcessingParameterFeatureSink::dataType() const
{
return mDataType;
Expand Down Expand Up @@ -2156,6 +2170,12 @@ QgsProcessingOutputDefinition *QgsProcessingParameterRasterOutput::toOutputDefin
return new QgsProcessingOutputRasterLayer( name(), description() );
}

QString QgsProcessingParameterRasterOutput::defaultFileExtension() const
{
QgsSettings settings;
return settings.value( QStringLiteral( "Processing/DefaultOutputRasterLayerExt" ), QStringLiteral( "tif" ), QgsSettings::Core ).toString();
}


QgsProcessingParameterFileOutput::QgsProcessingParameterFileOutput( const QString &name, const QString &description, const QString &fileFilter, const QVariant &defaultValue, bool optional )
: QgsProcessingDestinationParameter( name, description, defaultValue, optional )
Expand Down Expand Up @@ -2218,6 +2238,20 @@ QgsProcessingOutputDefinition *QgsProcessingParameterFileOutput::toOutputDefinit
return nullptr;
}

QString QgsProcessingParameterFileOutput::defaultFileExtension() const
{
if ( mFileFilter.isEmpty() || mFileFilter == QObject::tr( "All files (*.*)" ) )
return QStringLiteral( "file" );

// get first extension from filter
QRegularExpression rx( ".*?\\(\\*\\.([a-zA-Z0-9._]+).*" );
QRegularExpressionMatch match = rx.match( mFileFilter );
if ( !match.hasMatch() )
return QStringLiteral( "file" );

return match.captured( 1 );
}

QString QgsProcessingParameterFileOutput::fileFilter() const
{
return mFileFilter;
Expand Down Expand Up @@ -2272,6 +2306,11 @@ QgsProcessingOutputDefinition *QgsProcessingParameterFolderOutput::toOutputDefin
return nullptr;
}

QString QgsProcessingParameterFolderOutput::defaultFileExtension() const
{
return QString();
}

QgsProcessingDestinationParameter::QgsProcessingDestinationParameter( const QString &name, const QString &description, const QVariant &defaultValue, bool optional )
: QgsProcessingParameterDefinition( name, description, defaultValue, optional )
{
Expand All @@ -2281,7 +2320,7 @@ QgsProcessingDestinationParameter::QgsProcessingDestinationParameter( const QStr
QVariantMap QgsProcessingDestinationParameter::toVariantMap() const
{
QVariantMap map = QgsProcessingParameterDefinition::toVariantMap();
map.insert( QStringLiteral( "support_non_file_outputs" ), mSupportsNonFileBasedOutputs );
map.insert( QStringLiteral( "supports_non_file_outputs" ), mSupportsNonFileBasedOutputs );
return map;
}

Expand Down
10 changes: 10 additions & 0 deletions src/core/processing/qgsprocessingparameters.h
Expand Up @@ -1307,6 +1307,12 @@ class CORE_EXPORT QgsProcessingDestinationParameter : public QgsProcessingParame
*/
void setSupportsNonFileBasedOutputs( bool supportsNonFileBasedOutputs ) { mSupportsNonFileBasedOutputs = supportsNonFileBasedOutputs; }

/**
* Returns the default file extension for destination file paths
* associated with this parameter.
*/
virtual QString defaultFileExtension() const = 0;

private:

bool mSupportsNonFileBasedOutputs = true;
Expand Down Expand Up @@ -1336,6 +1342,7 @@ class CORE_EXPORT QgsProcessingParameterFeatureSink : public QgsProcessingDestin
bool checkValueIsAcceptable( const QVariant &input, QgsProcessingContext *context = nullptr ) const override;
QString valueAsPythonString( const QVariant &value, QgsProcessingContext &context ) const override;
QgsProcessingOutputDefinition *toOutputDefinition() const override SIP_FACTORY;
QString defaultFileExtension() const override;

/**
* Returns the layer type for sinks associated with the parameter.
Expand Down Expand Up @@ -1433,6 +1440,7 @@ class CORE_EXPORT QgsProcessingParameterRasterOutput : public QgsProcessingDesti
bool checkValueIsAcceptable( const QVariant &input, QgsProcessingContext *context = nullptr ) const override;
QString valueAsPythonString( const QVariant &value, QgsProcessingContext &context ) const override;
QgsProcessingOutputDefinition *toOutputDefinition() const override SIP_FACTORY;
QString defaultFileExtension() const override;
};

/**
Expand All @@ -1457,6 +1465,7 @@ class CORE_EXPORT QgsProcessingParameterFileOutput : public QgsProcessingDestina
bool checkValueIsAcceptable( const QVariant &input, QgsProcessingContext *context = nullptr ) const override;
QString valueAsPythonString( const QVariant &value, QgsProcessingContext &context ) const override;
QgsProcessingOutputDefinition *toOutputDefinition() const override SIP_FACTORY;
QString defaultFileExtension() const override;

/**
* Returns the file filter string for files compatible with this output.
Expand Down Expand Up @@ -1498,6 +1507,7 @@ class CORE_EXPORT QgsProcessingParameterFolderOutput : public QgsProcessingDesti
QString type() const override { return QStringLiteral( "folderOut" ); }
bool checkValueIsAcceptable( const QVariant &input, QgsProcessingContext *context = nullptr ) const override;
QgsProcessingOutputDefinition *toOutputDefinition() const override SIP_FACTORY;
QString defaultFileExtension() const override;

};

Expand Down
24 changes: 17 additions & 7 deletions tests/src/core/testqgsprocessing.cpp
Expand Up @@ -106,13 +106,6 @@ class DummyAlgorithm : public QgsProcessingAlgorithm
QVERIFY( addParameter( p6 ) );
QCOMPARE( destinationParameterDefinitions(), QgsProcessingParameterDefinitions() << p5 << p6 );

// check that supportsNonFileBasedOutputs flags is set automatically to match provider
// when adding a destination parameter
QgsProcessingParameterFeatureSink *p7 = new QgsProcessingParameterFeatureSink( "p7" );
p7->setSupportsNonFileBasedOutputs( false );
QVERIFY( addParameter( p7 ) );
QVERIFY( destinationParameterDefinitions().at( 2 )->supportsNonFileBasedOutputs() );

// remove parameter
removeParameter( "non existent" );
removeParameter( "p6" );
Expand Down Expand Up @@ -346,6 +339,11 @@ void TestQgsProcessing::initTestCase()
{
QgsApplication::init();
QgsApplication::initQgis();

// Set up the QgsSettings environment
QCoreApplication::setOrganizationName( QStringLiteral( "QGIS" ) );
QCoreApplication::setOrganizationDomain( QStringLiteral( "qgis.org" ) );
QCoreApplication::setApplicationName( QStringLiteral( "QGIS-TEST" ) );
}

void TestQgsProcessing::cleanupTestCase()
Expand Down Expand Up @@ -2812,6 +2810,8 @@ void TestQgsProcessing::parameterFeatureSink()
QCOMPARE( def->valueAsPythonString( QVariant::fromValue( QgsProcessingOutputLayerDefinition( QgsProperty::fromExpression( "\"abc\" || \"def\"" ) ) ), context ), QStringLiteral( "QgsProcessingOutputLayerDefinition(QgsProperty.fromExpression('\"abc\" || \"def\"'))" ) );
QCOMPARE( def->valueAsPythonString( QVariant::fromValue( QgsProperty::fromExpression( "\"a\"=1" ) ), context ), QStringLiteral( "QgsProperty.fromExpression('\"a\"=1')" ) );

QCOMPARE( def->defaultFileExtension(), QStringLiteral( "shp" ) );

QVariantMap map = def->toVariantMap();
QgsProcessingParameterFeatureSink fromMap( "x" );
QVERIFY( fromMap.fromVariantMap( map ) );
Expand Down Expand Up @@ -2931,6 +2931,8 @@ void TestQgsProcessing::parameterRasterOut()
QVERIFY( def->checkValueIsAcceptable( "c:/Users/admin/Desktop/roads_clipped_transformed_v1_reprojected_final_clipped_aAAA.tif" ) );
QVERIFY( def->checkValueIsAcceptable( "c:/Users/admin/Desktop/roads_clipped_transformed_v1_reprojected_final_clipped_aAAA.tif", &context ) );

QCOMPARE( def->defaultFileExtension(), QStringLiteral( "tif" ) );

QVariantMap params;
params.insert( "non_optional", "test.tif" );
QCOMPARE( QgsProcessingParameters::parameterAsRasterOutputLayer( def.get(), params, context ), QStringLiteral( "test.tif" ) );
Expand Down Expand Up @@ -2981,8 +2983,16 @@ void TestQgsProcessing::parameterFileOut()
// not optional!
std::unique_ptr< QgsProcessingParameterFileOutput > def( new QgsProcessingParameterFileOutput( "non_optional", QString(), QStringLiteral( "BMP files (*.bmp)" ), QString(), false ) );
QCOMPARE( def->fileFilter(), QStringLiteral( "BMP files (*.bmp)" ) );
QCOMPARE( def->defaultFileExtension(), QStringLiteral( "bmp" ) );
def->setFileFilter( QStringLiteral( "PCX files (*.pcx)" ) );
QCOMPARE( def->fileFilter(), QStringLiteral( "PCX files (*.pcx)" ) );
QCOMPARE( def->defaultFileExtension(), QStringLiteral( "pcx" ) );
def->setFileFilter( QStringLiteral( "PCX files (*.pcx *.picx)" ) );
QCOMPARE( def->defaultFileExtension(), QStringLiteral( "pcx" ) );
def->setFileFilter( QStringLiteral( "PCX files (*.pcx *.picx);;BMP files (*.bmp)" ) );
QCOMPARE( def->defaultFileExtension(), QStringLiteral( "pcx" ) );
def->setFileFilter( QString() );
QCOMPARE( def->defaultFileExtension(), QStringLiteral( "file" ) );

QVERIFY( !def->checkValueIsAcceptable( false ) );
QVERIFY( !def->checkValueIsAcceptable( true ) );
Expand Down

0 comments on commit e8a03b9

Please sign in to comment.