Navigation Menu

Skip to content

Commit

Permalink
[topology checker] Implement a means to filter errors by type
Browse files Browse the repository at this point in the history
  • Loading branch information
nirvn committed Jan 26, 2023
1 parent 4c515d1 commit 0baf3c9
Show file tree
Hide file tree
Showing 5 changed files with 138 additions and 10 deletions.
35 changes: 34 additions & 1 deletion src/plugins/topology/checkDock.cpp
Expand Up @@ -36,6 +36,7 @@
#include "qgisinterface.h"
#include "qgsmessagelog.h"
#include "qgssettings.h"
#include "qgsstringutils.h"

#include "topolTest.h"
#include "rulesDialog.h"
Expand All @@ -55,7 +56,8 @@ checkDock::checkDock( QgisInterface *qIface, QWidget *parent )
mFixButton->hide();
mFixBox->hide();

mErrorListModel = new DockModel( mErrorList, parent );
mErrorListModel = new DockFilterModel( mErrorList, parent );
mErrorListModel->setFilterCaseSensitivity( Qt::CaseInsensitive );
mErrorTableView->setModel( mErrorListModel );
mErrorTableView->setSelectionBehavior( QAbstractItemView::SelectRows );
mErrorTableView->verticalHeader()->setDefaultSectionSize( 20 );
Expand Down Expand Up @@ -95,6 +97,8 @@ checkDock::checkDock( QgisInterface *qIface, QWidget *parent )
connect( qgsInterface, &QgisInterface::newProjectCreated, mConfigureDialog, &rulesDialog::clearRules );
connect( qgsInterface, &QgisInterface::newProjectCreated, this, &checkDock::deleteErrors );

updateFilterComboBox();
connect( mFilterComboBox, &QComboBox::currentTextChanged, this, &checkDock::filterErrors );
}

checkDock::~checkDock()
Expand Down Expand Up @@ -128,6 +132,11 @@ void checkDock::clearVertexMarkers()
}
}

void checkDock::filterErrors()
{
mErrorListModel->setFilterFixedString( mFilterComboBox->currentIndex() > 0 ? mFilterComboBox->currentText() : QString() );
}

void checkDock::updateRubberBands( bool visible )
{
if ( !visible )
Expand All @@ -147,6 +156,9 @@ void checkDock::deleteErrors()
{
qDeleteAll( mErrorList );

mErrorNames.clear();
updateFilterComboBox();

mErrorList.clear();
mErrorListModel->resetModel();

Expand Down Expand Up @@ -387,12 +399,33 @@ void checkDock::runTests( ValidateType type )
}
mErrorList << errors;
}

for ( TopolError *error : mErrorList )
{
if ( !mErrorNames.contains( error->name() ) )
{
mErrorNames << error->name();
}
}
updateFilterComboBox();

mToggleRubberband->setChecked( true );
mErrorListModel->resetModel();
}

void checkDock::updateFilterComboBox()
{
mFilterComboBox->clear();
mFilterComboBox->addItem( tr( "All Errors" ) );
for ( const QString &name : mErrorNames )
{
mFilterComboBox->addItem( QgsStringUtils::capitalize( name, Qgis::Capitalization::TitleCase ) );
}
}

