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
179 | Qt::ItemIsEditable;
181 QTableWidgetItem *matchItem =
new QTableWidgetItem( substitution.
match() );
182 matchItem->setFlags( itemFlags );
183 mTableSubstitutions->setItem( row, 0, matchItem );
184 QTableWidgetItem *replaceItem =
new QTableWidgetItem( substitution.
replacement() );
185 replaceItem->setFlags( itemFlags );
186 mTableSubstitutions->setItem( row, 1, replaceItem );
188 QCheckBox *caseSensitiveChk =
new QCheckBox(
this );
189 caseSensitiveChk->setChecked( substitution.
caseSensitive() );
190 mTableSubstitutions->setCellWidget( row, 2, caseSensitiveChk );
191 connect( caseSensitiveChk, &QAbstractButton::toggled,
this, &QgsSubstitutionListWidget::tableChanged );
193 QCheckBox *wholeWordChk =
new QCheckBox(
this );
195 mTableSubstitutions->setCellWidget( row, 3, wholeWordChk );
196 connect( wholeWordChk, &QAbstractButton::toggled,
this, &QgsSubstitutionListWidget::tableChanged );
209 setWindowTitle( tr(
"Substitutions" ) );
210 QVBoxLayout *vLayout =
new QVBoxLayout();
212 vLayout->addWidget( mWidget );
213 QDialogButtonBox *bbox =
new QDialogButtonBox( QDialogButtonBox::Ok | QDialogButtonBox::Cancel, Qt::Horizontal );
214 connect( bbox, &QDialogButtonBox::accepted,
this, &QDialog::accept );
215 connect( bbox, &QDialogButtonBox::rejected,
this, &QDialog::reject );
216 vLayout->addWidget( bbox );
217 setLayout( vLayout );
227 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.