Skip to content

Commit 87ae8a3

Browse files
committed
Rule-based renderer: selection and drawing of markers works again
1 parent 14b718b commit 87ae8a3

File tree

2 files changed

+24
-28
lines changed

2 files changed

+24
-28
lines changed

src/core/symbology-ng/qgsrulebasedrendererv2.cpp

Lines changed: 9 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -260,9 +260,9 @@ void QgsRuleBasedRendererV2::Rule::setNormZLevels( const QMap<int, int>& zLevels
260260
}
261261

262262

263-
void QgsRuleBasedRendererV2::Rule::renderFeature( QgsFeature* featPtr, QgsRenderContext& context, QgsRuleBasedRendererV2::RenderQueue& renderQueue )
263+
void QgsRuleBasedRendererV2::Rule::renderFeature( QgsRuleBasedRendererV2::FeatureToRender& featToRender, QgsRenderContext& context, QgsRuleBasedRendererV2::RenderQueue& renderQueue )
264264
{
265-
if ( isFilterOK( *featPtr ) )
265+
if ( isFilterOK( featToRender.feat ) )
266266
{
267267
// create job for this feature and this symbol, add to list of jobs
268268
if ( mSymbol )
@@ -271,15 +271,15 @@ void QgsRuleBasedRendererV2::Rule::renderFeature( QgsFeature* featPtr, QgsRender
271271
foreach( int normZLevel, mSymbolNormZLevels )
272272
{
273273
//QgsDebugMsg(QString("add job at level %1").arg(normZLevel));
274-
renderQueue[normZLevel].jobs.append( new RenderJob( featPtr, mSymbol ) );
274+
renderQueue[normZLevel].jobs.append( new RenderJob( featToRender, mSymbol ) );
275275
}
276276
}
277277

278278
// process children
279279
for ( QList<Rule*>::iterator it = mActiveChildren.begin(); it != mActiveChildren.end(); ++it )
280280
{
281281
Rule* rule = *it;
282-
rule->renderFeature( featPtr, context, renderQueue );
282+
rule->renderFeature( featToRender, context, renderQueue );
283283
}
284284
}
285285
}
@@ -371,20 +371,12 @@ void QgsRuleBasedRendererV2::renderFeature( QgsFeature& feature,
371371
bool drawVertexMarker )
372372
{
373373
Q_UNUSED( layer );
374-
Q_UNUSED( selected );
375-
Q_UNUSED( drawVertexMarker );
376374

377-
// TODO: selected features, vertex markers
378-
379-
QgsFeature* featPtr = NULL;
380-
if ( !featPtr )
381-
{
382-
featPtr = new QgsFeature( feature );
383-
mCurrentFeatures.append( featPtr );
384-
}
375+
int flags = ( selected ? FeatIsSelected : 0 ) | ( drawVertexMarker ? FeatDrawMarkers : 0 );
376+
mCurrentFeatures.append( FeatureToRender( feature, flags ) );
385377

386378
// check each active rule
387-
mRootRule->renderFeature( featPtr, context, mRenderQueue );
379+
mRootRule->renderFeature( mCurrentFeatures.last(), context, mRenderQueue );
388380
}
389381

390382

@@ -415,10 +407,6 @@ void QgsRuleBasedRendererV2::stopRender( QgsRenderContext& context )
415407
// do the actual rendering
416408
//
417409

418-
// TODO: selected, markers
419-
bool selected = false;
420-
bool drawVertexMarker = false;
421-
422410
// go through all levels
423411
foreach( const RenderLevel& level, mRenderQueue )
424412
{
@@ -437,17 +425,14 @@ void QgsRuleBasedRendererV2::stopRender( QgsRenderContext& context )
437425
// but there are multiple transforms going on!
438426
if ( s->symbolLayer( i )->renderingPass() == level.zIndex )
439427
{
440-
renderFeatureWithSymbol( *job->f, job->symbol, context, i, selected, drawVertexMarker );
428+
int flags = job->ftr.flags;
429+
renderFeatureWithSymbol( job->ftr.feat, job->symbol, context, i, flags & FeatIsSelected, flags & FeatDrawMarkers );
441430
}
442431
}
443432
}
444433
}
445434

446435
// clean current features
447-
foreach( QgsFeature* f, mCurrentFeatures )
448-
{
449-
delete f;
450-
}
451436
mCurrentFeatures.clear();
452437

453438
// clean render queue

src/core/symbology-ng/qgsrulebasedrendererv2.h

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
#define QGSRULEBASEDRENDERERV2_H
1818

1919
#include "qgsfield.h"
20+
#include "qgsfeature.h"
2021

2122
#include "qgsrendererv2.h"
2223

@@ -36,12 +37,22 @@ class CORE_EXPORT QgsRuleBasedRendererV2 : public QgsFeatureRendererV2
3637

3738
// TODO: use QVarLengthArray instead of QList
3839

40+
enum FeatureFlags { FeatIsSelected = 1, FeatDrawMarkers = 2 };
41+
42+
// feature for rendering: QgsFeature and some flags
43+
struct FeatureToRender
44+
{
45+
FeatureToRender( QgsFeature& _f, int _flags ) : feat( _f ), flags( _flags ) {}
46+
QgsFeature feat;
47+
int flags; // selected and/or draw markers
48+
};
49+
3950
// rendering job: a feature to be rendered with a particular symbol
4051
// (both f, symbol are _not_ owned by this class)
4152
struct RenderJob
4253
{
43-
RenderJob( QgsFeature* _f, QgsSymbolV2* _s ) : f( _f ), symbol( _s ) {}
44-
QgsFeature* f;
54+
RenderJob( FeatureToRender& _ftr, QgsSymbolV2* _s ) : ftr( _ftr ), symbol( _s ) {}
55+
FeatureToRender& ftr;
4556
QgsSymbolV2* symbol;
4657
};
4758

@@ -114,7 +125,7 @@ class CORE_EXPORT QgsRuleBasedRendererV2 : public QgsFeatureRendererV2
114125
//! assign normalized z-levels [0..N-1] for this rule's symbol for quick access during rendering
115126
void setNormZLevels( const QMap<int, int>& zLevelsToNormLevels );
116127

117-
void renderFeature( QgsFeature* featPtr, QgsRenderContext& context, RenderQueue& renderQueue );
128+
void renderFeature( FeatureToRender& featToRender, QgsRenderContext& context, RenderQueue& renderQueue );
118129

119130
void stopRender( QgsRenderContext& context );
120131

@@ -212,7 +223,7 @@ class CORE_EXPORT QgsRuleBasedRendererV2 : public QgsFeatureRendererV2
212223

213224
// temporary
214225
RenderQueue mRenderQueue;
215-
QList<QgsFeature*> mCurrentFeatures;
226+
QList<FeatureToRender> mCurrentFeatures;
216227
};
217228

218229
#endif // QGSRULEBASEDRENDERERV2_H

0 commit comments

Comments
 (0)