Skip to content

Commit 51fc960

Browse files
committedApr 8, 2013
Merge pull request #505 from vinayan/7477-add-rule-crash
[FIX #7477] Topology Checker - Crash as soon a layer is choosen when defining a rule
2 parents 34adbe7 + 52da723 commit 51fc960

File tree

4 files changed

+132
-116
lines changed

4 files changed

+132
-116
lines changed
 

‎src/plugins/topology/checkDock.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -59,15 +59,13 @@ checkDock::checkDock( QgisInterface* qIface, QWidget* parent )
5959
mErrorTableView->verticalHeader()->setDefaultSectionSize( 20 );
6060

6161
mLayerRegistry = QgsMapLayerRegistry::instance();
62-
mConfigureDialog = new rulesDialog( mLayerRegistry->mapLayers().keys(), mTest->testMap(), qIface, parent );
63-
mTestTable = mConfigureDialog->testTable();
62+
mConfigureDialog = new rulesDialog( mTest->testMap(), qIface, parent );
63+
mTestTable = mConfigureDialog->rulesTable();
6464

6565
mValidateExtentButton->setIcon( QIcon( ":/topology/validateExtent.png" ) );
6666
mValidateAllButton->setIcon( QIcon( ":/topology/validateAll.png" ) );
6767
mConfigureButton->setIcon( QIcon( ":/topology/configureRules.png" ) );
6868

69-
70-
// mQgisApp = QgisApp::instance();
7169
QgsMapCanvas* canvas = qIface->mapCanvas();// mQgisApp->mapCanvas();
7270
mRBFeature1 = new QgsRubberBand( canvas );
7371
mRBFeature2 = new QgsRubberBand( canvas );
@@ -94,11 +92,12 @@ checkDock::checkDock( QgisInterface* qIface, QWidget* parent )
9492
connect( mFixButton, SIGNAL( clicked() ), this, SLOT( fix() ) );
9593
connect( mErrorTableView, SIGNAL( clicked( const QModelIndex & ) ), this, SLOT( errorListClicked( const QModelIndex & ) ) );
9694

97-
connect( mLayerRegistry, SIGNAL( layerWasAdded( QgsMapLayer* ) ), mConfigureDialog, SLOT( addLayer( QgsMapLayer* ) ) );
98-
connect( mLayerRegistry, SIGNAL( layerWillBeRemoved( QString ) ), mConfigureDialog, SLOT( removeLayer( QString ) ) );
9995
connect( mLayerRegistry, SIGNAL( layerWillBeRemoved( QString ) ), this, SLOT( parseErrorListByLayer( QString ) ) );
10096

10197
connect( this, SIGNAL( visibilityChanged( bool ) ), this, SLOT( updateRubberBands( bool ) ) );
98+
connect( qgsInterface, SIGNAL( newProjectCreated() ), mConfigureDialog, SLOT( clearRules() ) );
99+
connect( qgsInterface, SIGNAL( newProjectCreated() ), this, SLOT( deleteErrors() ) );
100+
102101
}
103102

104103
checkDock::~checkDock()
@@ -204,6 +203,7 @@ void checkDock::parseErrorListByFeature( int featureId )
204203

205204
void checkDock::configure()
206205
{
206+
mConfigureDialog->initGui();
207207
mConfigureDialog->show();
208208
}
209209

‎src/plugins/topology/rulesDialog.cpp

Lines changed: 106 additions & 92 deletions
Original file line numberDiff line numberDiff line change
@@ -16,68 +16,46 @@
1616
***************************************************************************/
1717

1818
#include <QtGui>
19-
2019
#include <qgsvectordataprovider.h>
2120
#include <qgsvectorlayer.h>
22-
//#include <qgssearchstring.h>
23-
//#include <qgssearchtreenode.h>
2421
#include <qgsmaplayer.h>
2522
#include <qgsmaplayerregistry.h>
26-
2723
#include <qgsproviderregistry.h>
2824
#include <qgslogger.h>
2925
#include <qgisinterface.h>
3026
#include <qgsproject.h>
31-
32-
//#include "../../app/qgisapp.h"
33-
3427
#include "rulesDialog.h"
3528
#include "topolTest.h"
3629

