22 QgsProcessingTinInputLayersWidget::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 Delegate( mTableView ) );
39 QVariant QgsProcessingTinInputLayersWidget::value()
const
41 const QList<QgsProcessingParameterTinInputLayers::InputLayer> &layers = mInputLayersModel.layers();
47 layerMap[QStringLiteral(
"source" )] = layer.source;
48 layerMap[QStringLiteral(
"type" )] = layer.type;
49 layerMap[QStringLiteral(
"attributeIndex" )] = layer.attributeIndex;
50 list.append( layerMap );
56 void QgsProcessingTinInputLayersWidget::setValue(
const QVariant &value )
58 mInputLayersModel.clear();
59 if ( !value.isValid() || value.type() != QVariant::List )
62 QVariantList list = value.toList();
64 for (
const QVariant &layerValue : list )
66 if ( layerValue.type() != QVariant::Map )
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 );
79 void QgsProcessingTinInputLayersWidget::setProject(
QgsProject *project )
81 mInputLayersModel.setProject( project );
84 void QgsProcessingTinInputLayersWidget::onLayerChanged(
QgsMapLayer *layer )
86 QgsVectorLayer *newLayer = qobject_cast<QgsVectorLayer *>( layer );
88 if ( !newLayer || !newLayer->
isValid() )
96 mComboFields->setLayer( newLayer );
97 mComboFields->setCurrentIndex( 0 );
101 void 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 );
133 void QgsProcessingTinInputLayersWidget::QgsProcessingTinInputLayersWidget::onLayersRemove()
135 mInputLayersModel.removeLayer( mTableView->selectionModel()->currentIndex().row() );
140 QgsProcessingTinInputLayersWidget::QgsProcessingTinInputLayersModel::QgsProcessingTinInputLayersModel(
QgsProject *project ):
144 int QgsProcessingTinInputLayersWidget::QgsProcessingTinInputLayersModel::rowCount(
const QModelIndex &parent )
const
147 return mInputLayers.count();
150 int QgsProcessingTinInputLayersWidget::QgsProcessingTinInputLayersModel::columnCount(
const QModelIndex &parent )
const
156 QVariant QgsProcessingTinInputLayersWidget::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 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 int attributeindex = mInputLayers.at( index.row() ).attributeIndex;
210 if ( attributeindex < 0 )
211 return QColor( Qt::darkGray );
215 if ( index.column() == 2 )
217 int attributeindex = mInputLayers.at( index.row() ).attributeIndex;
218 if ( attributeindex < 0 )
221 font.setItalic(
true );
227 if ( index.column() == 1 )
228 return mInputLayers.at( index.row() ).type;
236 bool QgsProcessingTinInputLayersWidget::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 ) );
247 Qt::ItemFlags QgsProcessingTinInputLayersWidget::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 );
258 QVariant QgsProcessingTinInputLayersWidget::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 );
289 void QgsProcessingTinInputLayersWidget::QgsProcessingTinInputLayersModel::removeLayer(
int index )
291 if ( index < 0 || index >= mInputLayers.count() )
293 beginRemoveRows( QModelIndex(), index, index );
294 mInputLayers.removeAt( index );
298 void QgsProcessingTinInputLayersWidget::QgsProcessingTinInputLayersModel::clear()
300 mInputLayers.clear();
303 QList<QgsProcessingParameterTinInputLayers::InputLayer> QgsProcessingTinInputLayersWidget::QgsProcessingTinInputLayersModel::layers()
const
308 void QgsProcessingTinInputLayersWidget::QgsProcessingTinInputLayersModel::setProject(
QgsProject *project )
313 QWidget *QgsProcessingTinInputLayersWidget::Delegate::createEditor( QWidget *parent,
const QStyleOptionViewItem &option,
const QModelIndex &index )
const
317 QComboBox *comboType =
new QComboBox( parent );
323 void QgsProcessingTinInputLayersWidget::Delegate::setEditorData( QWidget *editor,
const QModelIndex &index )
const
325 QComboBox *comboType = qobject_cast<QComboBox *>( editor );
326 Q_ASSERT( comboType );
329 int comboIndex = comboType->findData( type );
330 if ( comboIndex >= 0 )
331 comboType->setCurrentIndex( comboIndex );
333 comboType->setCurrentIndex( 0 );
336 void QgsProcessingTinInputLayersWidget::Delegate::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 );
347 QString QgsProcessingTinInputLayersWidgetWrapper::parameterType()
const
349 return QStringLiteral(
"tininputlayers" );
354 return new QgsProcessingTinInputLayersWidgetWrapper( parameter, type );
357 QStringList QgsProcessingTinInputLayersWidgetWrapper::compatibleParameterTypes()
const
363 QStringList QgsProcessingTinInputLayersWidgetWrapper::compatibleOutputTypes()
const {
return QStringList();}
365 QWidget *QgsProcessingTinInputLayersWidgetWrapper::createWidget()
367 mWidget =
new QgsProcessingTinInputLayersWidget( widgetContext().project() );
368 connect( mWidget, &QgsProcessingTinInputLayersWidget::changed,
this, [ = ]
370 emit widgetValueHasChanged(
this );
376 void QgsProcessingTinInputLayersWidgetWrapper::setWidgetValue(
const QVariant &value,
QgsProcessingContext &context )
380 mWidget->setValue( value );
381 mWidget->setProject( context.
project() );
384 QVariant QgsProcessingTinInputLayersWidgetWrapper::widgetValue()
const
387 return mWidget->value();
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.
QgsWkbTypes::Type 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.
Q_INVOKABLE QgsWkbTypes::GeometryType geometryType() const
Returns point, line or polygon.
QgsFields fields() const FINAL
Returns the list of fields of this layer.
QgsVectorDataProvider * dataProvider() FINAL
Returns the layer's data provider, it may be nullptr.
static bool hasZ(Type type) SIP_HOLDGIL
Tests whether a WKB type contains the z-dimension.