@@ -40,14 +40,17 @@ QgsCategorizedSymbolRendererV2Widget::QgsCategorizedSymbolRendererV2Widget( QgsV
40
40
mRenderer = static_cast <QgsCategorizedSymbolRendererV2*>( renderer );
41
41
}
42
42
43
+ QString attrName = mRenderer ->classAttribute ();
44
+ mOldClassificationAttribute = attrName;
45
+
43
46
// setup user interface
44
47
setupUi ( this );
45
48
46
49
populateColumns ();
47
50
populateColorRamps ();
48
51
QStandardItemModel* m = new QStandardItemModel ( this );
49
52
QStringList labels;
50
- labels << " Value" << " Label" ;
53
+ labels << tr ( " Symbol " ) << tr ( " Value" ) << tr ( " Label" ) ;
51
54
m->setHorizontalHeaderLabels ( labels );
52
55
viewCategories->setModel ( m );
53
56
@@ -61,6 +64,7 @@ QgsCategorizedSymbolRendererV2Widget::QgsCategorizedSymbolRendererV2Widget( QgsV
61
64
connect ( btnAddCategories, SIGNAL ( clicked () ), this , SLOT ( addCategories () ) );
62
65
connect ( btnDeleteCategory, SIGNAL ( clicked () ), this , SLOT ( deleteCategory () ) );
63
66
connect ( btnDeleteAllCategories, SIGNAL ( clicked () ), this , SLOT ( deleteAllCategories () ) );
67
+ connect ( btnAddCategory, SIGNAL ( clicked () ), this , SLOT ( addCategory () ) );
64
68
connect ( m, SIGNAL ( itemChanged ( QStandardItem * ) ), this , SLOT ( changeCurrentValue ( QStandardItem * ) ) );
65
69
66
70
// update GUI from renderer
@@ -81,6 +85,7 @@ void QgsCategorizedSymbolRendererV2Widget::updateUiFromRenderer()
81
85
// set column
82
86
disconnect ( cboCategorizedColumn, SIGNAL ( currentIndexChanged ( int ) ), this , SLOT ( categoryColumnChanged () ) );
83
87
QString attrName = mRenderer ->classAttribute ();
88
+ mOldClassificationAttribute = attrName;
84
89
int idx = cboCategorizedColumn->findText ( attrName, Qt::MatchExactly );
85
90
cboCategorizedColumn->setCurrentIndex ( idx >= 0 ? idx : 0 );
86
91
connect ( cboCategorizedColumn, SIGNAL ( currentIndexChanged ( int ) ), this , SLOT ( categoryColumnChanged () ) );
@@ -127,36 +132,28 @@ void QgsCategorizedSymbolRendererV2Widget::updateCategorizedSymbolIcon()
127
132
btnChangeCategorizedSymbol->setIcon ( icon );
128
133
}
129
134
130
-
131
135
void QgsCategorizedSymbolRendererV2Widget::populateCategories ()
132
136
{
133
137
QStandardItemModel* m = qobject_cast<QStandardItemModel*>( viewCategories->model () );
134
138
m->clear ();
135
139
136
140
QStringList labels;
137
- labels << " Value" << " Label" ;
141
+ labels << tr ( " Symbol " ) << tr ( " Value" ) << tr ( " Label" ) ;
138
142
m->setHorizontalHeaderLabels ( labels );
139
143
140
- QSize iconSize ( 16 , 16 );
141
-
142
144
int i, count = mRenderer ->categories ().count ();
143
145
144
146
// TODO: sort?? utils.sortVariantList(keys);
145
147
146
148
for ( i = 0 ; i < count; i++ )
147
149
{
148
- const QgsRendererCategoryV2& cat = mRenderer ->categories ()[i];
149
- QVariant k = cat.value ();
150
-
151
- QIcon icon = QgsSymbolLayerV2Utils::symbolPreviewIcon ( cat.symbol (), iconSize );
152
- QStandardItem* item = new QStandardItem ( icon, k.toString () );
153
- item->setData ( k ); // set attribute value as user role
154
- item->setFlags ( Qt::ItemIsSelectable | Qt::ItemIsEnabled );
155
-
156
- QList<QStandardItem *> list;
157
- list << item << new QStandardItem ( cat.label () );
158
- m->appendRow ( list );
150
+ const QgsRendererCategoryV2 &cat = mRenderer ->categories ()[i];
151
+ addCategory ( cat );
159
152
}
153
+
154
+ viewCategories->resizeColumnToContents ( 0 );
155
+ viewCategories->resizeColumnToContents ( 1 );
156
+ viewCategories->resizeColumnToContents ( 2 );
160
157
}
161
158
162
159
void QgsCategorizedSymbolRendererV2Widget::populateColumns ()
@@ -185,6 +182,21 @@ void QgsCategorizedSymbolRendererV2Widget::populateColorRamps()
185
182
}
186
183
}
187
184
185
+ void QgsCategorizedSymbolRendererV2Widget::addCategory ( const QgsRendererCategoryV2 &cat )
186
+ {
187
+ QSize iconSize ( 16 , 16 );
188
+
189
+ QIcon icon = QgsSymbolLayerV2Utils::symbolPreviewIcon ( cat.symbol (), iconSize );
190
+ QStandardItem *symbolItem = new QStandardItem ( icon, " " );
191
+ symbolItem->setFlags ( Qt::ItemIsSelectable | Qt::ItemIsEnabled );
192
+
193
+ QStandardItem *valueItem = new QStandardItem ( cat.value ().toString () );
194
+ valueItem->setData ( cat.value () ); // set attribute value as user role
195
+
196
+ QList<QStandardItem *> list;
197
+ list << symbolItem << valueItem << new QStandardItem ( cat.label () );
198
+ qobject_cast<QStandardItemModel *>( viewCategories->model () )->appendRow ( list );
199
+ }
188
200
189
201
void QgsCategorizedSymbolRendererV2Widget::categoryColumnChanged ()
190
202
{
@@ -218,9 +230,6 @@ void QgsCategorizedSymbolRendererV2Widget::changeCategorySymbol()
218
230
populateCategories ();
219
231
}
220
232
221
-
222
-
223
-
224
233
static void _createCategories ( QgsCategoryList& cats, QList<QVariant>& values, QgsSymbolV2* symbol, QgsVectorColorRampV2* ramp )
225
234
{
226
235
// sort the categories first
@@ -270,9 +279,47 @@ void QgsCategorizedSymbolRendererV2Widget::addCategories()
270
279
QgsCategoryList cats;
271
280
_createCategories ( cats, unique_vals, mCategorizedSymbol , ramp );
272
281
282
+ bool deleteExisting = false ;
283
+ if ( !mOldClassificationAttribute .isEmpty () &&
284
+ attrName != mOldClassificationAttribute &&
285
+ mRenderer ->categories ().count () > 0 )
286
+ {
287
+ int res = QMessageBox::question ( this ,
288
+ tr ( " Confirm Delete" ),
289
+ tr ( " The classification field was changed from '%1' to '%2'.\n "
290
+ " Should the existing classes be deleted before classification?" )
291
+ .arg ( mOldClassificationAttribute ).arg ( attrName ),
292
+ QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel );
293
+ if ( res == QMessageBox::Cancel )
294
+ return ;
295
+ if ( res == QMessageBox::Yes )
296
+ deleteExisting = true ;
297
+ }
298
+
299
+ mOldClassificationAttribute = attrName;
300
+
301
+ if ( !deleteExisting )
302
+ {
303
+ QgsCategoryList prevCats = mRenderer ->categories ();
304
+ for ( int i = 0 ; i < cats.size (); ++i )
305
+ {
306
+ bool contains = false ;
307
+ QVariant value = cats.at ( i ).value ();
308
+ for ( int j = 0 ; j < prevCats.size () && !contains; ++j )
309
+ {
310
+ if ( prevCats.at ( j ).value () == value )
311
+ contains = true ;
312
+ }
313
+
314
+ if ( !contains )
315
+ prevCats.append ( cats.at ( i ) );
316
+ }
317
+ cats = prevCats;
318
+ }
319
+
273
320
// TODO: if not all categories are desired, delete some!
274
321
/*
275
- if (not dlg.radAllCats .isChecked())
322
+ if (not dlg.readAllCats .isChecked())
276
323
{
277
324
cats2 = {}
278
325
for item in dlg.listCategories.selectedItems():
@@ -307,7 +354,7 @@ QVariant QgsCategorizedSymbolRendererV2Widget::currentCategory()
307
354
if ( row == -1 )
308
355
return QVariant ();
309
356
QStandardItemModel* m = qobject_cast<QStandardItemModel*>( viewCategories->model () );
310
- return m->item ( row )->data ();
357
+ return m->item ( row, 1 )->data ();
311
358
}
312
359
313
360
void QgsCategorizedSymbolRendererV2Widget::deleteCategory ()
@@ -333,10 +380,29 @@ void QgsCategorizedSymbolRendererV2Widget::deleteAllCategories()
333
380
334
381
void QgsCategorizedSymbolRendererV2Widget::changeCurrentValue ( QStandardItem * item )
335
382
{
383
+ int idx = item->row ();
384
+ QString newtext = item->text ();
336
385
if ( item->column () == 1 )
337
386
{
338
- QString label = item->text ();
339
- int idx = item->row ();
340
- mRenderer ->updateCategoryLabel ( idx, label );
387
+ QVariant value = newtext;
388
+ // try to preserve variant type for this value
389
+ QVariant::Type t = item->data ().type ();
390
+ if ( t == QVariant::Int )
391
+ value = newtext.toInt ();
392
+ else if ( t == QVariant::Double )
393
+ value = newtext.toDouble ();
394
+ mRenderer ->updateCategoryValue ( idx, value );
395
+ }
396
+ else if ( item->column () == 2 )
397
+ {
398
+ mRenderer ->updateCategoryLabel ( idx, newtext );
341
399
}
342
400
}
401
+
402
+ void QgsCategorizedSymbolRendererV2Widget::addCategory ()
403
+ {
404
+ QgsSymbolV2 *symbol = QgsSymbolV2::defaultSymbol ( mLayer ->geometryType () );
405
+ QgsRendererCategoryV2 cat ( QString (), symbol, QString () );
406
+ addCategory ( cat );
407
+ mRenderer ->addCategory ( cat );
408
+ }
0 commit comments