Branch data Line data Source code
1 : : /*************************************************************************** 2 : : qgsprocessingparametertininputlayers.cpp 3 : : --------------------- 4 : : Date : August 2020 5 : : Copyright : (C) 2020 by Vincent Cloarec 6 : : Email : vcloarec at gmail dot com 7 : : *************************************************************************** 8 : : * * 9 : : * This program is free software; you can redistribute it and/or modify * 10 : : * it under the terms of the GNU General Public License as published by * 11 : : * the Free Software Foundation; either version 2 of the License, or * 12 : : * (at your option) any later version. * 13 : : * * 14 : : ***************************************************************************/ 15 : : 16 : : #include "qgsprocessingparametertininputlayers.h" 17 : : #include "qgsvectorlayer.h" 18 : : 19 : 0 : QgsProcessingParameterTinInputLayers::QgsProcessingParameterTinInputLayers( const QString &name, const QString &description ): 20 : 0 : QgsProcessingParameterDefinition( name, description ) 21 : 0 : {} 22 : : 23 : 0 : QgsProcessingParameterDefinition *QgsProcessingParameterTinInputLayers::clone() const 24 : : { 25 : 0 : return new QgsProcessingParameterTinInputLayers( name(), description() ); 26 : 0 : } 27 : : 28 : 0 : QString QgsProcessingParameterTinInputLayers::type() const 29 : : { 30 : 0 : return typeName(); 31 : : } 32 : : 33 : 0 : bool QgsProcessingParameterTinInputLayers::checkValueIsAcceptable( const QVariant &input, QgsProcessingContext *context ) const 34 : : { 35 : 0 : if ( input.type() != QVariant::List ) 36 : 0 : return false; 37 : : 38 : 0 : const QVariantList variantLayers = input.toList(); 39 : : 40 : 0 : if ( variantLayers.isEmpty() ) 41 : 0 : return false; 42 : : 43 : 0 : for ( const QVariant &variantLayer : variantLayers ) 44 : : { 45 : 0 : if ( variantLayer.type() != QVariant::Map ) 46 : 0 : return false; 47 : 0 : const QVariantMap layerMap = variantLayer.toMap(); 48 : : 49 : 0 : if ( !layerMap.contains( QStringLiteral( "source" ) ) || 50 : 0 : !layerMap.contains( QStringLiteral( "type" ) ) || 51 : 0 : !layerMap.contains( QStringLiteral( "attributeIndex" ) ) ) 52 : 0 : return false; 53 : : 54 : 0 : if ( !context ) 55 : 0 : continue; // when called without context, we will skip checking whether the layer can be resolved 56 : : 57 : 0 : QgsMapLayer *mapLayer = QgsProcessingUtils::mapLayerFromString( layerMap.value( QStringLiteral( "source" ) ).toString(), *context ); 58 : 0 : if ( !mapLayer || mapLayer->type() != QgsMapLayerType::VectorLayer ) 59 : 0 : return false; 60 : : 61 : 0 : QgsVectorLayer *vectorLayer = static_cast<QgsVectorLayer *>( mapLayer ); 62 : : 63 : 0 : if ( layerMap.value( QStringLiteral( "attributeIndex" ) ).toInt() >= vectorLayer->fields().count() ) 64 : 0 : return false; 65 : 0 : } 66 : : 67 : 0 : return true; 68 : 0 : } 69 : : 70 : 0 : QString QgsProcessingParameterTinInputLayers::valueAsPythonString( const QVariant &value, QgsProcessingContext &context ) const 71 : : { 72 : 0 : Q_UNUSED( context ); 73 : 0 : QStringList parts; 74 : 0 : const QVariantList variantLayers = value.toList(); 75 : 0 : for ( const QVariant &variantLayer : variantLayers ) 76 : : { 77 : 0 : const QVariantMap layerMap = variantLayer.toMap(); 78 : 0 : QStringList layerDefParts; 79 : 0 : layerDefParts << QStringLiteral( "'source': " ) + QgsProcessingUtils::variantToPythonLiteral( layerMap.value( QStringLiteral( "source" ) ) ); 80 : 0 : layerDefParts << QStringLiteral( "'type': " ) + QgsProcessingUtils::variantToPythonLiteral( layerMap.value( QStringLiteral( "type" ) ) ); 81 : 0 : layerDefParts << QStringLiteral( "'attributeIndex': " ) + QgsProcessingUtils::variantToPythonLiteral( layerMap.value( QStringLiteral( "attributeIndex" ) ) ); 82 : 0 : QString layerDef = QStringLiteral( "{%1}" ).arg( layerDefParts.join( ',' ) ); 83 : 0 : parts.append( layerDef ); 84 : 0 : } 85 : 0 : return parts.join( ',' ).prepend( '[' ).append( ']' ); 86 : 0 : } 87 : : 88 : 0 : QString QgsProcessingParameterTinInputLayers::asPythonString( QgsProcessing::PythonOutputType outputType ) const 89 : : { 90 : 0 : switch ( outputType ) 91 : : { 92 : : case QgsProcessing::PythonQgsProcessingAlgorithmSubclass: 93 : : { 94 : 0 : QString code = QStringLiteral( "QgsProcessingParameterTinInputLayers('%1', '%2')" ).arg( name(), description() ); 95 : 0 : return code; 96 : 0 : } 97 : : } 98 : 0 : return QString(); 99 : 0 : }