22QgsProcessingTinInputLayersWidget::QgsProcessingTinInputLayersWidget( 
QgsProject *project ):
 
   23  mInputLayersModel( project )
 
   29  connect( mButtonAdd, &QToolButton::clicked, 
this, &QgsProcessingTinInputLayersWidget::onCurrentLayerAdded );
 
   30  connect( mButtonRemove, &QToolButton::clicked, 
this, &QgsProcessingTinInputLayersWidget::onLayersRemove );
 
   31  connect( &mInputLayersModel, &QgsProcessingTinInputLayersModel::dataChanged, 
this, &QgsProcessingTinInputLayersWidget::changed );
 
   33  onLayerChanged( mComboLayers->currentLayer() );
 
   35  mTableView->setModel( &mInputLayersModel );
 
   36  mTableView->setItemDelegateForColumn( 1, 
new QgsProcessingTinInputLayersDelegate( mTableView ) );
 
   39QVariant QgsProcessingTinInputLayersWidget::value()
 const 
   41  const QList<QgsProcessingParameterTinInputLayers::InputLayer> &layers = mInputLayersModel.layers();
 
   47    layerMap[QStringLiteral( 
"source" )] = layer.source;
 
   48    layerMap[QStringLiteral( 
"type" )] = 
static_cast< int >( layer.type );
 
   49    layerMap[QStringLiteral( 
"attributeIndex" )] = layer.attributeIndex;
 
   50    list.append( layerMap );
 
   56void QgsProcessingTinInputLayersWidget::setValue( 
const QVariant &value )
 
   58  mInputLayersModel.clear();
 
   59  if ( !value.isValid() || value.userType() != QMetaType::Type::QVariantList )
 
   62  const QVariantList list = value.toList();
 
   64  for ( 
const QVariant &layerValue : list )
 
   66    if ( layerValue.userType() != QMetaType::Type::QVariantMap )
 
   68    const QVariantMap layerMap = layerValue.toMap();
 
   70    layer.
source = layerMap.value( QStringLiteral( 
"source" ) ).toString();
 
   72    layer.
attributeIndex = layerMap.value( QStringLiteral( 
"attributeIndex" ) ).toInt();
 
   73    mInputLayersModel.addLayer( layer );
 
   79void QgsProcessingTinInputLayersWidget::setProject( 
QgsProject *project )
 
   81  mInputLayersModel.setProject( project );
 
   84void QgsProcessingTinInputLayersWidget::onLayerChanged( 
QgsMapLayer *layer )
 
   86  QgsVectorLayer *newLayer = qobject_cast<QgsVectorLayer *>( layer );
 
   88  if ( !newLayer || !newLayer->
isValid() )
 
   96  mComboFields->setLayer( newLayer );
 
   97  mComboFields->setCurrentIndex( 0 );
 
  101void QgsProcessingTinInputLayersWidget::onCurrentLayerAdded()
 
  103  QgsVectorLayer *currentLayer = qobject_cast<QgsVectorLayer *>( mComboLayers->currentLayer() );
 
  107  layer.
source = mComboLayers->currentLayer()->id();
 
  123  if ( mCheckBoxUseZCoordinate->isChecked() && mCheckBoxUseZCoordinate->isEnabled() )
 
  128  mInputLayersModel.addLayer( layer );
 
  133void QgsProcessingTinInputLayersWidget::QgsProcessingTinInputLayersWidget::onLayersRemove()
 
  135  mInputLayersModel.removeLayer( mTableView->selectionModel()->currentIndex().row() );
 
  140QgsProcessingTinInputLayersModel::QgsProcessingTinInputLayersModel( 
QgsProject *project ):
 
  144int QgsProcessingTinInputLayersModel::rowCount( 
const QModelIndex &parent )
 const 
  147  return mInputLayers.count();
 
  150int QgsProcessingTinInputLayersModel::columnCount( 
const QModelIndex &parent )
 const 
  156QVariant QgsProcessingTinInputLayersModel::data( 
const QModelIndex &index, 
int role )
 const 
  158  if ( !index.isValid() )
 
  161  if ( index.row() >= mInputLayers.count() )
 
  166    case Qt::DisplayRole:
 
  169      switch ( index.column() )
 
  173            return layer->