37-
rulesDialog::rulesDialog( QList<QString> layerList, QMap<QString, TopologyRule> testMap, QgisInterface* theQgisIface, QWidget *parent )
30+
rulesDialog::rulesDialog( QMap<QString, TopologyRule> testMap, QgisInterface *theQgisIface, QWidget *parent )
3831
: QDialog( parent ), Ui::rulesDialog()
3932
{
4033
setupUi( this );
4134

4235
mQgisIface = theQgisIface;
4336

4437
//setHorizontalHeaderItems();
45-
mTestTable->hideColumn( 4 );
46-
mTestTable->hideColumn( 5 );
38+
mRulesTable->hideColumn( 4 );
39+
mRulesTable->hideColumn( 5 );
4740

4841
mTestConfMap = testMap;
49-
mTestTable->setSelectionBehavior( QAbstractItemView::SelectRows );
50-
mTestBox->addItems( mTestConfMap.keys() );
51-
52-
QgsMapLayerRegistry* layerRegistry = QgsMapLayerRegistry::instance();
53-
54-
for ( int i = 0; i < layerList.size(); ++i )
55-
{
56-
// add layer ID to the layerId list
57-
mLayerIds << layerList[i];
42+
mRulesTable->setSelectionBehavior( QAbstractItemView::SelectRows );
43+
mRuleBox->addItems( mTestConfMap.keys() );
5844

59-
QgsVectorLayer* v1 = ( QgsVectorLayer* )layerRegistry->mapLayers()[layerList[i]];
60-
qDebug() << "layerid = " + layerList[i];
61-
62-
// add layer name to the layer combo boxes
63-
mLayer1Box->addItem( v1->name(), v1->id() );
64-
//mLayer2Box->addItem((( QgsVectorLayer* )layerRegistry->mapLayers()[layerList[i]] )->name() );
65-
66-
67-
}
45+
connect( mAddTestButton, SIGNAL( clicked() ), this, SLOT( addRule() ) );
46+
connect( mAddTestButton, SIGNAL( clicked() ), mRulesTable, SLOT( resizeColumnsToContents() ) );
47+
// attempt to add new test when Ok clicked
48+
//connect( buttonBox, SIGNAL( accepted() ), this, SLOT( addTest() ) );
49+
connect( mDeleteTestButton, SIGNAL( clicked() ), this, SLOT( deleteTest() ) );
6850

6951
connect( mLayer1Box, SIGNAL( currentIndexChanged( const QString& ) ), this, SLOT( updateRuleItems( const QString& ) ) );
52+
connect( mRuleBox, SIGNAL( currentIndexChanged( const QString& ) ), this, SLOT( showControls( const QString& ) ) );
7053

71-
connect( mAddTestButton, SIGNAL( clicked() ), this, SLOT( addTest() ) );
72-
connect( mAddTestButton, SIGNAL( clicked() ), mTestTable, SLOT( resizeColumnsToContents() ) );
73-
// attempt to add new test when Ok clicked
74-
connect( buttonBox, SIGNAL( accepted() ), this, SLOT( addTest() ) );
75-
connect( mDeleteTestButton, SIGNAL( clicked() ), this, SLOT( deleteTest() ) );
76-
connect( mTestBox, SIGNAL( currentIndexChanged( const QString& ) ), this, SLOT( showControls( const QString& ) ) );
77-
mTestBox->setCurrentIndex( 4 );
54+
mRuleBox->setCurrentIndex( 0 );
7855

7956
//this resets this plugin up if a project is loaded
80-
connect( mQgisIface->mainWindow(), SIGNAL( projectRead() ), this, SLOT( projectRead() ) );
57+
connect( mQgisIface, SIGNAL( projectRead() ), this, SLOT( projectRead() ) );
58+
//reset plugin if new project is activated
8159
projectRead();
8260
}
8361

