Skip to content

Commit b3385bb

Browse files
author
jef
committed
fix crash when removing category
git-svn-id: http://svn.osgeo.org/qgis/trunk/qgis@12146 c8812cc2-4d05-0410-92ff-de0c093fc19c
1 parent 080f12d commit b3385bb

File tree

1 file changed

+79
-85
lines changed

1 file changed

+79
-85
lines changed

src/gui/symbology-ng/qgscategorizedsymbolrendererv2widget.cpp

+79-85
Original file line numberDiff line numberDiff line change
@@ -16,50 +16,50 @@
1616
#include <QStandardItem>
1717

1818

19-
QgsRendererV2Widget* QgsCategorizedSymbolRendererV2Widget::create(QgsVectorLayer* layer, QgsStyleV2* style, QgsFeatureRendererV2* renderer)
19+
QgsRendererV2Widget* QgsCategorizedSymbolRendererV2Widget::create( QgsVectorLayer* layer, QgsStyleV2* style, QgsFeatureRendererV2* renderer )
2020
{
21-
return new QgsCategorizedSymbolRendererV2Widget(layer, style, renderer);
21+
return new QgsCategorizedSymbolRendererV2Widget( layer, style, renderer );
2222
}
2323

24-
QgsCategorizedSymbolRendererV2Widget::QgsCategorizedSymbolRendererV2Widget(QgsVectorLayer* layer, QgsStyleV2* style, QgsFeatureRendererV2* renderer)
25-
: QgsRendererV2Widget(layer, style)
24+
QgsCategorizedSymbolRendererV2Widget::QgsCategorizedSymbolRendererV2Widget( QgsVectorLayer* layer, QgsStyleV2* style, QgsFeatureRendererV2* renderer )
25+
: QgsRendererV2Widget( layer, style )
2626
{
2727

2828
// try to recognize the previous renderer
2929
// (null renderer means "no previous renderer")
30-
if (!renderer || renderer->type() != "categorizedSymbol")
30+
if ( !renderer || renderer->type() != "categorizedSymbol" )
3131
{
3232
// we're not going to use it - so let's delete the renderer
3333
delete renderer;
3434

35-
mRenderer = new QgsCategorizedSymbolRendererV2("", QgsCategoryList());
35+
mRenderer = new QgsCategorizedSymbolRendererV2( "", QgsCategoryList() );
3636
}
3737
else
3838
{
39-
mRenderer = static_cast<QgsCategorizedSymbolRendererV2*>(renderer);
39+
mRenderer = static_cast<QgsCategorizedSymbolRendererV2*>( renderer );
4040
}
4141

4242
// setup user interface
43-
setupUi(this);
43+
setupUi( this );
4444

4545
populateColumns();
4646
populateColorRamps();
47-
QStandardItemModel* m = new QStandardItemModel(this);
47+
QStandardItemModel* m = new QStandardItemModel( this );
4848
QStringList labels;
4949
labels << "Value" << "Label";
50-
m->setHorizontalHeaderLabels(labels);
51-
viewCategories->setModel(m);
50+
m->setHorizontalHeaderLabels( labels );
51+
viewCategories->setModel( m );
5252

53-
mCategorizedSymbol = QgsSymbolV2::defaultSymbol(mLayer->geometryType());
53+
mCategorizedSymbol = QgsSymbolV2::defaultSymbol( mLayer->geometryType() );
5454

55-
connect(cboCategorizedColumn, SIGNAL(currentIndexChanged(int)), this, SLOT(categoryColumnChanged()));
55+
connect( cboCategorizedColumn, SIGNAL( currentIndexChanged( int ) ), this, SLOT( categoryColumnChanged() ) );
5656

57-
connect(viewCategories, SIGNAL(doubleClicked(const QModelIndex &)), this, SLOT(categoriesDoubleClicked(const QModelIndex &)));
57+
connect( viewCategories, SIGNAL( doubleClicked( const QModelIndex & ) ), this, SLOT( categoriesDoubleClicked( const QModelIndex & ) ) );
5858

59-
connect(btnChangeCategorizedSymbol, SIGNAL(clicked()), this, SLOT(changeCategorizedSymbol()));
60-
connect(btnAddCategories, SIGNAL(clicked()), this, SLOT(addCategories()));
61-
connect(btnDeleteCategory, SIGNAL(clicked()), this, SLOT(deleteCategory()));
62-
connect(btnDeleteAllCategories, SIGNAL(clicked()), this, SLOT(deleteAllCategories()));
59+
connect( btnChangeCategorizedSymbol, SIGNAL( clicked() ), this, SLOT( changeCategorizedSymbol() ) );
60+
connect( btnAddCategories, SIGNAL( clicked() ), this, SLOT( addCategories() ) );
61+
connect( btnDeleteCategory, SIGNAL( clicked() ), this, SLOT( deleteCategory() ) );
62+
connect( btnDeleteAllCategories, SIGNAL( clicked() ), this, SLOT( deleteAllCategories() ) );
6363

6464
// update GUI from renderer
6565
updateUiFromRenderer();
@@ -77,30 +77,30 @@ void QgsCategorizedSymbolRendererV2Widget::updateUiFromRenderer()
7777
populateCategories();
7878

7979
// set column
80-
disconnect(cboCategorizedColumn, SIGNAL(currentIndexChanged(int)), this, SLOT(categoryColumnChanged()));
80+
disconnect( cboCategorizedColumn, SIGNAL( currentIndexChanged( int ) ), this, SLOT( categoryColumnChanged() ) );
8181
QString attrName = mRenderer->classAttribute();
82-
int idx = cboCategorizedColumn->findText(attrName, Qt::MatchExactly);
83-
cboCategorizedColumn->setCurrentIndex(idx >= 0 ? idx : 0);
84-
connect(cboCategorizedColumn, SIGNAL(currentIndexChanged(int)), this, SLOT(categoryColumnChanged()));
82+
int idx = cboCategorizedColumn->findText( attrName, Qt::MatchExactly );
83+
cboCategorizedColumn->setCurrentIndex( idx >= 0 ? idx : 0 );
84+
connect( cboCategorizedColumn, SIGNAL( currentIndexChanged( int ) ), this, SLOT( categoryColumnChanged() ) );
8585

8686
// set source symbol
87-
if (mRenderer->sourceSymbol())
87+
if ( mRenderer->sourceSymbol() )
8888
{
8989
delete mCategorizedSymbol;
9090
mCategorizedSymbol = mRenderer->sourceSymbol()->clone();
9191
updateCategorizedSymbolIcon();
9292
}
9393

9494
// set source color ramp
95-
if (mRenderer->sourceColorRamp())
95+
if ( mRenderer->sourceColorRamp() )
9696
{
97-
QSize rampIconSize(50,16);
98-
QIcon icon = QgsSymbolLayerV2Utils::colorRampPreviewIcon(mRenderer->sourceColorRamp(), rampIconSize);
99-
if (cboCategorizedColorRamp->itemText(0) == "[source]")
100-
cboCategorizedColorRamp->setItemIcon(0, icon);
97+
QSize rampIconSize( 50, 16 );
98+
QIcon icon = QgsSymbolLayerV2Utils::colorRampPreviewIcon( mRenderer->sourceColorRamp(), rampIconSize );
99+
if ( cboCategorizedColorRamp->itemText( 0 ) == "[source]" )
100+
cboCategorizedColorRamp->setItemIcon( 0, icon );
101101
else
102-
cboCategorizedColorRamp->insertItem(0, icon, "[source]");
103-
cboCategorizedColorRamp->setCurrentIndex(0);
102+
cboCategorizedColorRamp->insertItem( 0, icon, "[source]" );
103+
cboCategorizedColorRamp->setCurrentIndex( 0 );
104104
}
105105

106106
}
@@ -112,47 +112,47 @@ QgsFeatureRendererV2* QgsCategorizedSymbolRendererV2Widget::renderer()
112112

