25#include <QDialogButtonBox>
31#include "moc_qgssubstitutionlistwidget.cpp"
33using namespace Qt::StringLiterals;
41 connect( mButtonAdd, &QToolButton::clicked,
this, &QgsSubstitutionListWidget::mButtonAdd_clicked );
42 connect( mButtonRemove, &QToolButton::clicked,
this, &QgsSubstitutionListWidget::mButtonRemove_clicked );
43 connect( mButtonExport, &QToolButton::clicked,
this, &QgsSubstitutionListWidget::mButtonExport_clicked );
44 connect( mButtonImport, &QToolButton::clicked,
this, &QgsSubstitutionListWidget::mButtonImport_clicked );
45 connect( mTableSubstitutions, &QTableWidget::cellChanged,
this, &QgsSubstitutionListWidget::tableChanged );
50 mTableSubstitutions->blockSignals(
true );
51 mTableSubstitutions->clearContents();
55 addSubstitution( replacement );
57 mTableSubstitutions->blockSignals(
false );
62 QList<QgsStringReplacement> result;
63 for (
int i = 0; i < mTableSubstitutions->rowCount(); ++i )
65 if ( !mTableSubstitutions->item( i, 0 ) )
68 if ( mTableSubstitutions->item( i, 0 )->text().isEmpty() )
71 QCheckBox *chkCaseSensitive = qobject_cast<QCheckBox *>( mTableSubstitutions->cellWidget( i, 2 ) );
72 QCheckBox *chkWholeWord = qobject_cast<QCheckBox *>( mTableSubstitutions->cellWidget( i, 3 ) );
74 const QgsStringReplacement replacement( mTableSubstitutions->item( i, 0 )->text(), mTableSubstitutions->item( i, 1 )->text(), chkCaseSensitive->isChecked(), chkWholeWord->isChecked() );
75 result << replacement;
80void QgsSubstitutionListWidget::mButtonAdd_clicked()
83 mTableSubstitutions->setFocus();
84 mTableSubstitutions->setCurrentCell( mTableSubstitutions->rowCount() - 1, 0 );
87void QgsSubstitutionListWidget::mButtonRemove_clicked()
89 const int currentRow = mTableSubstitutions->currentRow();
90 mTableSubstitutions->removeRow( currentRow );
94void QgsSubstitutionListWidget::tableChanged()
99void QgsSubstitutionListWidget::mButtonExport_clicked()
101 QString fileName = QFileDialog::getSaveFileName(
this, tr(
"Save Substitutions" ), QDir::homePath(), tr(
"XML files (*.xml *.XML)" ) );
105 if ( fileName.isEmpty() )
111 if ( !fileName.endsWith(
".xml"_L1, Qt::CaseInsensitive ) )
113 fileName +=
".xml"_L1;
117 QDomElement root = doc.createElement( u
"substitutions"_s );
118 root.setAttribute( u
"version"_s, u
"1.0"_s );
119 const QgsStringReplacementCollection collection =
substitutions();
121 doc.appendChild( root );
123 QFile file( fileName );
124 if ( !file.open( QIODevice::WriteOnly | QIODevice::Text | QIODevice::Truncate ) )
126 QMessageBox::warning(
nullptr, tr(
"Export Substitutions" ), tr(
"Cannot write file %1:\n%2" ).arg( fileName, file.errorString() ), QMessageBox::Ok, QMessageBox::Ok );
130 QTextStream out( &file );
134void QgsSubstitutionListWidget::mButtonImport_clicked()
136 const QString fileName = QFileDialog::getOpenFileName(
this, tr(
"Load Substitutions" ), QDir::homePath(), tr(
"XML files (*.xml *.XML)" ) );
137 if ( fileName.isEmpty() )
142 QFile file( fileName );
143 if ( !file.open( QIODevice::ReadOnly | QIODevice::Text ) )
145 QMessageBox::warning(
nullptr, tr(
"Import Substitutions" ), tr(
"Cannot read file %1:\n%2" ).arg( fileName, file.errorString() ), QMessageBox::Ok, QMessageBox::Ok );
154 if ( !doc.setContent( &file,
true, &errorStr, &errorLine, &errorColumn ) )
156 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 );
160 const QDomElement root = doc.documentElement();
161 if ( root.tagName() !=
"substitutions"_L1 )
163 QMessageBox::warning(
nullptr, tr(
"Import Substitutions" ), tr(
"The selected file is not a substitution list." ), QMessageBox::Ok, QMessageBox::Ok );
167 QgsStringReplacementCollection collection;
175 const int row = mTableSubstitutions->rowCount();
176 mTableSubstitutions->insertRow( row );
178 const Qt::ItemFlags itemFlags = Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsEditable;
180 QTableWidgetItem *matchItem =
new QTableWidgetItem( substitution.
match() );
181 matchItem->setFlags( itemFlags );
182 mTableSubstitutions->setItem( row, 0, matchItem );
183 QTableWidgetItem *replaceItem =
new QTableWidgetItem( substitution.
replacement() );
184 replaceItem->setFlags( itemFlags );
185 mTableSubstitutions->setItem( row, 1, replaceItem );
187 QCheckBox *caseSensitiveChk =
new QCheckBox(
this );
188 caseSensitiveChk->setChecked( substitution.
caseSensitive() );
189 mTableSubstitutions->setCellWidget( row, 2, caseSensitiveChk );
190 connect( caseSensitiveChk, &QAbstractButton::toggled,
this, &QgsSubstitutionListWidget::tableChanged );
192 QCheckBox *wholeWordChk =
new QCheckBox(
this );
194 mTableSubstitutions->setCellWidget( row, 3, wholeWordChk );
195 connect( wholeWordChk, &QAbstractButton::toggled,
this, &QgsSubstitutionListWidget::tableChanged );
208 setWindowTitle( tr(
"Substitutions" ) );
209 QVBoxLayout *vLayout =
new QVBoxLayout();
211 vLayout->addWidget( mWidget );
212 QDialogButtonBox *bbox =
new QDialogButtonBox( QDialogButtonBox::Ok | QDialogButtonBox::Cancel, Qt::Horizontal );
213 connect( bbox, &QDialogButtonBox::accepted,
this, &QDialog::accept );
214 connect( bbox, &QDialogButtonBox::rejected,
this, &QDialog::reject );
215 vLayout->addWidget( bbox );
216 setLayout( vLayout );
226 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.