Skip to content

Commit 6a5dcac

Browse files
committedOct 11, 2012
Merge pull request #287 from tecoholic/3275
Fix for issue #3275
2 parents a587cb6 + 936f4aa commit 6a5dcac

6 files changed

+149
-9
lines changed
 

‎src/core/symbology-ng/qgscategorizedsymbolrendererv2.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -596,3 +596,15 @@ void QgsCategorizedSymbolRendererV2::setSourceColorRamp( QgsVectorColorRampV2* r
596596
delete mSourceColorRamp;
597597
mSourceColorRamp = ramp;
598598
}
599+
600+
void QgsCategorizedSymbolRendererV2::updateSymbols( QgsSymbolV2 * sym )
601+
{
602+
int i = 0;
603+
foreach( QgsRendererCategoryV2 cat, mCategories )
604+
{
605+
QgsSymbolV2* symbol = sym->clone();
606+
symbol->setColor( cat.symbol()->color() );
607+
updateCategorySymbol( i, symbol );
608+
++i;
609+
}
610+
}

‎src/core/symbology-ng/qgscategorizedsymbolrendererv2.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,8 @@ class CORE_EXPORT QgsCategorizedSymbolRendererV2 : public QgsFeatureRendererV2
8484
virtual int capabilities() { return SymbolLevels | RotationField; }
8585

8686
virtual QgsSymbolV2List symbols();
87+
//! @note added in 2.0
88+
void updateSymbols( QgsSymbolV2 * sym );
8789

8890
const QgsCategoryList& categories() { return mCategories; }
8991

‎src/gui/symbology-ng/qgscategorizedsymbolrendererv2widget.cpp

Lines changed: 81 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -151,13 +151,63 @@ QgsFeatureRendererV2* QgsCategorizedSymbolRendererV2Widget::renderer()
151151
return mRenderer;
152152
}
153153

154+
void QgsCategorizedSymbolRendererV2Widget::changeSelectedSymbols()
155+
{
156+
QItemSelectionModel* m = viewCategories->selectionModel();
157+
QModelIndexList selectedIndexes = m->selectedRows( 1 );
158+
159+
if ( m && selectedIndexes.size() > 0 )
160+
{
161+
QgsSymbolV2* newSymbol = mCategorizedSymbol->clone();
162+
QgsSymbolV2SelectorDialog dlg( newSymbol, mStyle, mLayer, this );
163+
if ( !dlg.exec() )
164+
{
165+
delete newSymbol;
166+
return;
167+
}
168+
169+
foreach( QModelIndex idx, selectedIndexes )
170+
{
171+
if( idx.isValid() )
172+
{
173+
int catIdx = mRenderer->categoryIndexForValue( idx.data( Qt::UserRole + 1 ) );
174+
QgsSymbolV2* newCatSymbol = newSymbol->clone();
175+
newCatSymbol->setColor( mRenderer->categories()[catIdx].symbol()->color() );
176+
mRenderer->updateCategorySymbol( catIdx, newCatSymbol );
177+
}
178+
}
179+
}
180+
181+
populateCategories();
182+
}
183+
154184
void QgsCategorizedSymbolRendererV2Widget::changeCategorizedSymbol()
155185
{
156-
QgsSymbolV2SelectorDialog dlg( mCategorizedSymbol, mStyle, mLayer, this );
186+
// When there is a slection, change the selected symbols alone
187+
QItemSelectionModel* m = viewCategories->selectionModel();
188+
QModelIndexList i = m->selectedRows();
189+
190+
if ( m && i.size() > 0 )
191+
{
192+
changeSelectedSymbols();
193+
return;
194+
}
195+
196+
// When there is no selection, change the base mCategorizedSymbol
197+
QgsSymbolV2* newSymbol = mCategorizedSymbol->clone();
198+
199+
QgsSymbolV2SelectorDialog dlg( newSymbol, mStyle, mLayer, this );
157200
if ( !dlg.exec() )
201+
{
202+
delete newSymbol;
158203
return;
204+
}
159205

206+
mCategorizedSymbol = newSymbol;
160207
updateCategorizedSymbolIcon();
208+
209+
mRenderer->updateSymbols( mCategorizedSymbol );
210+
populateCategories();
161211
}
162212

163213
void QgsCategorizedSymbolRendererV2Widget::updateCategorizedSymbolIcon()
@@ -396,18 +446,41 @@ QVariant QgsCategorizedSymbolRendererV2Widget::currentCategory()
396446
return m->item( row, 1 )->data();
397447
}
398448