113113
void QgsCategorizedSymbolRendererV2Widget::changeCategorizedSymbol()
114114
{
115-
QgsSymbolV2SelectorDialog dlg(mCategorizedSymbol, mStyle, this);
116-
if (!dlg.exec())
115+
QgsSymbolV2SelectorDialog dlg( mCategorizedSymbol, mStyle, this );
116+
if ( !dlg.exec() )
117117
return;
118118

119119
updateCategorizedSymbolIcon();
120120
}
121121

122122
void QgsCategorizedSymbolRendererV2Widget::updateCategorizedSymbolIcon()
123123
{
124-
QIcon icon = QgsSymbolLayerV2Utils::symbolPreviewIcon(mCategorizedSymbol, btnChangeCategorizedSymbol->iconSize());
125-
btnChangeCategorizedSymbol->setIcon(icon);
124+
QIcon icon = QgsSymbolLayerV2Utils::symbolPreviewIcon( mCategorizedSymbol, btnChangeCategorizedSymbol->iconSize() );
125+
btnChangeCategorizedSymbol->setIcon( icon );
126126
}
127127

128128

129129
void QgsCategorizedSymbolRendererV2Widget::populateCategories()
130130
{
131-
QStandardItemModel* m = qobject_cast<QStandardItemModel*>(viewCategories->model());
131+
QStandardItemModel* m = qobject_cast<QStandardItemModel*>( viewCategories->model() );
132132
m->clear();
133133

134134
QStringList labels;
135135
labels << "Value" << "Label";
136-
m->setHorizontalHeaderLabels(labels);
136+
m->setHorizontalHeaderLabels( labels );
137137

138-
QSize iconSize(16,16);
138+
QSize iconSize( 16, 16 );
139139

140140
int i, count = mRenderer->categories().count();
141141

142142
// TODO: sort?? utils.sortVariantList(keys);
143143

144-
for (i = 0; i < count; i++)
144+
for ( i = 0; i < count; i++ )
145145
{
146146
const QgsRendererCategoryV2& cat = mRenderer->categories()[i];
147147
QVariant k = cat.value();
148148

149-
QIcon icon = QgsSymbolLayerV2Utils::symbolPreviewIcon(cat.symbol(), iconSize);
150-
QStandardItem* item = new QStandardItem(icon, k.toString());
151-
item->setData(k); // set attribute value as user role
152-
item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
149+
QIcon icon = QgsSymbolLayerV2Utils::symbolPreviewIcon( cat.symbol(), iconSize );
150+
QStandardItem* item = new QStandardItem( icon, k.toString() );
151+
item->setData( k ); // set attribute value as user role
152+
item->setFlags( Qt::ItemIsSelectable | Qt::ItemIsEnabled );
153153

154154
QList<QStandardItem *> list;
155-
list << item << new QStandardItem(cat.label());
155+
list << item << new QStandardItem( cat.label() );
156156
m->appendRow( list );
157157
}
158158
}
@@ -162,23 +162,23 @@ void QgsCategorizedSymbolRendererV2Widget::populateColumns()
162162
cboCategorizedColumn->clear();
163163
const QgsFieldMap& flds = mLayer->pendingFields();
164164
QgsFieldMap::ConstIterator it = flds.begin();
165-
for ( ; it != flds.end(); ++it)
165+
for ( ; it != flds.end(); ++it )
166166
{
167-
cboCategorizedColumn->addItem(it->name());
167+
cboCategorizedColumn->addItem( it->name() );
168168
}
169169
}
170170

