mirror of
https://github.com/qgis/QGIS.git
synced 2025-03-25 00:05:03 -04:00
187 lines
6.2 KiB
C++
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();
|
|
}
|
|
}
|