@@ -89,7 +67,7 @@ void rulesDialog::setHorizontalHeaderItems()
8967
{
9068
QStringList labels;
9169
labels << "Test" << "Layer #1" << "Layer #2" << "Tolerance" << "" << "";
92-
mTestTable->setHorizontalHeaderLabels( labels );
70+
mRulesTable->setHorizontalHeaderLabels( labels );
9371
}
9472

9573
void rulesDialog::readTest( int index, QgsMapLayerRegistry* layerRegistry )
@@ -132,59 +110,72 @@ void rulesDialog::readTest( int index, QgsMapLayerRegistry* layerRegistry )
132110
layer2Name = "No layer";
133111

134112
int row = index;
135-
mTestTable->insertRow( row );
113+
mRulesTable->insertRow( row );
136114

137115
QTableWidgetItem* newItem;
138116
newItem = new QTableWidgetItem( testName );
139117
newItem->setFlags( newItem->flags() & ~Qt::ItemIsEditable );
140-
mTestTable->setItem( row, 0, newItem );
118+
mRulesTable->setItem( row, 0, newItem );
141119

142120
newItem = new QTableWidgetItem( layer1Name );
143121
newItem->setFlags( newItem->flags() & ~Qt::ItemIsEditable );
144-
mTestTable->setItem( row, 1, newItem );
122+
mRulesTable->setItem( row, 1, newItem );
145123

146124
newItem = new QTableWidgetItem( layer2Name );
147125
newItem->setFlags( newItem->flags() & ~Qt::ItemIsEditable );
148-
mTestTable->setItem( row, 2, newItem );
126+
mRulesTable->setItem( row, 2, newItem );
149127

150128
if ( mTestConfMap[testName].useTolerance )
151129
newItem = new QTableWidgetItem( tolerance );
152130
else
153131
newItem = new QTableWidgetItem( QString( "No tolerance" ) );
154132

155133
newItem->setFlags( newItem->flags() & ~Qt::ItemIsEditable );
156-
mTestTable->setItem( row, 3, newItem );
134+
mRulesTable->setItem( row, 3, newItem );
157135

158136
// add layer ids to hidden columns
159137
newItem = new QTableWidgetItem( layer1Id );
160-
mTestTable->setItem( row, 4, newItem );
138+
mRulesTable->setItem( row, 4, newItem );
161139
newItem = new QTableWidgetItem( layer2Id );
162-
mTestTable->setItem( row, 5, newItem );
140+
mRulesTable->setItem( row, 5, newItem );
163141
}
164142

165143
void rulesDialog::projectRead()
166144
{
145+
clearRules();
167146
QgsMapLayerRegistry* layerRegistry = QgsMapLayerRegistry::instance();
168147
int testCount = QgsProject::instance()->readNumEntry( "Topol", "/testCount" );
169-
mTestTable->clearContents();
148+
mRulesTable->clearContents();
170149

171150
for ( int i = 0; i < testCount; ++i )
172151
readTest( i, layerRegistry );
173152
}
174153