name();
 
  178          switch ( mInputLayers.at( index.row() ).type )
 
  181              return tr( 
"Vertices" );
 
  184              return tr( 
"Break Lines" );
 
  192          const int attributeindex = mInputLayers.at( index.row() ).attributeIndex;
 
  193          if ( attributeindex < 0 )
 
  194            return tr( 
"Z coordinate" );
 
  197            if ( attributeindex < layer->fields().count() )
 
  200              return tr( 
"Invalid field" );
 
  206    case Qt::ForegroundRole:
 
  207      if ( index.column() == 2 )
 
  209        const int attributeindex = mInputLayers.at( index.row() ).attributeIndex;
 
  210        if ( attributeindex < 0 )
 
  211          return QColor( Qt::darkGray );
 
  215      if ( index.column() == 2 )
 
  217        const int attributeindex = mInputLayers.at( index.row() ).attributeIndex;
 
  218        if ( attributeindex < 0 )
 
  221          font.setItalic( 
true );
 
  227      if ( index.column() == 1 )
 
  228        return static_cast< int >( mInputLayers.at( index.row() ).type );
 
  236bool QgsProcessingTinInputLayersModel::setData( 
const QModelIndex &index, 
const QVariant &value, 
int role )
 
  238  if ( index.column() == 1 && role == Qt::EditRole )
 
  241    emit dataChanged( QAbstractTableModel::index( index.row(), 1 ), QAbstractTableModel::index( index.row(), 1 ) );
 
  247Qt::ItemFlags QgsProcessingTinInputLayersModel::flags( 
const QModelIndex &index )
 const 
  249  if ( !index.isValid() )
 
  250    return Qt::NoItemFlags;
 
  252  if ( index.column() == 1 )
 
  253    return QAbstractTableModel::flags( index ) | Qt::ItemIsEditable;
 
  255  return QAbstractTableModel::flags( index );
 
  258QVariant QgsProcessingTinInputLayersModel::headerData( 
int section, Qt::Orientation orientation, 
int role )
 const 
  260  if ( orientation == Qt::Horizontal && role == Qt::DisplayRole )
 
  265        return tr( 
"Vector Layer" );
 
  271        return tr( 
"Z Value Attribute" );
 
  284  beginInsertRows( QModelIndex(), mInputLayers.count() - 1, mInputLayers.count() - 1 );
 
  285  mInputLayers.append( layer );
 
  289void QgsProcessingTinInputLayersModel::removeLayer( 
int index )
 
  291  if ( index < 0 || index >= mInputLayers.count() )
 
  293  beginRemoveRows( QModelIndex(), index, index );
 
  294  mInputLayers.removeAt( index );
 
  298void QgsProcessingTinInputLayersModel::clear()
 
  300  mInputLayers.clear();
 
  303QList<QgsProcessingParameterTinInputLayers::InputLayer> QgsProcessingTinInputLayersModel::layers()
 const 
  308void QgsProcessingTinInputLayersModel::setProject( 
QgsProject *project )
 
  313QWidget *QgsProcessingTinInputLayersDelegate::createEditor( QWidget *parent, 
const QStyleOptionViewItem &option, 
const QModelIndex &index )
 const 
  317  QComboBox *comboType = 
new QComboBox( parent );
 
  323void QgsProcessingTinInputLayersDelegate::setEditorData( QWidget *editor, 
const QModelIndex &index )
 const 
  325  QComboBox *comboType = qobject_cast<QComboBox *>( editor );
 
  326  Q_ASSERT( comboType );
 
  329  const int comboIndex = comboType->findData( 
static_cast< int >( type ) );
 
  330  if ( comboIndex >= 0 )
 
  331    comboType->setCurrentIndex( comboIndex );
 
  333    comboType->setCurrentIndex( 0 );
 
  336void QgsProcessingTinInputLayersDelegate::setModelData( QWidget *editor, QAbstractItemModel *model, 
const QModelIndex &index )
 const 
  338  QComboBox *comboType = qobject_cast<QComboBox *>( editor );
 
  339  Q_ASSERT( comboType );
 
  340  model->setData( index, comboType->currentData(), Qt::EditRole );
 
  347QString QgsProcessingTinInputLayersWidgetWrapper::parameterType()
 const 
  349  return QStringLiteral( 
"tininputlayers" );
 
  354  return new QgsProcessingTinInputLayersWidgetWrapper( parameter, type );
 
  357QStringList QgsProcessingTinInputLayersWidgetWrapper::compatibleParameterTypes()
 const 
  363QStringList QgsProcessingTinInputLayersWidgetWrapper::compatibleOutputTypes()
 const {
return QStringList();}
 
  365QWidget *QgsProcessingTinInputLayersWidgetWrapper::createWidget()
 
  367  mWidget = 
new QgsProcessingTinInputLayersWidget( widgetContext().project() );
 
  368  connect( mWidget, &QgsProcessingTinInputLayersWidget::changed, 
this, [ = ]
 
  370    emit widgetValueHasChanged( 
this );
 
  376void QgsProcessingTinInputLayersWidgetWrapper::setWidgetValue( 
const QVariant &value, 
QgsProcessingContext &context )
 
  380  mWidget->setValue( value );
 
  381  mWidget->setProject( context.
project() );
 
  384QVariant QgsProcessingTinInputLayersWidgetWrapper::widgetValue()
 const 
  387    return mWidget->value();
 
ProcessingTinInputLayerType
Defines the type of input layer for a Processing TIN input.
 
@ BreakLines
Input that adds vertices and break lines.
 
@ Vertices
Input that adds only vertices.
 
QgsField at(int i) const
Returns the field at particular index (must be in range 0..N-1).
 
void layerChanged(QgsMapLayer *layer)
Emitted whenever the currently selected layer changes.
 
Base class for all map layer types.
 
Contains information about the context in which a processing algorithm is executed.
 
QgsProject * project() const
Returns the project in which the algorithm is being executed.
 
WidgetType
Types of dialogs which Processing widgets can be created for.
 
Base class for the definition of processing parameters.
 
Encapsulates a QGIS project, including sets of map layers and their styles, layouts,...
 
static QgsProject * instance()
Returns the QgsProject singleton instance.
 
Q_INVOKABLE QgsMapLayer * mapLayer(const QString &layerId) const
Retrieve a pointer to a registered layer by layer ID.
 
This is the base class for vector data providers.
 
Qgis::WkbType wkbType() const override=0
Returns the geometry type which is returned by this layer.
 
Represents a vector layer which manages a vector based data sets.
 
QgsVectorDataProvider * dataProvider() FINAL
Returns the layer's data provider, it may be nullptr.
 
Q_INVOKABLE Qgis::GeometryType geometryType() const
Returns point, line or polygon.
 
static bool hasZ(Qgis::WkbType type)
Tests whether a WKB type contains the z-dimension.