QGIS/src/plugins/geometry_checker/ui/qgsgeometrycheckfixdialog.cpp
2017-10-23 17:25:06 +02:00

187 lines
6.2 KiB
C++

/***************************************************************************
* qgsgeometrycheckerfixdialog.cpp *
* ------------------- *
* copyright : (C) 2014 by Sandro Mani / Sourcepole AG *
* email : smani@sourcepole.ch *
***************************************************************************/
/***************************************************************************
* *
* 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 "qgsgeometrycheckfixdialog.h"
#include "qgsgeometrycheckerresulttab.h"
#include "qgisinterface.h"
#include "qgsmapcanvas.h"
#include "qgssettings.h"
#include "../qgsgeometrychecker.h"
#include "../checks/qgsgeometrycheck.h"
#include <QButtonGroup>
#include <QDialogButtonBox>
#include <QGroupBox>
#include <QLabel>
#include <QProgressBar>
#include <QPushButton>
#include <QRadioButton>
#include <QGridLayout>
QgsGeometryCheckerFixDialog::QgsGeometryCheckerFixDialog( QgsGeometryChecker *checker,
const QList<QgsGeometryCheckError *> &errors, QWidget *parent )
: QDialog( parent )
, mChecker( checker )
, mErrors( errors )
{
setWindowTitle( tr( "Fix Errors" ) );
QGridLayout *layout = new QGridLayout();
layout->setContentsMargins( 4, 4, 4, 4 );
setLayout( layout );
mResolutionsBox = new QGroupBox();
mResolutionsBox->setFlat( true );
mResolutionsBox->setSizePolicy( QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding );
layout->addWidget( mResolutionsBox, 0, 0, 1, 2 );
mStatusLabel = new QLabel();
layout->addWidget( mStatusLabel, 1, 0, 1, 2 );
mButtonBox = new QDialogButtonBox( QDialogButtonBox::Abort, Qt::Horizontal );
mNextBtn = mButtonBox->addButton( tr( "Next" ), QDialogButtonBox::ActionRole );
mFixBtn = mButtonBox->addButton( tr( "Fix" ), QDialogButtonBox::ActionRole );
mSkipBtn = mButtonBox->addButton( tr( "Skip" ), QDialogButtonBox::ActionRole );
mNextBtn->setAutoDefault( true );
mFixBtn->setAutoDefault( true );
layout->addWidget( mButtonBox, 2, 0, 1, 1 );
mProgressBar = new QProgressBar();
mProgressBar->setRange( 0, errors.size() );
mProgressBar->setValue( 0 );
layout->addWidget( mProgressBar, 2, 1, 1, 1 );
mRadioGroup = new QButtonGroup( this );
connect( mButtonBox, &QDialogButtonBox::accepted, this, &QDialog::accept );
connect( mButtonBox, &QDialogButtonBox::rejected, this, &QDialog::reject );
connect( mNextBtn, &QAbstractButton::clicked, this, &QgsGeometryCheckerFixDialog::setupNextError );
connect( mFixBtn, &QAbstractButton::clicked, this, &QgsGeometryCheckerFixDialog::fixError );
connect( mSkipBtn, &QAbstractButton::clicked, this, &QgsGeometryCheckerFixDialog::skipError );
}
void QgsGeometryCheckerFixDialog::showEvent( QShowEvent * )
{
setupNextError();
}
void QgsGeometryCheckerFixDialog::setupNextError()
{
mProgressBar->setValue( mProgressBar->maximum() - mErrors.size() );
mNextBtn->setVisible( false );
mFixBtn->setVisible( true );
mFixBtn->setFocus();
mSkipBtn->setVisible( true );
mStatusLabel->clear();
mResolutionsBox->setEnabled( true );
QgsGeometryCheckError *error = mErrors.at( 0 );
emit currentErrorChanged( error );
mResolutionsBox->setTitle( tr( "Select how to fix error \"%1\":" ).arg( error->description() ) );
delete mRadioGroup;
mRadioGroup = new QButtonGroup( this );
delete mResolutionsBox->layout();
qDeleteAll( mResolutionsBox->children() );
mResolutionsBox->setLayout( new QVBoxLayout() );
mResolutionsBox->layout()->setContentsMargins( 0, 0, 0, 4 );
int id = 0;
int checkedid = QgsSettings().value( QgsGeometryCheckerResultTab::sSettingsGroup + error->check()->errorName(), QVariant::fromValue<int>( 0 ) ).toInt();
for ( const QString &method : error->check()->getResolutionMethods() )
{
QRadioButton *radio = new QRadioButton( method );
radio->setChecked( checkedid == id );
mResolutionsBox->layout()->addWidget( radio );
mRadioGroup->addButton( radio, id++ );
}
adjustSize();
}
void QgsGeometryCheckerFixDialog::fixError()
{
mResolutionsBox->setEnabled( false );
mFixBtn->setVisible( false );
mSkipBtn->setVisible( false );
setCursor( Qt::WaitCursor );
QgsGeometryCheckError *error = mErrors.at( 0 );
mChecker->fixError( error, mRadioGroup->checkedId(), true );
unsetCursor();
mStatusLabel->setText( error->resolutionMessage() );
if ( error->status() == QgsGeometryCheckError::StatusFixed )
{
mStatusLabel->setText( tr( "<b>Fixed:</b> %1" ).arg( error->resolutionMessage() ) );
}
else if ( error->status() == QgsGeometryCheckError::StatusFixFailed )
{
mStatusLabel->setText( tr( "<span color=\"red\"><b>Fixed failed:</b> %1</span>" ).arg( error->resolutionMessage() ) );
}
else if ( error->status() == QgsGeometryCheckError::StatusObsolete )
{
mStatusLabel->setText( tr( "<b>Error is obsolete</b>" ) );
}
mErrors.removeFirst();
while ( !mErrors.isEmpty() && mErrors.at( 0 )->status() >= QgsGeometryCheckError::StatusFixed )
{
mErrors.removeFirst();
}
mProgressBar->setValue( mProgressBar->maximum() - mErrors.size() );
if ( mErrors.isEmpty() )
{
mButtonBox->addButton( QDialogButtonBox::Close );
mNextBtn->setVisible( false );
mFixBtn->setVisible( false );
mSkipBtn->setVisible( false );
mButtonBox->button( QDialogButtonBox::Abort )->setVisible( false );
}
else
{
mNextBtn->setVisible( true );
mNextBtn->setFocus();
}
adjustSize();
emit currentErrorChanged( error );
}
void QgsGeometryCheckerFixDialog::skipError()
{
mErrors.removeFirst();
while ( !mErrors.isEmpty() && mErrors.at( 0 )->status() >= QgsGeometryCheckError::StatusFixed )
{
mErrors.removeFirst();
}
if ( !mErrors.isEmpty() )
{
setupNextError();
}
else
{
reject();
}
}