171171
void QgsCategorizedSymbolRendererV2Widget::populateColorRamps()
172172
{
173-
QSize rampIconSize(50,16);
174-
cboCategorizedColorRamp->setIconSize(rampIconSize);
173+
QSize rampIconSize( 50, 16 );
174+
cboCategorizedColorRamp->setIconSize( rampIconSize );
175175

176176
QStringList rampNames = mStyle->colorRampNames();
177-
for (QStringList::iterator it = rampNames.begin(); it != rampNames.end(); ++it)
177+
for ( QStringList::iterator it = rampNames.begin(); it != rampNames.end(); ++it )
178178
{
179-
QgsVectorColorRampV2* ramp = mStyle->colorRamp(*it);
180-
QIcon icon = QgsSymbolLayerV2Utils::colorRampPreviewIcon(ramp, rampIconSize);
181-
cboCategorizedColorRamp->addItem(icon, *it);
179+
QgsVectorColorRampV2* ramp = mStyle->colorRamp( *it );
180+
QIcon icon = QgsSymbolLayerV2Utils::colorRampPreviewIcon( ramp, rampIconSize );
181+
cboCategorizedColorRamp->addItem( icon, *it );
182182
delete ramp;
183183
}
184184
}
@@ -189,75 +189,75 @@ void QgsCategorizedSymbolRendererV2Widget::categoryColumnChanged()
189189
deleteAllCategories();
190190
}
191191

