1
0
mirror of https://github.com/qgis/QGIS.git synced 2025-04-30 00:04:26 -04:00
QGIS/src/gui/qgssubstitutionlistwidget.cpp
Nyall Dawson 76c12ba94c Split QgsLabelingGui off into QgsTextFormatWidget
New widget allows for setting just the formatting properties
of text
2016-10-24 12:02:00 +10:00

231 lines
7.8 KiB
C++

/***************************************************************************
qgssubstitutionlistwidget.cpp
-----------------------------
begin : August 2016
copyright : (C) 2016 Nyall Dawson
email : nyall dot dawson at gmail dot com
***************************************************************************/
/***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/
#include "qgssubstitutionlistwidget.h"
#include <QDialogButtonBox>
#include <QCheckBox>
#include <QFileDialog>
#include <QMessageBox>
#include <QTextStream>
QgsSubstitutionListWidget::QgsSubstitutionListWidget( QWidget* parent )
: QgsPanelWidget( parent )
{
setupUi( this );
connect( mTableSubstitutions, SIGNAL( cellChanged( int, int ) ), this, SLOT( tableChanged() ) );
}
void QgsSubstitutionListWidget::setSubstitutions( const QgsStringReplacementCollection& substitutions )
{
mTableSubstitutions->blockSignals( true );
mTableSubstitutions->clearContents();
Q_FOREACH ( const QgsStringReplacement& replacement, substitutions.replacements() )
{
addSubstitution( replacement );
}
mTableSubstitutions->blockSignals( false );
}
QgsStringReplacementCollection QgsSubstitutionListWidget::substitutions() const
{
QList< QgsStringReplacement > result;
for ( int i = 0; i < mTableSubstitutions->rowCount(); ++i )
{
if ( !mTableSubstitutions->item( i, 0 ) )
continue;
if ( mTableSubstitutions->item( i, 0 )->text().isEmpty() )
continue;
QCheckBox* chkCaseSensitive = qobject_cast<QCheckBox*>( mTableSubstitutions->cellWidget( i, 2 ) );
QCheckBox* chkWholeWord = qobject_cast<QCheckBox*>( mTableSubstitutions->cellWidget( i, 3 ) );
QgsStringReplacement replacement( mTableSubstitutions->item( i, 0 )->text(),
mTableSubstitutions->item( i, 1 )->text(),
chkCaseSensitive->isChecked(),
chkWholeWord->isChecked() );
result << replacement;
}
return QgsStringReplacementCollection( result );
}
void QgsSubstitutionListWidget::on_mButtonAdd_clicked()
{
addSubstitution( QgsStringReplacement( QString(), QString(), false, true ) );
mTableSubstitutions->setFocus();
mTableSubstitutions->setCurrentCell( mTableSubstitutions->rowCount() - 1, 0 );
}
void QgsSubstitutionListWidget::on_mButtonRemove_clicked()
{
int currentRow = mTableSubstitutions->currentRow();
mTableSubstitutions->removeRow( currentRow );
tableChanged();
}
void QgsSubstitutionListWidget::tableChanged()
{
emit substitutionsChanged( substitutions() );
}
void QgsSubstitutionListWidget::on_mButtonExport_clicked()
{
QString fileName = QFileDialog::getSaveFileName( this, tr( "Save substitutions" ), QDir::homePath(),
tr( "XML files (*.xml *.XML)" ) );
if ( fileName.isEmpty() )
{
return;
}
// ensure the user never ommited the extension from the file name
if ( !fileName.endsWith( ".xml", Qt::CaseInsensitive ) )
{
fileName += ".xml";
}
QDomDocument doc;
QDomElement root = doc.createElement( "substitutions" );
root.setAttribute( "version", "1.0" );
QgsStringReplacementCollection collection = substitutions();
collection.writeXml( root, doc );
doc.appendChild( root );
QFile file( fileName );
if ( !file.open( QIODevice::WriteOnly | QIODevice::Text | QIODevice::Truncate ) )
{
QMessageBox::warning( nullptr, tr( "Export substitutions" ),
tr( "Cannot write file %1:\n%2." ).arg( fileName, file.errorString() ),
QMessageBox::Ok,
QMessageBox::Ok );
return;
}
QTextStream out( &file );
doc.save( out, 4 );
}
void QgsSubstitutionListWidget::on_mButtonImport_clicked()
{
QString fileName = QFileDialog::getOpenFileName( this, tr( "Load substitutions" ), QDir::homePath(),
tr( "XML files (*.xml *.XML)" ) );
if ( fileName.isEmpty() )
{
return;
}
QFile file( fileName );
if ( !file.open( QIODevice::ReadOnly | QIODevice::Text ) )
{
QMessageBox::warning( nullptr, tr( "Import substitutions" ),
tr( "Cannot read file %1:\n%2." ).arg( fileName, file.errorString() ),
QMessageBox::Ok,
QMessageBox::Ok );
return;
}
QDomDocument doc;
QString errorStr;
int errorLine;
int errorColumn;
if ( !doc.setContent( &file, true, &errorStr, &errorLine, &errorColumn ) )
{
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 );
return;
}
QDomElement root = doc.documentElement();
if ( root.tagName() != "substitutions" )
{
QMessageBox::warning( nullptr, tr( "Import substitutions" ),
tr( "The selected file is not a substitution list." ),
QMessageBox::Ok,
QMessageBox::Ok );
return;
}
QgsStringReplacementCollection collection;
collection.readXml( root );
setSubstitutions( collection );
tableChanged();
}
void QgsSubstitutionListWidget::addSubstitution( const QgsStringReplacement& substitution )
{
int row = mTableSubstitutions->rowCount();
mTableSubstitutions->insertRow( row );
Qt::ItemFlags itemFlags = Qt::ItemIsEnabled | Qt::ItemIsSelectable
| Qt::ItemIsEditable;
QTableWidgetItem* matchItem = new QTableWidgetItem( substitution.match() );
matchItem->setFlags( itemFlags );
mTableSubstitutions->setItem( row, 0, matchItem );
QTableWidgetItem* replaceItem = new QTableWidgetItem( substitution.replacement() );
replaceItem->setFlags( itemFlags );
mTableSubstitutions->setItem( row, 1, replaceItem );
QCheckBox* caseSensitiveChk = new QCheckBox( this );
caseSensitiveChk->setChecked( substitution.caseSensitive() );
mTableSubstitutions->setCellWidget( row, 2, caseSensitiveChk );
connect( caseSensitiveChk, SIGNAL( toggled( bool ) ), this, SLOT( tableChanged() ) );
QCheckBox* wholeWordChk = new QCheckBox( this );
wholeWordChk->setChecked( substitution.wholeWordOnly() );
mTableSubstitutions->setCellWidget( row, 3, wholeWordChk );
connect( wholeWordChk, SIGNAL( toggled( bool ) ), this, SLOT( tableChanged() ) );
}
//
// QgsSubstitutionListDialog
//
QgsSubstitutionListDialog::QgsSubstitutionListDialog( QWidget* parent )
: QDialog( parent )
, mWidget( nullptr )
{
setWindowTitle( tr( "Substitutions" ) );
QVBoxLayout* vLayout = new QVBoxLayout();
mWidget = new QgsSubstitutionListWidget();
vLayout->addWidget( mWidget );
QDialogButtonBox* bbox = new QDialogButtonBox( QDialogButtonBox::Ok | QDialogButtonBox::Cancel, Qt::Horizontal );
connect( bbox, SIGNAL( accepted() ), this, SLOT( accept() ) );
connect( bbox, SIGNAL( rejected() ), this, SLOT( reject() ) );
vLayout->addWidget( bbox );
setLayout( vLayout );
}
void QgsSubstitutionListDialog::setSubstitutions( const QgsStringReplacementCollection& substitutions )
{
mWidget->setSubstitutions( substitutions );
}
QgsStringReplacementCollection QgsSubstitutionListDialog::substitutions() const
{
return mWidget->substitutions();
}