16
16
***************************************************************************/
17
17
18
18
#include < QtGui>
19
-
20
19
#include < qgsvectordataprovider.h>
21
20
#include < qgsvectorlayer.h>
22
- // #include <qgssearchstring.h>
23
- // #include <qgssearchtreenode.h>
24
21
#include < qgsmaplayer.h>
25
22
#include < qgsmaplayerregistry.h>
26
-
27
23
#include < qgsproviderregistry.h>
28
24
#include < qgslogger.h>
29
25
#include < qgisinterface.h>
30
26
#include < qgsproject.h>
31
-
32
- // #include "../../app/qgisapp.h"
33
-
34
27
#include " rulesDialog.h"
35
28
#include " topolTest.h"
36
29
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 )
38
31
: QDialog( parent ), Ui::rulesDialog()
39
32
{
40
33
setupUi ( this );
41
34
42
35
mQgisIface = theQgisIface;
43
36
44
37
// setHorizontalHeaderItems();
45
- mTestTable ->hideColumn ( 4 );
46
- mTestTable ->hideColumn ( 5 );
38
+ mRulesTable ->hideColumn ( 4 );
39
+ mRulesTable ->hideColumn ( 5 );
47
40
48
41
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 () );
58
44
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 () ) );
68
50
69
51
connect ( mLayer1Box , SIGNAL ( currentIndexChanged ( const QString& ) ), this , SLOT ( updateRuleItems ( const QString& ) ) );
52
+ connect ( mRuleBox , SIGNAL ( currentIndexChanged ( const QString& ) ), this , SLOT ( showControls ( const QString& ) ) );
70
53
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 );
78
55
79
56
// 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
81
59
projectRead ();
82
60
}
83
61
@@ -89,7 +67,7 @@ void rulesDialog::setHorizontalHeaderItems()
89
67
{
90
68
QStringList labels;
91
69
labels << " Test" << " Layer #1" << " Layer #2" << " Tolerance" << " " << " " ;
92
- mTestTable ->setHorizontalHeaderLabels ( labels );
70
+ mRulesTable ->setHorizontalHeaderLabels ( labels );
93
71
}
94
72
95
73
void rulesDialog::readTest ( int index, QgsMapLayerRegistry* layerRegistry )
@@ -132,59 +110,72 @@ void rulesDialog::readTest( int index, QgsMapLayerRegistry* layerRegistry )
132
110
layer2Name = " No layer" ;
133
111
134
112
int row = index;
135
- mTestTable ->insertRow ( row );
113
+ mRulesTable ->insertRow ( row );
136
114
137
115
QTableWidgetItem* newItem;
138
116
newItem = new QTableWidgetItem ( testName );
139
117
newItem->setFlags ( newItem->flags () & ~Qt::ItemIsEditable );
140
- mTestTable ->setItem ( row, 0 , newItem );
118
+ mRulesTable ->setItem ( row, 0 , newItem );
141
119
142
120
newItem = new QTableWidgetItem ( layer1Name );
143
121
newItem->setFlags ( newItem->flags () & ~Qt::ItemIsEditable );
144
- mTestTable ->setItem ( row, 1 , newItem );
122
+ mRulesTable ->setItem ( row, 1 , newItem );
145
123
146
124
newItem = new QTableWidgetItem ( layer2Name );
147
125
newItem->setFlags ( newItem->flags () & ~Qt::ItemIsEditable );
148
- mTestTable ->setItem ( row, 2 , newItem );
126
+ mRulesTable ->setItem ( row, 2 , newItem );
149
127
150
128
if ( mTestConfMap [testName].useTolerance )
151
129
newItem = new QTableWidgetItem ( tolerance );
152
130
else
153
131
newItem = new QTableWidgetItem ( QString ( " No tolerance" ) );
154
132
155
133
newItem->setFlags ( newItem->flags () & ~Qt::ItemIsEditable );
156
- mTestTable ->setItem ( row, 3 , newItem );
134
+ mRulesTable ->setItem ( row, 3 , newItem );
157
135
158
136
// add layer ids to hidden columns
159
137
newItem = new QTableWidgetItem ( layer1Id );
160
- mTestTable ->setItem ( row, 4 , newItem );
138
+ mRulesTable ->setItem ( row, 4 , newItem );
161
139
newItem = new QTableWidgetItem ( layer2Id );
162
- mTestTable ->setItem ( row, 5 , newItem );
140
+ mRulesTable ->setItem ( row, 5 , newItem );
163
141
}
164
142
165
143
void rulesDialog::projectRead ()
166
144
{
145
+ clearRules ();
167
146
QgsMapLayerRegistry* layerRegistry = QgsMapLayerRegistry::instance ();
168
147
int testCount = QgsProject::instance ()->readNumEntry ( " Topol" , " /testCount" );
169
- mTestTable ->clearContents ();
148
+ mRulesTable ->clearContents ();
170
149
171
150
for ( int i = 0 ; i < testCount; ++i )
172
151
readTest ( i, layerRegistry );
173
152
}
174
153
175
154
void rulesDialog::showControls ( const QString& testName )
176
155
{
156
+ if ( testName.isEmpty () )
157
+ {
158
+ return ;
159
+ }
160
+
177
161
mLayer2Box ->clear ();
178
162
mLayer2Box ->addItem ( " No layer" );
179
163
TopologyRule topologyRule = mTestConfMap [testName];
180
164
QgsMapLayerRegistry* layerRegistry = QgsMapLayerRegistry::instance ();
165
+ QList<QString> layerList = layerRegistry->mapLayers ().keys ();
181
166
182
167
if ( topologyRule.useSecondLayer )
183
168
{
184
169
mLayer2Box ->setVisible ( true );
185
- for ( int i = 0 ; i < mLayerIds .count (); ++i )
170
+ for ( int i = 0 ; i < layerList .count (); ++i )
186
171
{
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
+
188
179
189
180
if ( v1->name () == mLayer1Box ->currentText () )
190
181
{
@@ -193,7 +184,7 @@ void rulesDialog::showControls( const QString& testName )
193
184
194
185
if ( topologyRule.layer2AcceptsType ( v1->geometryType () ) )
195
186
{
196
- mLayer2Box ->addItem ( v1->name () );
187
+ mLayer2Box ->addItem ( v1->name () , v1-> id () );
197
188
}
198
189
}
199
190
}
@@ -216,32 +207,10 @@ void rulesDialog::showControls( const QString& testName )
216
207
217
208
}
218
209
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 ()
242
211
{
243
212
// sanity checks
244
- QString test = mTestBox ->currentText ();
213
+ QString test = mRuleBox ->currentText ();
245
214
QString layer1 = mLayer1Box ->currentText ();
246
215
if ( layer1 == " No layer" )
247
216
return ;
@@ -250,54 +219,54 @@ void rulesDialog::addTest()
250
219
if ( layer2 == " No layer" && mTestConfMap [test].useSecondLayer )
251
220
return ;
252
221
253
- for ( int i = 0 ; i < mTestTable ->rowCount (); ++i )
222
+ for ( int i = 0 ; i < mRulesTable ->rowCount (); ++i )
254
223
{
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 )
258
227
{
259
228
return ;
260
229
}
261
230
}
262
231
263
- int row = mTestTable ->rowCount ();
264
- mTestTable ->insertRow ( row );
232
+ int row = mRulesTable ->rowCount ();
233
+ mRulesTable ->insertRow ( row );
265
234
266
235
QTableWidgetItem* newItem;
267
236
newItem = new QTableWidgetItem ( test );
268
- mTestTable ->setItem ( row, 0 , newItem );
237
+ mRulesTable ->setItem ( row, 0 , newItem );
269
238
newItem = new QTableWidgetItem ( layer1 );
270
- mTestTable ->setItem ( row, 1 , newItem );
239
+ mRulesTable ->setItem ( row, 1 , newItem );
271
240
272
241
if ( mTestConfMap [test].useSecondLayer )
273
242
newItem = new QTableWidgetItem ( layer2 );
274
243
else
275
244
newItem = new QTableWidgetItem ( " No layer" );
276
245
277
- mTestTable ->setItem ( row, 2 , newItem );
246
+ mRulesTable ->setItem ( row, 2 , newItem );
278
247
279
248
if ( mTestConfMap [test].useTolerance )
280
249
newItem = new QTableWidgetItem ( QString ( " %1" ).arg ( mToleranceBox ->value () ) );
281
250
else
282
251
newItem = new QTableWidgetItem ( QString ( " No tolerance" ) );
283
252
284
- mTestTable ->setItem ( row, 3 , newItem );
253
+ mRulesTable ->setItem ( row, 3 , newItem );
285
254
286
255
QString layer1ID, layer2ID;
287
256
// add layer ids to hidden columns
288
257
// -1 for "No layer" string
289
258
if ( mTestConfMap [test].useSecondLayer )
290
- layer2ID = mLayerIds [ mLayer2Box ->currentIndex () - 1 ] ;
259
+ layer2ID = mLayer2Box ->itemData ( mLayer2Box -> currentIndex () ). toString () ;
291
260
else
292
261
layer2ID = " No layer" ;
293
262
294
- layer1ID = mLayerIds [ mLayer1Box ->currentIndex () - 1 ] ;
263
+ layer1ID = mLayer1Box ->itemData ( mLayer1Box -> currentIndex () ). toString () ;
295
264
296
265
// TODO: use setItemData (or something like that) instead of hidden columns
297
266
newItem = new QTableWidgetItem ( layer1ID );
298
- mTestTable ->setItem ( row, 4 , newItem );
267
+ mRulesTable ->setItem ( row, 4 , newItem );
299
268
newItem = new QTableWidgetItem ( layer2ID );
300
- mTestTable ->setItem ( row, 5 , newItem );
269
+ mRulesTable ->setItem ( row, 5 , newItem );
301
270
302
271
// save state to the project file.....
303
272
QString postfix = QString ( " %1" ).arg ( row );
@@ -310,22 +279,27 @@ void rulesDialog::addTest()
310
279
project->writeEntry ( " Topol" , " /layer2_" + postfix, layer2ID );
311
280
312
281
// reset controls to default
313
- mTestBox ->setCurrentIndex ( 0 );
282
+ mRuleBox ->setCurrentIndex ( 0 );
314
283
mLayer1Box ->setCurrentIndex ( 0 );
315
284
mLayer2Box ->setCurrentIndex ( 0 );
316
285
mToleranceBox ->setValue ( 0 );
317
286
}
318
287
319
288
void rulesDialog::deleteTest ()
320
289
{
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 );
324
293
}
325
294
326
295
void rulesDialog::updateRuleItems ( const QString &layerName )
327
296
{
328
- mTestBox ->clear ();
297
+ if ( layerName.isEmpty () )
298
+ {
299
+ return ;
300
+ }
301
+
302
+ mRuleBox ->clear ();
329
303
330
304
if ( layerName == " No layer" )
331
305
{
@@ -337,13 +311,53 @@ void rulesDialog::updateRuleItems( const QString &layerName )
337
311
QgsMapLayerRegistry* layerRegistry = QgsMapLayerRegistry::instance ();
338
312
QgsVectorLayer* vlayer = ( QgsVectorLayer* )layerRegistry->mapLayers ()[layerId];
339
313
314
+ if ( !vlayer )
315
+ {
316
+ qDebug () << " not a vector layer" ;
317
+ return ;
318
+ }
319
+
340
320
for ( QMap<QString, TopologyRule>::iterator it = mTestConfMap .begin (); it != mTestConfMap .end (); ++it )
341
321
{
342
322
TopologyRule rule = it.value ();
343
323
if ( rule.layer1AcceptsType ( vlayer->geometryType () ) )
344
324
{
345
- mTestBox ->addItem ( it.key () );
325
+ mRuleBox ->addItem ( it.key () );
346
326
}
347
327
348
328
}
349
329
}
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
+ }
0 commit comments