21
21
#include " qgsmaplayerregistry.h"
22
22
#include " qgsrasterlayer.h"
23
23
#include " qgsrenderer.h"
24
+ #include " qgsrendererv2.h"
25
+ #include " qgssymbollayerv2utils.h"
24
26
#include " qgssymbol.h"
25
27
#include " qgsvectordataprovider.h"
26
28
#include " qgsvectorlayer.h"
@@ -40,6 +42,7 @@ QgsLegendModel::QgsLegendModel(): QStandardItemModel()
40
42
QgsLegendModel::~QgsLegendModel ()
41
43
{
42
44
removeAllSymbols ();
45
+ removeAllSymbolsV2 ();
43
46
}
44
47
45
48
void QgsLegendModel::setLayerSet ( const QStringList& layerIds )
@@ -48,6 +51,8 @@ void QgsLegendModel::setLayerSet( const QStringList& layerIds )
48
51
49
52
// for now clear the model and add the new entries
50
53
clear ();
54
+ removeAllSymbols ();
55
+ removeAllSymbolsV2 ();
51
56
52
57
QStringList::const_iterator idIter = mLayerIds .constBegin ();
53
58
QgsMapLayer* currentLayer = 0 ;
@@ -67,8 +72,21 @@ void QgsLegendModel::setLayerSet( const QStringList& layerIds )
67
72
switch ( currentLayer->type () )
68
73
{
69
74
case QgsMapLayer::VectorLayer:
70
- addVectorLayerItems ( layerItem, currentLayer );
75
+ {
76
+ QgsVectorLayer* vl = dynamic_cast <QgsVectorLayer*>( currentLayer );
77
+ if ( vl )
78
+ {
79
+ if ( vl->isUsingRendererV2 () )
80
+ {
81
+ addVectorLayerItemsV2 ( layerItem, vl );
82
+ }
83
+ else
84
+ {
85
+ addVectorLayerItems ( layerItem, vl );
86
+ }
87
+ }
71
88
break ;
89
+ }
72
90
case QgsMapLayer::RasterLayer:
73
91
addRasterLayerItem ( layerItem, currentLayer );
74
92
break ;
@@ -79,21 +97,47 @@ void QgsLegendModel::setLayerSet( const QStringList& layerIds )
79
97
80
98
}
81
99
82
- int QgsLegendModel::addVectorLayerItems ( QStandardItem* layerItem, QgsMapLayer * vlayer )
100
+ int QgsLegendModel::addVectorLayerItemsV2 ( QStandardItem* layerItem, QgsVectorLayer * vlayer )
83
101
{
84
102
if ( !layerItem || !vlayer )
85
103
{
86
104
return 1 ;
87
105
}
88
106
89
- QgsVectorLayer* vectorLayer = qobject_cast<QgsVectorLayer *>( vlayer );
90
- if ( !vectorLayer )
107
+ QgsFeatureRendererV2* renderer = vlayer-> rendererV2 ( );
108
+ if ( !renderer )
91
109
{
92
110
return 2 ;
93
111
}
94
- int opacity = vectorLayer->getTransparency ();
95
112
96
- const QgsRenderer* vectorRenderer = vectorLayer->renderer ();
113
+ QgsLegendSymbolList lst = renderer->legendSymbolItems ();
114
+ QgsLegendSymbolList::const_iterator symbolIt = lst.constBegin ();
115
+ for ( ; symbolIt != lst.constEnd (); ++symbolIt )
116
+ {
117
+ QStandardItem* currentSymbolItem = new QStandardItem ( symbolIt->first );
118
+ if ( symbolIt->second )
119
+ {
120
+ currentSymbolItem->setIcon ( QgsSymbolLayerV2Utils::symbolPreviewIcon ( symbolIt->second , QSize ( 30 , 30 ) ) );
121
+ // reserve Qt::UserRole + 2 for symbology-ng
122
+ QgsSymbolV2* newSymbol = symbolIt->second ->clone ();
123
+ insertSymbolV2 ( newSymbol );
124
+ currentSymbolItem->setData ( QVariant::fromValue (( void * )( newSymbol ) ), Qt::UserRole + 2 );
125
+ }
126
+ currentSymbolItem->setFlags ( Qt::ItemIsEnabled | Qt::ItemIsSelectable );
127
+ layerItem->setChild ( layerItem->rowCount (), 0 , currentSymbolItem );
128
+ }
129
+ }
130
+
131
+ int QgsLegendModel::addVectorLayerItems ( QStandardItem* layerItem, QgsVectorLayer* vlayer )
132
+ {
133
+ if ( !layerItem || !vlayer )
134
+ {
135
+ return 1 ;
136
+ }
137
+
138
+ int opacity = vlayer->getTransparency ();
139
+
140
+ const QgsRenderer* vectorRenderer = vlayer->renderer ();
97
141
if ( !vectorRenderer )
98
142
{
99
143
return 3 ;
@@ -103,15 +147,15 @@ int QgsLegendModel::addVectorLayerItems( QStandardItem* layerItem, QgsMapLayer*
103
147
QSettings settings;
104
148
if ( settings.value ( " /qgis/showLegendClassifiers" , false ).toBool () )
105
149
{
106
- QgsFieldMap layerFields = vectorLayer ->pendingFields ();
150
+ QgsFieldMap layerFields = vlayer ->pendingFields ();
107
151
QgsAttributeList attributes = vectorRenderer->classificationAttributes ();
108
152
QgsAttributeList::const_iterator att_it = attributes.constBegin ();
109
153
for ( ; att_it != attributes.constEnd (); ++att_it )
110
154
{
111
155
QgsFieldMap::const_iterator fieldIt = layerFields.find ( *att_it );
112
156
if ( fieldIt != layerFields.constEnd () )
113
157
{
114
- QString attributeName = vectorLayer ->attributeDisplayName ( fieldIt.key () );
158
+ QString attributeName = vlayer ->attributeDisplayName ( fieldIt.key () );
115
159
QStandardItem* attributeItem = new QStandardItem ( attributeName );
116
160
layerItem->setChild ( layerItem->rowCount (), 0 , attributeItem );
117
161
}
@@ -172,11 +216,26 @@ void QgsLegendModel::insertSymbol( QgsSymbol* s )
172
216
mSymbols .insert ( s );
173
217
}
174
218
219
+ void QgsLegendModel::insertSymbolV2 ( QgsSymbolV2* s )
220
+ {
221
+ QSet<QgsSymbolV2*>::iterator it = mSymbolsV2 .find ( s );
222
+ if ( it != mSymbolsV2 .end () )
223
+ {
224
+ delete ( *it ); // very unlikely
225
+ }
226
+ mSymbolsV2 .insert ( s );
227
+ }
228
+
175
229
void QgsLegendModel::removeSymbol ( QgsSymbol* s )
176
230
{
177
231
mSymbols .remove ( s );
178
232
}
179
233
234
+ void QgsLegendModel::removeSymbolV2 ( QgsSymbolV2* s )
235
+ {
236
+ mSymbolsV2 .remove ( s );
237
+ }
238
+
180
239
void QgsLegendModel::removeAllSymbols ()
181
240
{
182
241
QSet<QgsSymbol*>::iterator it = mSymbols .begin ();
@@ -187,6 +246,16 @@ void QgsLegendModel::removeAllSymbols()
187
246
mSymbols .clear ();
188
247
}
189
248
249
+ void QgsLegendModel::removeAllSymbolsV2 ()
250
+ {
251
+ QSet<QgsSymbolV2*>::iterator it = mSymbolsV2 .begin ();
252
+ for ( ; it != mSymbolsV2 .end (); ++it )
253
+ {
254
+ delete *it;
255
+ }
256
+ mSymbolsV2 .clear ();
257
+ }
258
+
190
259
void QgsLegendModel::updateItem ( QStandardItem* item )
191
260
{
192
261
if ( !item )
@@ -211,10 +280,22 @@ void QgsLegendModel::updateItem( QStandardItem* item )
211
280
symbol = ( QgsSymbol* )( symbolData );
212
281
}
213
282
283
+ QVariant symbolNgVariant = item->data ( Qt::UserRole + 2 );
284
+ QgsSymbolV2* symbolNg = 0 ;
285
+ if ( symbolNgVariant.canConvert <void *>() )
286
+ {
287
+ void * symbolNgData = symbolVariant.value <void *>();
288
+ symbolNg = ( QgsSymbolV2* )symbolNgData;
289
+ }
290
+
214
291
if ( symbol ) // vector classification item
215
292
{
216
293
updateVectorClassificationItem ( item, symbol, item->text () );
217
294
}
295
+ else if ( symbolNg )
296
+ {
297
+ updateVectorV2ClassificationItem ( item, symbolNg, item->text () );
298
+ }
218
299
else if ( !item->icon ().isNull () ) // raster classification item
219
300
{
220
301
updateRasterClassificationItem ( item );
@@ -243,8 +324,21 @@ void QgsLegendModel::updateLayer( QStandardItem* layerItem )
243
324
switch ( mapLayer->type () )
244
325
{
245
326
case QgsMapLayer::VectorLayer:
246
- addVectorLayerItems ( layerItem, mapLayer );
247
- break ;
327
+ {
328
+ QgsVectorLayer* vLayer = dynamic_cast <QgsVectorLayer*>( mapLayer );
329
+ if ( vLayer )
330
+ {
331
+ if ( vLayer->isUsingRendererV2 () )
332
+ {
333
+ addVectorLayerItemsV2 ( layerItem, vLayer );
334
+ }
335
+ else
336
+ {
337
+ addVectorLayerItems ( layerItem, vLayer );
338
+ }
339
+ }
340
+ }
341
+ break ;
248
342
case QgsMapLayer::RasterLayer:
249
343
addRasterLayerItem ( layerItem, mapLayer );
250
344
break ;
@@ -334,6 +428,11 @@ void QgsLegendModel::updateVectorClassificationItem( QStandardItem* classificati
334
428
}
335
429
}
336
430
431
+ void QgsLegendModel::updateVectorV2ClassificationItem ( QStandardItem* classificationItem, QgsSymbolV2* symbol, QString itemText )
432
+ {
433
+ // todo...
434
+ }
435
+
337
436
338
437
void QgsLegendModel::updateRasterClassificationItem ( QStandardItem* classificationItem )
339
438
{
@@ -406,8 +505,21 @@ void QgsLegendModel::addLayer( QgsMapLayer* theMapLayer )
406
505
switch ( theMapLayer->type () )
407
506
{
408
507
case QgsMapLayer::VectorLayer:
409
- addVectorLayerItems ( layerItem, theMapLayer );
508
+ {
509
+ QgsVectorLayer* vl = dynamic_cast <QgsVectorLayer*>( theMapLayer );
510
+ if ( vl )
511
+ {
512
+ if ( vl->isUsingRendererV2 () )
513
+ {
514
+ addVectorLayerItemsV2 ( layerItem, vl );
515
+ }
516
+ else
517
+ {
518
+ addVectorLayerItems ( layerItem, vl );
519
+ }
520
+ }
410
521
break ;
522
+ }
411
523
case QgsMapLayer::RasterLayer:
412
524
addRasterLayerItem ( layerItem, theMapLayer );
413
525
break ;
@@ -522,17 +634,38 @@ bool QgsLegendModel::writeXML( QDomElement& composerLegendElem, QDomDocument& do
522
634
523
635
// store text and QgsSymbol for vector classification items
524
636
QVariant symbolVariant = currentClassificationItem->data ();
637
+ QVariant symbolNgVariant = currentClassificationItem->data ( Qt::UserRole + 2 );
525
638
QgsSymbol* symbol = 0 ;
639
+ QgsSymbolV2* symbolNg = 0 ;
640
+
526
641
if ( symbolVariant.canConvert <void *>() )
527
642
{
528
643
void * symbolData = symbolVariant.value <void *>();
529
- symbol = ( QgsSymbol* )( symbolData ) ;
644
+ symbol = ( QgsSymbol* )symbolData;
530
645
}
531
- if ( symbol )
646
+ else if ( symbolNgVariant. canConvert < void *>() )
532
647
{
533
- QDomElement vectorClassElem = doc.createElement ( " VectorClassificationItem" );
648
+ void * symbolNgData = symbolNgVariant.value <void *>();
649
+ symbolNg = ( QgsSymbolV2* )symbolNgData;
650
+ }
651
+
652
+ if ( symbol || symbolNg )
653
+ {
654
+ QDomElement vectorClassElem;
655
+ if ( symbol )
656
+ {
657
+ vectorClassElem = doc.createElement ( " VectorClassificationItem" );
658
+ symbol->writeXML ( vectorClassElem, doc, 0 );
659
+ }
660
+ else if ( symbolNg )
661
+ {
662
+ vectorClassElem = doc.createElement ( " VectorClassificationItemNg" );
663
+ QgsSymbolV2Map saveSymbolMap;
664
+ saveSymbolMap.insert ( " classificationSymbol" , symbolNg );
665
+ QDomElement symbolsElem = QgsSymbolLayerV2Utils::saveSymbols ( saveSymbolMap, " symbols" , doc );
666
+ vectorClassElem.appendChild ( symbolsElem );
667
+ }
534
668
vectorClassElem.setAttribute ( " text" , currentClassificationItem->text () );
535
- symbol->writeXML ( vectorClassElem, doc, 0 );
536
669
newLayerItem.appendChild ( vectorClassElem );
537
670
continue ;
538
671
}
@@ -639,6 +772,23 @@ bool QgsLegendModel::readXML( const QDomElement& legendModelElem, const QDomDocu
639
772
}
640
773
layerItem->setChild ( layerItem->rowCount (), 0 , childItem );
641
774
}
775
+ else if ( currentChildElement.tagName () == " VectorClassificationItemNg" )
776
+ {
777
+ QDomElement symbolNgElem = currentChildElement.firstChildElement ( " symbols" );
778
+ if ( !symbolNgElem.isNull () )
779
+ {
780
+ QgsSymbolV2Map loadSymbolMap = QgsSymbolLayerV2Utils::loadSymbols ( symbolNgElem );
781
+ // we assume there is only one symbol in the map...
782
+ QgsSymbolV2Map::iterator mapIt = loadSymbolMap.begin ();
783
+ if ( mapIt != loadSymbolMap.end () )
784
+ {
785
+ QgsSymbolV2* symbolNg = mapIt.value ();
786
+ childItem->setData ( QVariant::fromValue (( void * )symbolNg ), Qt::UserRole + 2 );
787
+ childItem->setIcon ( QgsSymbolLayerV2Utils::symbolPreviewIcon ( symbolNg, QSize ( 30 , 30 ) ) );
788
+ }
789
+ layerItem->setChild ( layerItem->rowCount (), 0 , childItem );
790
+ }
791
+ }
642
792
else if ( currentChildElement.tagName () == " TextItem" )
643
793
{
644
794
layerItem->setChild ( layerItem->rowCount (), 0 , childItem );
0 commit comments