175154
void rulesDialog::showControls( const QString& testName )
176155
{
156+
if ( testName.isEmpty() )
157+
{
158+
return;
159+
}
160+
177161
mLayer2Box->clear();
178162
mLayer2Box->addItem( "No layer" );
179163
TopologyRule topologyRule = mTestConfMap[testName];
180164
QgsMapLayerRegistry* layerRegistry = QgsMapLayerRegistry::instance();
165+
QList<QString> layerList = layerRegistry->mapLayers().keys();
181166

182167
if ( topologyRule.useSecondLayer )
183168
{
184169
mLayer2Box->setVisible( true );
185-
for ( int i = 0; i < mLayerIds.count(); ++i )
170+
for ( int i = 0; i < layerList.count(); ++i )
186171
{
187-
QgsVectorLayer* v1 = ( QgsVectorLayer* )layerRegistry->mapLayers()[mLayerIds.at( i )];
172+
QgsVectorLayer* v1 = ( QgsVectorLayer* )layerRegistry->mapLayers()[layerList[i]];
173+
174+
if ( !v1 )
175+
{
176+
continue;
177+
}
178+
188179

189180
if ( v1->name() == mLayer1Box->currentText() )
190181
{
@@ -193,7 +184,7 @@ void rulesDialog::showControls( const QString& testName )
193184

194185
if ( topologyRule.layer2AcceptsType( v1->geometryType() ) )
195186
{
196-
mLayer2Box->addItem( v1->name() );
187+
mLayer2Box->addItem( v1->name() , v1->id() );
197188
}
198189
}
199190
}
@@ -216,32 +207,10 @@ void rulesDialog::showControls( const QString& testName )
216207

217208
}
218209

219-
void rulesDialog::addLayer( QgsMapLayer* layer )
220-
{
221-
mLayerIds << layer->id();
222-
223-
// add layer name to the layer combo boxes
224-
mLayer1Box->addItem( layer->name() );
225-
mLayer2Box->addItem( layer->name() );
226-
}
227-
228-
void rulesDialog::removeLayer( QString layerId )
229-
{
230-
int index = mLayerIds.indexOf( layerId );
231-
232-
mLayerIds.removeAt( index );
233-
// + 1 for "No layer" string
234-
mLayer1Box->removeItem( index + 1 );
235-
mLayer2Box->removeItem( index + 1 );
236-
237-
// TODO: Maybe tell the dock that we have no layers under
238-
//if (mLayer1Box->size() == 1) do something
239-
}
240-
241-
void rulesDialog::addTest()
210+
void rulesDialog::addRule()
242211
{
243212
//sanity checks
244-
QString test = mTestBox->currentText();
213+
QString test = mRuleBox->currentText();
245214
QString layer1 = mLayer1Box->currentText();
246215
if ( layer1 == "No layer" )
247216
return;
@@ -250,54 +219,54 @@ void rulesDialog::addTest()
250219
if ( layer2 == "No layer" && mTestConfMap[test].useSecondLayer )
251220
return;
252221

253-
for ( int i = 0; i < mTestTable->rowCount(); ++i )
222+
for ( int i = 0; i < mRulesTable->rowCount(); ++i )
254223
{
255-
if ( mTestTable->item( i, 0 )->text() == test &&
256-
mTestTable->item( i, 1 )->text() == layer1 &&
257-
mTestTable->item( i, 2 )->text() == layer2 )
224+
if ( mRulesTable->item( i, 0 )->text() == test &&
225+
mRulesTable->item( i, 1 )->text() == layer1 &&
226+
mRulesTable->item( i, 2 )->text() == layer2 )
258227
{
259228
return;
260229
}
261230
}
262231

263-
int row = mTestTable->rowCount();
264-
mTestTable->insertRow( row );
232+
int row = mRulesTable->rowCount();
233+
mRulesTable->insertRow( row );
265234

266235
QTableWidgetItem* newItem;
267236
newItem = new QTableWidgetItem( test );
268-
mTestTable->setItem( row, 0, newItem );
237+
mRulesTable->setItem( row, 0, newItem );
269238
newItem = new QTableWidgetItem( layer1 );
270-
mTestTable->setItem( row, 1, newItem );
239+
mRulesTable->setItem( row, 1, newItem );
271240

272241
if ( mTestConfMap[test].useSecondLayer )
273242
newItem = new QTableWidgetItem( layer2 );
274243
else
275244
newItem = new QTableWidgetItem( "No layer" );
276245

277-
mTestTable->setItem( row, 2, newItem );
246+
mRulesTable->setItem( row, 2, newItem );
278247

279248
if ( mTestConfMap[test].useTolerance )
280249
newItem = new QTableWidgetItem( QString( "%1" ).arg( mToleranceBox->value() ) );
281250
else
282251
newItem = new QTableWidgetItem( QString( "No tolerance" ) );
283252

284-
mTestTable->setItem( row, 3, newItem );
253+
mRulesTable->setItem( row, 3, newItem );
285254

286255
QString layer1ID, layer2ID;
287256
// add layer ids to hidden columns
288257
// -1 for "No layer" string
289258
if ( mTestConfMap[test].useSecondLayer )
290-
layer2ID = mLayerIds[mLayer2Box->currentIndex() - 1];
259+
layer2ID = mLayer2Box->itemData( mLayer2Box->currentIndex() ).toString();
291260
else
292261
layer2ID = "No layer";
293262

294-
layer1ID = mLayerIds[mLayer1Box->currentIndex() - 1];
263+
layer1ID = mLayer1Box->itemData( mLayer1Box->currentIndex() ).toString();
295264

296265
//TODO: use setItemData (or something like that) instead of hidden columns
297266
newItem = new QTableWidgetItem( layer1ID );
298-
mTestTable->setItem( row, 4, newItem );
267+
mRulesTable->setItem( row, 4, newItem );
299268
newItem = new QTableWidgetItem( layer2ID );
300-
mTestTable->setItem( row, 5, newItem );
269+
mRulesTable->setItem( row, 5, newItem );
301270

302271
// save state to the project file.....
303272
QString postfix = QString( "%1" ).arg( row );
@@ -310,22 +279,27 @@ void rulesDialog::addTest()
310279
project->writeEntry( "Topol", "/layer2_" + postfix, layer2ID );
311280

312281
// reset controls to default
313-
mTestBox->setCurrentIndex( 0 );
282+
mRuleBox->setCurrentIndex( 0 );
314283
mLayer1Box->setCurrentIndex( 0 );
315284
mLayer2Box->setCurrentIndex( 0 );
316285
mToleranceBox->setValue( 0 );
317286
}
318287

319288
void rulesDialog::deleteTest()
320289
{
321-
int row = mTestTable->currentRow();
322-
if ( 0 <= row && row < mTestTable->rowCount() )
323-
mTestTable->removeRow( row );
290+
int row = mRulesTable->currentRow();
291+
if ( 0 <= row && row < mRulesTable->rowCount() )
292+
mRulesTable->removeRow( row );
324293
}
325294

326295
void rulesDialog::updateRuleItems( const QString &layerName )
327296
{
328-
mTestBox->clear();
297+
if ( layerName.isEmpty() )
298+
{
299+
return;
300+
}
301+
302+
mRuleBox->clear();
329303

330304
if ( layerName == "No layer" )
331305
{
@@ -337,13 +311,53 @@ void rulesDialog::updateRuleItems( const QString &layerName )
337311
QgsMapLayerRegistry* layerRegistry = QgsMapLayerRegistry::instance();
338312
QgsVectorLayer* vlayer = ( QgsVectorLayer* )layerRegistry->mapLayers()[layerId];
339313

314+
if ( !vlayer )
315+
{
316+
qDebug() << "not a vector layer";
317+
return;
318+
}
319+
340320
for ( QMap<QString, TopologyRule>::iterator it = mTestConfMap.begin(); it != mTestConfMap.end(); ++it )
341321
{
342322
TopologyRule rule = it.value();
343323
if ( rule.layer1AcceptsType( vlayer->geometryType() ) )
344324
{
345-
mTestBox->addItem( it.key() );
325+
mRuleBox->addItem( it.key() );
346326
}
347327

348328
}
349329
}
330+
331+
void rulesDialog::initGui()
332+
{
333+
QgsMapLayerRegistry* layerRegistry = QgsMapLayerRegistry::instance();
334+
335+
QList<QString> layerList = layerRegistry->mapLayers().keys();
336+
337+
mLayer1Box->clear();
338+
mLayer1Box->addItem( "No layer" );
339+
340+
mLayer2Box->clear();
341+
mLayer2Box->addItem( "No layer" );
342+
343+
mLayer1Box->blockSignals( true );
344+
for ( int i = 0; i < layerList.size(); ++i )
345+
{
346+
QgsVectorLayer* v1 = ( QgsVectorLayer* )layerRegistry->mapLayers()[layerList[i]];
347+
qDebug() << "layerid = " + layerList[i];
348+
349+
// add layer name to the layer combo boxes
350+
351+
mLayer1Box->addItem( v1->name(), v1->id() );
352+
}
353+
mLayer1Box->blockSignals( false );
354+
355+
}
356+
357+
void rulesDialog::clearRules()
358+
{
359+
while ( mRulesTable->rowCount() > 0 )
360+
{
361+
mRulesTable->removeRow( 0 );
362+
}
363+
}

‎src/plugins/topology/rulesDialog.h

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -40,16 +40,21 @@ class rulesDialog : public QDialog, public Ui::rulesDialog
4040
* @param theQgisIface pointer to a QgisInterface instance
4141
* @param parent parent widget
4242
*/
43-
rulesDialog( QList<QString> layerList, QMap<QString, TopologyRule> testMap, QgisInterface* theQgisIface, QWidget *parent );
43+
rulesDialog( QMap<QString, TopologyRule> testMap, QgisInterface* theQgisIface, QWidget *parent );
4444
~rulesDialog();
4545
/*
4646
* Returns pointer to the test table
4747
*/
48-
QTableWidget* testTable() { return mTestTable; }
48+
QTableWidget* rulesTable() { return mRulesTable; }
4949
/*
5050
* Returns pointer to the test combobox
5151
*/
52-
QComboBox* testBox() { return mTestBox; }
52+
QComboBox* rulesBox() { return mRuleBox; }
53+
54+
/*
55+
* Initialize Rules UI with layers and rules
56+
*/
57+
void initGui();
5358

5459
private:
5560
QMap<QString, TopologyRule> mTestConfMap;
@@ -67,6 +72,8 @@ class rulesDialog : public QDialog, public Ui::rulesDialog
6772
*/
6873
void setHorizontalHeaderItems();
6974

75+
76+
7077
private slots:
7178
/*
7279
* Shows or hides controls according to test settings
@@ -76,7 +83,7 @@ class rulesDialog : public QDialog, public Ui::rulesDialog
7683
/*
7784
* Adds test to the table
7885
*/
79-
void addTest();
86+
void addRule();
8087
/*
8188
* Deletes test from the table
8289
*/
@@ -86,22 +93,17 @@ class rulesDialog : public QDialog, public Ui::rulesDialog
8693
*/
8794
void projectRead();
8895
/*
89-
* Adds layer to layer comboboxes
90-
* @param layer layer pointer
91-
*/
92-
void addLayer( QgsMapLayer* layer );
93-
/*
94-
* Deletes layer to layer comboboxes
96+
* Updates Rule combobox to mach first layer
9597
* @param layerId layer ID
9698
*/
97-
void removeLayer( QString layerId );
98-
99+
void updateRuleItems( const QString& layerName );
99100

100101
/*
101-
* Updates Rule combobox to mach first layer
102-
* @param layerId layer ID
102+
* Deletes all rules from rules dialog
103103
*/
104-
void updateRuleItems( const QString& layerName );
104+
void clearRules();
105+
106+
105107

106108
};
107109

‎src/plugins/topology/rulesDialog.ui

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
</rect>
1212
</property>
1313
<property name="windowTitle">
14-
<string>Test settings</string>
14+
<string>Topology Rule Settings</string>
1515
</property>
1616
<layout class="QGridLayout" name="gridLayout">
1717
<item row="0" column="0">
@@ -24,7 +24,7 @@
2424
</widget>
2525
</item>
2626
<item>
27-
<widget class="QTableWidget" name="mTestTable">
27+
<widget class="QTableWidget" name="mRulesTable">
2828
<column>
2929
<property name="text">
3030
<string>Rule</string>
@@ -72,7 +72,7 @@
7272
</widget>
7373
</item>
7474
<item>
75-
<widget class="QComboBox" name="mTestBox">
75+
<widget class="QComboBox" name="mRuleBox">
7676
<property name="sizeAdjustPolicy">
7777
<enum>QComboBox::AdjustToContents</enum>
7878
</property>

0 commit comments

Comments
 (0)
Please sign in to comment.