void checkDock::validate( ValidateType type )
{
mErrorNames.clear();
mErrorList.clear();

qDeleteAll( mRbErrorMarkers );
Expand Down
13 changes: 12 additions & 1 deletion src/plugins/topology/checkDock.h
Expand Up @@ -106,6 +106,16 @@ class checkDock : public QgsDockWidget, private Ui::checkDock
*/
void updateRubberBands( bool visible );

/**
* Update the filter combo box to reflect
* current error names
*/
void updateFilterComboBox();

/**
* Filter errors using the current filter combo box's value
*/
void filterErrors();

private:
rulesDialog *mConfigureDialog = nullptr;
Expand All @@ -119,8 +129,9 @@ class checkDock : public QgsDockWidget, private Ui::checkDock
QgsVertexMarker *mVMFeature2 = nullptr;
QList<QgsRubberBand *> mRbErrorMarkers;

QStringList mErrorNames;
ErrorList mErrorList;
DockModel *mErrorListModel = nullptr;
DockFilterModel *mErrorListModel = nullptr;

QgisInterface *qgsInterface = nullptr;

Expand Down
39 changes: 33 additions & 6 deletions src/plugins/topology/checkDock.ui
Expand Up @@ -14,11 +14,11 @@
<string>Topology Checker Panel</string>
</property>
<widget class="QWidget" name="dockWidgetContents">
<layout class="QGridLayout" name="gridLayout_2">
<layout class="QVBoxLayout" name="mainVerticalLayout">
<property name="margin">
<number>0</number>
</property>
<item row="0" column="0">
<item>
<widget class="QToolBar" name="mTopologyToolbar">
<property name="iconSize">
<size>
Expand All @@ -34,7 +34,34 @@
<addaction name="actionConfigure"/>
</widget>
</item>
<item row="1" column="0">
<item>
<layout class="QHBoxLayout" name="filterLayout">
<item>
<widget class="QLabel" name="filterLabel">
<property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="text">
<string>Show:</string>
</property>
</widget>
</item>
<item>
<widget class="QComboBox" name="mFilterComboBox">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>1</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QTableView" name="mErrorTableView">
Expand All @@ -45,15 +72,15 @@
</item>
</layout>
</item>
<item row="2" column="0">
<item>
<layout class="QHBoxLayout" name="horizontalLayout_5">
<item>
<widget class="QCheckBox" name="mToggleRubberband">
<property name="toolTip">
<string>Show topology errors</string>
</property>
<property name="text">
<string>Show errors</string>
<string>Show errors on the canvas</string>
</property>
<property name="checked">
<bool>false</bool>
Expand All @@ -69,7 +96,7 @@
</item>
</layout>
</item>
<item row="3" column="0">
<item>
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0">
<widget class="QComboBox" name="mFixBox">
Expand Down
25 changes: 24 additions & 1 deletion src/plugins/topology/dockModel.cpp
Expand Up @@ -20,7 +20,8 @@
#include "qgsvectorlayer.h"
#include <qlogging.h>

DockModel::DockModel( ErrorList &errorList, QObject *parent = nullptr ) : mErrorlist( errorList )
DockModel::DockModel( ErrorList &errorList, QObject *parent = nullptr )
: mErrorlist( errorList )
{
Q_UNUSED( parent )
mHeader << QObject::tr( "Error" ) << QObject::tr( "Layer" ) << QObject::tr( "Feature ID" );
Expand Down Expand Up @@ -132,3 +133,25 @@ void DockModel::reload( const QModelIndex &index1, const QModelIndex &index2 )
{
emit dataChanged( index1, index2 );
}

DockFilterModel::DockFilterModel( ErrorList &errorList, QObject *parent = nullptr )
: mDockModel( new DockModel( errorList, parent ) )
{
setSourceModel( mDockModel );
setFilterKeyColumn( 0 );
}

DockFilterModel::~DockFilterModel()
{
mDockModel->deleteLater();
}

void DockFilterModel::reload( const QModelIndex &index1, const QModelIndex &index2 )
{
mDockModel->reload( index1, index2 );
}

void DockFilterModel::resetModel()
{
mDockModel->resetModel();
}
36 changes: 35 additions & 1 deletion src/plugins/topology/dockModel.h
Expand Up @@ -19,12 +19,13 @@
#define DOCKMODEL_H

#include <QAbstractTableModel>
#include <QSortFilterProxyModel>
#include <QModelIndex>
#include <QObject>

#include "topolError.h"

class DockModel: public QAbstractTableModel
class DockModel : public QAbstractTableModel
{
Q_OBJECT

Expand Down Expand Up @@ -95,4 +96,37 @@ class DockModel: public QAbstractTableModel
QList<QString> mHeader;
};

class DockFilterModel : public QSortFilterProxyModel
{
Q_OBJECT

public:

/**
* Constructor
* \param errorList reference to the ErrorList where errors will be stored
* \param parent parent object
*/
DockFilterModel( ErrorList &errorList, QObject *parent );

~DockFilterModel();

/**
* Reloads the model data between indices
* \param index1 start index
* \param index2 end index
*/
void reload( const QModelIndex &index1, const QModelIndex &index2 );

/**
* Resets the model
*/
void resetModel();

private:

DockModel *mDockModel = nullptr;

};

#endif

0 comments on commit 0baf3c9

Please sign in to comment.