25#include <QDialogButtonBox>
30#include "moc_qgssubstitutionlistwidget.cpp"
38 connect( mButtonAdd, &QToolButton::clicked,
this, &QgsSubstitutionListWidget::mButtonAdd_clicked );
39 connect( mButtonRemove, &QToolButton::clicked,
this, &QgsSubstitutionListWidget::mButtonRemove_clicked );
40 connect( mButtonExport, &QToolButton::clicked,
this, &QgsSubstitutionListWidget::mButtonExport_clicked );
41 connect( mButtonImport, &QToolButton::clicked,
this, &QgsSubstitutionListWidget::mButtonImport_clicked );
42 connect( mTableSubstitutions, &QTableWidget::cellChanged,
this, &QgsSubstitutionListWidget::tableChanged );
47 mTableSubstitutions->blockSignals(
true );
48 mTableSubstitutions->clearContents();
52 addSubstitution( replacement );
54 mTableSubstitutions->blockSignals(
false );
59 QList<QgsStringReplacement> result;
60 for (
int i = 0; i < mTableSubstitutions->rowCount(); ++i )
62 if ( !mTableSubstitutions->item( i, 0 ) )
65 if ( mTableSubstitutions->item( i, 0 )->text().isEmpty() )
68 QCheckBox *chkCaseSensitive = qobject_cast<QCheckBox *>( mTableSubstitutions->cellWidget( i, 2 ) );
69 QCheckBox *chkWholeWord = qobject_cast<QCheckBox *>( mTableSubstitutions->cellWidget( i, 3 ) );
71 const QgsStringReplacement replacement( mTableSubstitutions->item( i, 0 )->text(), mTableSubstitutions->item( i, 1 )->text(), chkCaseSensitive->isChecked(), chkWholeWord->isChecked() );
72 result << replacement;
77void QgsSubstitutionListWidget::mButtonAdd_clicked()
80 mTableSubstitutions->setFocus();
81 mTableSubstitutions->setCurrentCell( mTableSubstitutions->rowCount() - 1, 0 );
84void QgsSubstitutionListWidget::mButtonRemove_clicked()
86 const int currentRow = mTableSubstitutions->currentRow();
87 mTableSubstitutions->removeRow( currentRow );
91void QgsSubstitutionListWidget::tableChanged()
96void QgsSubstitutionListWidget::mButtonExport_clicked()
98 QString fileName = QFileDialog::getSaveFileName(
this, tr(
"Save Substitutions" ), QDir::homePath(), tr(
"XML files (*.xml *.XML)" ) );
102 if ( fileName.isEmpty() )
108 if ( !fileName.endsWith( QLatin1String(
".xml" ), Qt::CaseInsensitive ) )
110 fileName += QLatin1String(
".xml" );
114 QDomElement root = doc.createElement( QStringLiteral(
"substitutions" ) );
115 root.setAttribute( QStringLiteral(
"version" ), QStringLiteral(
"1.0" ) );
116 const QgsStringReplacementCollection collection =
substitutions();
118 doc.appendChild( root );
120 QFile file( fileName );
121 if ( !file.open( QIODevice::WriteOnly | QIODevice::Text | QIODevice::Truncate ) )
123 QMessageBox::warning(
nullptr, tr(
"Export Substitutions" ), tr(
"Cannot write file %1:\n%2" ).arg( fileName, file.errorString() ), QMessageBox::Ok, QMessageBox::Ok );
127 QTextStream out( &file );
131void QgsSubstitutionListWidget::mButtonImport_clicked()
133 const QString fileName = QFileDialog::getOpenFileName(
this, tr(
"Load Substitutions" ), QDir::homePath(), tr(
"XML files (*.xml *.XML)" ) );
134 if ( fileName.isEmpty() )
139 QFile file( fileName );
140 if ( !file.open( QIODevice::ReadOnly | QIODevice::Text ) )
142 QMessageBox::warning(
nullptr, tr(
"Import Substitutions" ), tr(
"Cannot read file %1:\n%2" ).arg( fileName, file.errorString() ), QMessageBox::Ok, QMessageBox::Ok );
151 if ( !doc.setContent( &file,
true, &errorStr, &errorLine, &errorColumn ) )
153 QMessageBox::warning(
nullptr, tr(
"Import substitutions" ), tr(
"Parse error at line %1, column %2:\n%3" ).arg( errorLine ).arg( errorColumn ).arg( errorStr ), QMessageBox::Ok, QMessageBox::Ok );
157 const QDomElement root = doc.documentElement();
158 if ( root.tagName() != QLatin1String(
"substitutions" ) )
160 QMessageBox::warning(
nullptr, tr(
"Import Substitutions" ), tr(
"The selected file is not a substitution list." ), QMessageBox::Ok, QMessageBox::Ok );
164 QgsStringReplacementCollection collection;
172 const int row = mTableSubstitutions->rowCount();
173 mTableSubstitutions->insertRow( row );
175 const Qt::ItemFlags itemFlags = Qt::ItemIsEnabled | Qt::ItemIsSelectable
176 | Qt::ItemIsEditable;
178 QTableWidgetItem *matchItem =
new QTableWidgetItem( substitution.
match() );
179 matchItem->setFlags( itemFlags );
180 mTableSubstitutions->setItem( row, 0, matchItem );
181 QTableWidgetItem *replaceItem =
new QTableWidgetItem( substitution.
replacement() );
182 replaceItem->setFlags( itemFlags );
183 mTableSubstitutions->setItem( row, 1, replaceItem );
185 QCheckBox *caseSensitiveChk =
new QCheckBox(
this );
186 caseSensitiveChk->setChecked( substitution.
caseSensitive() );
187 mTableSubstitutions->setCellWidget( row, 2, caseSensitiveChk );
188 connect( caseSensitiveChk, &QAbstractButton::toggled,
this, &QgsSubstitutionListWidget::tableChanged );
190 QCheckBox *wholeWordChk =
new QCheckBox(
this );
192 mTableSubstitutions->setCellWidget( row, 3, wholeWordChk );
193 connect( wholeWordChk, &QAbstractButton::toggled,
this, &QgsSubstitutionListWidget::tableChanged );
206 setWindowTitle( tr(
"Substitutions" ) );
207 QVBoxLayout *vLayout =
new QVBoxLayout();
209 vLayout->addWidget( mWidget );
210 QDialogButtonBox *bbox =
new QDialogButtonBox( QDialogButtonBox::Ok | QDialogButtonBox::Cancel, Qt::Horizontal );
211 connect( bbox, &QDialogButtonBox::accepted,
this, &QDialog::accept );
212 connect( bbox, &QDialogButtonBox::rejected,
this, &QDialog::reject );
213 vLayout->addWidget( bbox );
214 setLayout( vLayout );
224 return mWidget->substitutions();
static void enableAutoGeometryRestore(QWidget *widget, const QString &key=QString())
Register the widget to allow its position to be automatically saved and restored when open and closed...
A collection of string replacements (specified using QgsStringReplacement objects).
void readXml(const QDomElement &elem)
Reads the collection state from an XML element.
void writeXml(QDomElement &elem, QDomDocument &doc) const
Writes the collection state to an XML element.
A representation of a single string replacement.
bool wholeWordOnly() const
Returns true if match only applies to whole words, or false if partial word matches are permitted.
QString replacement() const
Returns the string to replace matches with.
bool caseSensitive() const
Returns true if match is case sensitive.
QString match() const
Returns the string matched by this object.
QgsSubstitutionListDialog(QWidget *parent=nullptr)
Constructor for QgsSubstitutionListDialog.
QgsStringReplacementCollection substitutions
void setSubstitutions(const QgsStringReplacementCollection &substitutions)
Sets the list of substitutions to show in the dialog.