192-
void QgsCategorizedSymbolRendererV2Widget::categoriesDoubleClicked(const QModelIndex & idx)
192+
void QgsCategorizedSymbolRendererV2Widget::categoriesDoubleClicked( const QModelIndex & idx )
193193
{
194-
if (idx.isValid() && idx.column() == 0)
194+
if ( idx.isValid() && idx.column() == 0 )
195195
changeCategorySymbol();
196196
}
197197

198198
void QgsCategorizedSymbolRendererV2Widget::changeCategorySymbol()
199199
{
200200
QVariant k = currentCategory();
201-
if (!k.isValid())
201+
if ( !k.isValid() )
202202
return;
203203

204-
int catIdx = mRenderer->categoryIndexForValue(k);
204+
int catIdx = mRenderer->categoryIndexForValue( k );
205205
QgsSymbolV2* newSymbol = mRenderer->categories()[catIdx].symbol()->clone();
206206

207-
QgsSymbolV2SelectorDialog dlg(newSymbol, mStyle, this);
208-
if (!dlg.exec())
207+
QgsSymbolV2SelectorDialog dlg( newSymbol, mStyle, this );
208+
if ( !dlg.exec() )
209209
{
210210
delete newSymbol;
211211
return;
212212
}
213213

214-
mRenderer->updateCategorySymbol(catIdx, newSymbol);
214+
mRenderer->updateCategorySymbol( catIdx, newSymbol );
215215

216216
populateCategories();
217217
}
218218

219219

220220

221221

222-
static void _createCategories(QgsCategoryList& cats, QList<QVariant>& values, QgsSymbolV2* symbol, QgsVectorColorRampV2* ramp)
222+
static void _createCategories( QgsCategoryList& cats, QList<QVariant>& values, QgsSymbolV2* symbol, QgsVectorColorRampV2* ramp )
223223
{
224224
// sort the categories first
225225
// TODO: sortVariantList(values);
226226

227227
int num = values.count();
228228

229-
for (int i = 0; i < num; i++)
229+
for ( int i = 0; i < num; i++ )
230230
{
231231
QVariant value = values[i];
232-
double x = i / (double) num;
232+
double x = i / ( double ) num;
233233
QgsSymbolV2* newSymbol = symbol->clone();
234-
newSymbol->setColor( ramp->color(x) );
234+
newSymbol->setColor( ramp->color( x ) );
235235

236-
cats.append( QgsRendererCategoryV2(value, newSymbol, value.toString()) );
236+
cats.append( QgsRendererCategoryV2( value, newSymbol, value.toString() ) );
237237
}
238238

239239
}
240240