449+
QList<QVariant> QgsCategorizedSymbolRendererV2Widget::selectedCategories()
450+
{
451+
QList<QVariant> categories;
452+
QModelIndexList rows = viewCategories->selectionModel()->selectedRows();
453+
QStandardItemModel* m = qobject_cast<QStandardItemModel*>( viewCategories->model() );
454+
455+
foreach( QModelIndex r, rows )
456+
{
457+
if( r.isValid() )
458+
{
459+
categories.append( m->item( r.row(), 1 )->data() );
460+
}
461+
}
462+
463+
return categories;
464+
}
465+
399466
void QgsCategorizedSymbolRendererV2Widget::deleteCategory()
400467
{
401-
QVariant k = currentCategory();
402-
if ( !k.isValid() )
403-
return;
468+
QList<QVariant> categories = selectedCategories();
404469

405-
int idx = mRenderer->categoryIndexForValue( k );
406-
if ( idx < 0 )
470+
if ( !categories.size() )
407471
return;
408472

409-
mRenderer->deleteCategory( idx );
410-
473+
foreach( const QVariant k, categories )
474+
{
475+
if ( k.isValid() )
476+
{
477+
int idx = mRenderer->categoryIndexForValue( k );
478+
if ( idx >= 0 )
479+
{
480+
mRenderer->deleteCategory( idx );
481+
}
482+
}
483+
}
411484
populateCategories();
412485
}
413486

‎src/gui/symbology-ng/qgscategorizedsymbolrendererv2widget.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,12 @@ class GUI_EXPORT QgsCategorizedSymbolRendererV2Widget : public QgsRendererV2Widg
7070
//! return key for the currently selected category
7171
QVariant currentCategory();
7272

73+
//! return a list of keys for the categories unders selection
74+
QList<QVariant> selectedCategories();
75+
76+
//! change the selected symbols alone for the change button, if there is a selection
77+
void changeSelectedSymbols();
78+
7379
void changeCategorySymbol();
7480

7581
QList<QgsSymbolV2*> selectedSymbols();

‎src/gui/symbology-ng/qgsgraduatedsymbolrendererv2widget.cpp

Lines changed: 46 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -239,9 +239,26 @@ void QgsGraduatedSymbolRendererV2Widget::reapplyColorRamp()
239239

240240
void QgsGraduatedSymbolRendererV2Widget::changeGraduatedSymbol()
241241
{
242-
QgsSymbolV2SelectorDialog dlg( mGraduatedSymbol, mStyle, mLayer, this );
242+
// Change the selected symbols alone if anything is selected
243+
QItemSelectionModel* m = viewGraduated->selectionModel();
244+
QModelIndexList i = m->selectedRows();
245+
if ( m && i.size() > 0 )
246+
{
247+
changeSelectedSymbols();
248+
return;
249+
}
250+
251+
// Otherwise change the base mGraduatedSymbol
252+
QgsSymbolV2* newSymbol = mGraduatedSymbol->clone();
253+
254+
QgsSymbolV2SelectorDialog dlg( newSymbol, mStyle, mLayer, this );
243255
if ( !dlg.exec() )
256+
{
257+
delete newSymbol;
244258
return;
259+
}
260+
261+
mGraduatedSymbol = newSymbol;
245262

246263
updateGraduatedSymbolIcon();
247264
mRenderer->updateSymbols( mGraduatedSymbol );
@@ -320,6 +337,34 @@ void QgsGraduatedSymbolRendererV2Widget::rangesClicked( const QModelIndex & idx
320337
mRowSelected = idx.row();
321338
}
322339

340+
void QgsGraduatedSymbolRendererV2Widget::changeSelectedSymbols()
341+
{
342+
QItemSelectionModel* m = viewGraduated->selectionModel();
343+
QModelIndexList selectedIndexes = m->selectedRows( 1 );
344+
if ( m && selectedIndexes.size() > 0 )
345+
{
346+
QgsSymbolV2* newSymbol = mGraduatedSymbol->clone();
347+
QgsSymbolV2SelectorDialog dlg( newSymbol, mStyle, mLayer, this );
348+
if ( !dlg.exec() )
349+
{
350+
delete newSymbol;
351+
return;
352+
}
353+
354+
foreach( QModelIndex idx, selectedIndexes )
355+
{
356+
if( idx.isValid() )
357+
{
358+
int rangeIdx = idx.row();
359+
QgsSymbolV2* newRangeSymbol = newSymbol->clone();
360+
newRangeSymbol->setColor( mRenderer->ranges()[rangeIdx].symbol()->color() );
361+
mRenderer->updateRangeSymbol( rangeIdx, newRangeSymbol );
362+
}
363+
}
364+
}
365+
refreshSymbolView();
366+
}
367+
323368
void QgsGraduatedSymbolRendererV2Widget::changeRangeSymbol( int rangeIdx )
324369
{
325370
QgsSymbolV2* newSymbol = mRenderer->ranges()[rangeIdx].symbol()->clone();

‎src/gui/symbology-ng/qgsgraduatedsymbolrendererv2widget.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,8 @@ class GUI_EXPORT QgsGraduatedSymbolRendererV2Widget : public QgsRendererV2Widget
6868
void changeRangeSymbol( int rangeIdx );
6969
void changeRange( int rangeIdx );
7070

71+
void changeSelectedSymbols();
72+
7173
QList<QgsSymbolV2*> selectedSymbols();
7274
QgsSymbolV2* findSymbolForRange( double lowerBound, double upperBound, const QgsRangeList& ranges ) const;
7375
void refreshSymbolView();

0 commit comments

Comments
 (0)
Please sign in to comment.