27#include <QStandardItemModel>
30#include "moc_qgsprocessingdxflayerswidgetwrapper.cpp"
38QgsProcessingDxfLayerDetailsWidget::QgsProcessingDxfLayerDetailsWidget(
const QVariant &value,
QgsProject *project )
42 mFieldsComboBox->setAllowEmptyFieldName(
true );
44 mContext.setProject( project );
47 mLayer = layer.
layer();
52 mFieldsComboBox->setLayer( mLayer );
62 mGroupBoxBlocks->setVisible(
true );
68 mGroupBoxBlocks->setVisible(
false );
77QVariant QgsProcessingDxfLayerDetailsWidget::value()
const
79 const int index = mLayer->fields().lookupField( mFieldsComboBox->currentField() );
80 const QgsDxfExport::DxfLayer layer( mLayer, index, mGroupBoxBlocks->isChecked(), mSpinBoxBlocks->value(), mOverriddenName->text().trimmed() );
89QgsProcessingDxfLayersPanelWidget::QgsProcessingDxfLayersPanelWidget(
90 const QVariant &value,
94 : QgsProcessingMultipleSelectionPanelWidget( QVariantList(), QVariantList(), parent )
97 connect( listView(), &QListView::doubleClicked,
this, &QgsProcessingDxfLayersPanelWidget::configureLayer );
99 QPushButton *configureLayerButton =
new QPushButton( tr(
"Configure Layer…" ) );
100 connect( configureLayerButton, &QPushButton::clicked,
this, &QgsProcessingDxfLayersPanelWidget::configureLayer );
101 buttonBox()->addButton( configureLayerButton, QDialogButtonBox::ActionRole );
104 mContext.setProject( project );
106 QSet<const QgsVectorLayer *> seenVectorLayers;
107 const QVariantList valueList = value.toList();
108 for (
const QVariant &v : valueList )
111 if ( !layer.
layer() )
114 addOption( v, titleForLayer( layer ),
true );
115 seenVectorLayers.insert( layer.
layer() );
121 if ( seenVectorLayers.contains( layer ) )
125 vm[
"layer"] = layer->id();
126 vm[
"attributeIndex"] = -1;
127 vm[
"overriddenLayerName"] = QString();
128 vm[
"buildDataDefinedBlocks"] = DEFAULT_DXF_DATA_DEFINED_BLOCKS;
129 vm[
"dataDefinedBlocksMaximumNumberOfClasses"] = -1;
131 const QString title = layer->name();
132 addOption( vm, title,
false );
136void QgsProcessingDxfLayersPanelWidget::configureLayer()
138 const QModelIndexList selection = listView()->selectionModel()->selectedIndexes();
139 if ( selection.size() != 1 )
141 QMessageBox::warning(
this, tr(
"Configure Layer" ), tr(
"Please select a single layer." ) );
145 QStandardItem *item = mModel->itemFromIndex( selection[0] );
146 const QVariant value = item->data( Qt::UserRole );
151 QgsProcessingDxfLayerDetailsWidget *widget =
new QgsProcessingDxfLayerDetailsWidget( value, mProject );
152 widget->setPanelTitle( tr(
"Configure Layer" ) );
153 widget->buttonBox()->hide();
155 connect( widget, &QgsProcessingDxfLayerDetailsWidget::widgetChanged,
this, [
this, item, widget]() {
156 setItemValue( item, widget->value() );
163 dlg.setWindowTitle( tr(
"Configure Layer" ) );
164 QVBoxLayout *vLayout =
new QVBoxLayout();
165 QgsProcessingDxfLayerDetailsWidget *widget =
new QgsProcessingDxfLayerDetailsWidget( value, mProject );
166 vLayout->addWidget( widget );
167 connect( widget->buttonBox(), &QDialogButtonBox::accepted, &dlg, &QDialog::accept );
168 connect( widget->buttonBox(), &QDialogButtonBox::rejected, &dlg, &QDialog::reject );
169 dlg.setLayout( vLayout );
172 setItemValue( item, widget->value() );
177void QgsProcessingDxfLayersPanelWidget::setItemValue( QStandardItem *item,
const QVariant &value )
179 mContext.setProject( mProject );
183 item->setText( titleForLayer( layer ) );
184 item->setData( value, Qt::UserRole );
201 title += tr(
" [overridden name: %1]" ).arg( layer.
overriddenName() );
213QgsProcessingDxfLayersWidget::QgsProcessingDxfLayersWidget( QWidget *parent )
216 QHBoxLayout *hl =
new QHBoxLayout();
217 hl->setContentsMargins( 0, 0, 0, 0 );
219 mLineEdit =
new QLineEdit();
220 mLineEdit->setEnabled(
false );
221 hl->addWidget( mLineEdit, 1 );
223 mToolButton =
new QToolButton();
224 mToolButton->setText( QString( QChar( 0x2026 ) ) );
225 hl->addWidget( mToolButton );
231 connect( mToolButton, &QToolButton::clicked,
this, &QgsProcessingDxfLayersWidget::showDialog );
234void QgsProcessingDxfLayersWidget::setValue(
const QVariant &value )
236 if ( value.isValid() )
237 mValue = value.userType() == QMetaType::Type::QVariantList ? value.toList() : QVariantList() << value;
245void QgsProcessingDxfLayersWidget::setProject(
QgsProject *project )
250void QgsProcessingDxfLayersWidget::showDialog()
255 QgsProcessingDxfLayersPanelWidget *widget =
new QgsProcessingDxfLayersPanelWidget( mValue, mProject );
256 widget->setPanelTitle( tr(
"Input layers" ) );
257 connect( widget, &QgsProcessingMultipleSelectionPanelWidget::selectionChanged,
this, [
this, widget]() {
258 setValue( widget->selectedOptions() );
266 dlg.setWindowTitle( tr(
"Input layers" ) );
267 QVBoxLayout *vLayout =
new QVBoxLayout();
268 QgsProcessingDxfLayersPanelWidget *widget =
new QgsProcessingDxfLayersPanelWidget( mValue, mProject );
269 vLayout->addWidget( widget );
270 widget->buttonBox()->addButton( QDialogButtonBox::Cancel );
271 connect( widget->buttonBox(), &QDialogButtonBox::accepted, &dlg, &QDialog::accept );
272 connect( widget->buttonBox(), &QDialogButtonBox::rejected, &dlg, &QDialog::reject );
273 dlg.setLayout( vLayout );
276 setValue( widget->selectedOptions() );
281void QgsProcessingDxfLayersWidget::updateSummaryText()
283 mLineEdit->setText( tr(
"%n vector layer(s) selected",
nullptr, mValue.count() ) );
296QString QgsProcessingDxfLayersWidgetWrapper::parameterType()
const
303 return new QgsProcessingDxfLayersWidgetWrapper( parameter, type );
306QWidget *QgsProcessingDxfLayersWidgetWrapper::createWidget()
308 mPanel =
new QgsProcessingDxfLayersWidget(
nullptr );
309 mPanel->setProject( widgetContext().project() );
310 connect( mPanel, &QgsProcessingDxfLayersWidget::changed,
this, [
this] {
311 emit widgetValueHasChanged(
this );
321 mPanel->setProject( context.
project() );
325void QgsProcessingDxfLayersWidgetWrapper::setWidgetValue(
const QVariant &value,
QgsProcessingContext &context )
330 mPanel->setValue( value );
334QVariant QgsProcessingDxfLayersWidgetWrapper::widgetValue()
const
336 return mPanel ? mPanel->value() : QVariant();
@ VectorAnyGeometry
Any vector layer with geometry.
ProcessingMode
Types of modes which Processing widgets can be created for.
void fieldChanged(const QString &fieldName)
Emitted when the currently selected field changes.
Contains information about the context in which a processing algorithm is executed.
Base class for the definition of processing parameters.
static QVariantMap layerAsVariantMap(const QgsDxfExport::DxfLayer &layer)
Converts a single input layer to QVariant representation (a QVariantMap).
static QgsDxfExport::DxfLayer variantMapAsLayer(const QVariantMap &layerVariantMap, QgsProcessingContext &context)
Converts a QVariant value (a QVariantMap) to a single input layer.
static QString typeName()
Returns the type name for the parameter class.
Contains settings which reflect the context in which a Processing parameter widget is shown.
QgsProject * project() const
Returns the project associated with the widget.
static QList< QgsVectorLayer * > compatibleVectorLayers(QgsProject *project, const QList< int > &sourceTypes=QList< int >(), bool sort=true)
Returns a list of vector layers from a project which are compatible with the processing framework.
Encapsulates a QGIS project, including sets of map layers and their styles, layouts,...
Represents a vector layer which manages a vector based dataset.
Layers and optional attribute index to split into multiple layers using attribute value as layer name...
QString overriddenName() const
Returns the overridden layer name to be used in the exported DXF.
bool buildDataDefinedBlocks() const
Flag if data defined point block symbols should be created.
QgsVectorLayer * layer() const
Returns the layer.
int dataDefinedBlocksMaximumNumberOfClasses() const
Returns the maximum number of data defined symbol classes for which blocks are created.
QString splitLayerAttribute() const
If the split layer attribute is set, the vector layer will be split into several dxf layers,...
int layerOutputAttributeIndex() const
Returns the attribute index used to split into multiple layers.