241241
void QgsCategorizedSymbolRendererV2Widget::addCategories()
242242
{
243243
QString attrName = cboCategorizedColumn->currentText();
244-
int idx = QgsFeatureRendererV2::fieldNameIndex(mLayer->pendingFields(), attrName);
244+
int idx = QgsFeatureRendererV2::fieldNameIndex( mLayer->pendingFields(), attrName );
245245
QList<QVariant> unique_vals;
246-
mLayer->dataProvider()->uniqueValues(idx, unique_vals);
246+
mLayer->dataProvider()->uniqueValues( idx, unique_vals );
247247

248248
//DlgAddCategories dlg(mStyle, createDefaultSymbol(), unique_vals, this);
249249
//if (!dlg.exec())
250250
// return;
251251

252252
QgsVectorColorRampV2* ramp = NULL;
253253
QString rampName = cboCategorizedColorRamp->currentText();
254-
if (rampName == "[source]")
254+
if ( rampName == "[source]" )
255255
ramp = mRenderer->sourceColorRamp()->clone();
256256
else
257257
ramp = mStyle->colorRamp( rampName );
258258

259259
QgsCategoryList cats;
260-
_createCategories(cats, unique_vals, mCategorizedSymbol, ramp );
260+
_createCategories( cats, unique_vals, mCategorizedSymbol, ramp );
261261

262262
// TODO: if not all categories are desired, delete some!
263263
/*
@@ -275,47 +275,41 @@ void QgsCategorizedSymbolRendererV2Widget::addCategories()
275275

276276
// recreate renderer
277277
delete mRenderer;
278-
mRenderer = new QgsCategorizedSymbolRendererV2(attrName, cats);
279-
mRenderer->setSourceSymbol(mCategorizedSymbol->clone());
280-
mRenderer->setSourceColorRamp(ramp->clone());
278+
mRenderer = new QgsCategorizedSymbolRendererV2( attrName, cats );
279+
mRenderer->setSourceSymbol( mCategorizedSymbol->clone() );
280+
mRenderer->setSourceColorRamp( ramp->clone() );
281281

282282
populateCategories();
283283
}
284284

285285
int QgsCategorizedSymbolRendererV2Widget::currentCategoryRow()
286286
{
287287
QModelIndex idx = viewCategories->selectionModel()->currentIndex();
288-
if (!idx.isValid())
288+
if ( !idx.isValid() )
289289
return -1;
290290
return idx.row();
291291
}
292292

293293
QVariant QgsCategorizedSymbolRendererV2Widget::currentCategory()
294294
{
295295
int row = currentCategoryRow();
296-
if (row == -1)
296+
if ( row == -1 )
297297
return QVariant();
298-
QStandardItemModel* m = qobject_cast<QStandardItemModel*>(viewCategories->model());
299-
return m->item(row)->data();
298+
QStandardItemModel* m = qobject_cast<QStandardItemModel*>( viewCategories->model() );
299+
return m->item( row )->data();
300300
}
301301

302302
void QgsCategorizedSymbolRendererV2Widget::deleteCategory()
303303
{
304304
QVariant k = currentCategory();
305-
if (!k.isValid())
305+
if ( !k.isValid() )
306306
return;
307307

308-
const QgsCategoryList& cats = mRenderer->categories();
309-
QgsCategoryList::ConstIterator it = cats.begin();
308+
int idx = mRenderer->categoryIndexForValue( k );
309+
if ( idx < 0 )
310+
return;
310311

311-
for ( ; it != cats.end(); ++it)
312-
{
313-
if (k.toString() == it->value().toString())
314-
{
315-
int idx = mRenderer->categoryIndexForValue(k);
316-
mRenderer->deleteCategory(idx);
317-
}
318-
}
312+
mRenderer->deleteCategory( idx );
319313

320314
populateCategories();
321315
}

0 commit comments

Comments
 (0)