29
29
30
30
31
31
QgsRuleBasedRendererV2::Rule::Rule ( QgsSymbolV2* symbol, int scaleMinDenom, int scaleMaxDenom, QString filterExp, QString label, QString description )
32
- : mSymbol( symbol ),
32
+ : mParent( NULL ), mSymbol( symbol ),
33
33
mScaleMinDenom( scaleMinDenom ), mScaleMaxDenom( scaleMaxDenom ),
34
34
mFilterExp( filterExp ), mLabel( label ), mDescription( description ),
35
35
mFilter( NULL )
@@ -41,6 +41,8 @@ QgsRuleBasedRendererV2::Rule::~Rule()
41
41
{
42
42
delete mSymbol ;
43
43
delete mFilter ;
44
+ qDeleteAll ( mChildren );
45
+ // do NOT delete parent
44
46
}
45
47
46
48
void QgsRuleBasedRendererV2::Rule::initFilter ()
@@ -145,9 +147,7 @@ QgsRuleBasedRendererV2::Rule* QgsRuleBasedRendererV2::Rule::clone() const
145
147
Rule* newrule = new Rule ( sym, mScaleMinDenom , mScaleMaxDenom , mFilterExp , mLabel , mDescription );
146
148
// clone children
147
149
foreach ( Rule* rule, mChildren )
148
- {
149
- newrule->mChildren .append ( rule->clone () );
150
- }
150
+ newrule->appendChild ( rule->clone () );
151
151
return newrule;
152
152
}
153
153
@@ -320,7 +320,7 @@ QgsRuleBasedRendererV2::Rule* QgsRuleBasedRendererV2::Rule::create( QDomElement&
320
320
{
321
321
Rule* childRule = create ( childRuleElem, symbolMap );
322
322
if ( childRule )
323
- rule->mChildren . append ( childRule );
323
+ rule->appendChild ( childRule );
324
324
else
325
325
QgsDebugMsg ( " failed to init a child rule!" );
326
326
childRuleElem = childRuleElem.nextSiblingElement ( " rule" );
@@ -332,16 +332,16 @@ QgsRuleBasedRendererV2::Rule* QgsRuleBasedRendererV2::Rule::create( QDomElement&
332
332
333
333
// ///////////////////
334
334
335
+ QgsRuleBasedRendererV2::QgsRuleBasedRendererV2 ( QgsRuleBasedRendererV2::Rule* root )
336
+ : QgsFeatureRendererV2( " RuleRenderer" ), mRootRule( root )
337
+ {
338
+ }
339
+
335
340
QgsRuleBasedRendererV2::QgsRuleBasedRendererV2 ( QgsSymbolV2* defaultSymbol )
336
341
: QgsFeatureRendererV2( " RuleRenderer" )
337
342
{
338
- mRootRule = new Rule ( NULL );
339
-
340
- if ( defaultSymbol )
341
- {
342
- // add the default rule
343
- mRootRule ->children ().append ( new Rule ( defaultSymbol ) );
344
- }
343
+ mRootRule = new Rule ( NULL ); // root has no symbol, no filter etc - just a container
344
+ mRootRule ->appendChild ( new Rule ( defaultSymbol ) );
345
345
}
346
346
347
347
QgsRuleBasedRendererV2::~QgsRuleBasedRendererV2 ()
@@ -454,9 +454,7 @@ QList<QString> QgsRuleBasedRendererV2::usedAttributes()
454
454
455
455
QgsFeatureRendererV2* QgsRuleBasedRendererV2::clone ()
456
456
{
457
- QgsRuleBasedRendererV2* r = new QgsRuleBasedRendererV2 ();
458
- delete r->mRootRule ;
459
- r->mRootRule = mRootRule ->clone ();
457
+ QgsRuleBasedRendererV2* r = new QgsRuleBasedRendererV2 ( mRootRule ->clone () );
460
458
461
459
r->setUsingSymbolLevels ( usingSymbolLevels () );
462
460
setUsingSymbolLevels ( usingSymbolLevels () );
@@ -477,8 +475,8 @@ QDomElement QgsRuleBasedRendererV2::save( QDomDocument& doc )
477
475
478
476
QgsSymbolV2Map symbols;
479
477
480
- QDomElement rulesElem = doc. createElement ( " rules " );
481
- rulesElem.appendChild ( mRootRule -> save ( doc, symbols ) );
478
+ QDomElement rulesElem = mRootRule -> save ( doc, symbols );
479
+ rulesElem.setTagName ( " rules " ); // instead of just "rule"
482
480
rendererElem.appendChild ( rulesElem );
483
481
484
482
QDomElement symbolsElem = QgsSymbolLayerV2Utils::saveSymbols ( symbols, " symbols" , doc );
@@ -518,14 +516,11 @@ QgsFeatureRendererV2* QgsRuleBasedRendererV2::create( QDomElement& element )
518
516
519
517
QDomElement rulesElem = element.firstChildElement ( " rules" );
520
518
521
- QDomElement rootRuleElem = rulesElem.firstChildElement ( " rule" );
522
- Rule* root = Rule::create ( rootRuleElem, symbolMap );
519
+ Rule* root = Rule::create ( rulesElem, symbolMap );
523
520
if ( root == NULL )
524
521
return NULL ;
525
522
526
- QgsRuleBasedRendererV2* r = new QgsRuleBasedRendererV2 ();
527
- delete r->mRootRule ;
528
- r->mRootRule = root;
523
+ QgsRuleBasedRendererV2* r = new QgsRuleBasedRendererV2 ( root );
529
524
530
525
// delete symbols if there are any more
531
526
QgsSymbolLayerV2Utils::clearSymbolMap ( symbolMap );
@@ -534,48 +529,10 @@ QgsFeatureRendererV2* QgsRuleBasedRendererV2::create( QDomElement& element )
534
529
}
535
530
536
531
537
- int QgsRuleBasedRendererV2::ruleCount ()
538
- {
539
- return mRootRule ->children ().count ();
540
- }
541
-
542
- QgsRuleBasedRendererV2::Rule* QgsRuleBasedRendererV2::ruleAt ( int index )
543
- {
544
- return mRootRule ->children ()[index ];
545
- }
546
-
547
- void QgsRuleBasedRendererV2::addRule ( QgsRuleBasedRendererV2::Rule* rule )
548
- {
549
- mRootRule ->children ().append ( rule );
550
- }
551
-
552
- void QgsRuleBasedRendererV2::insertRule ( int index, QgsRuleBasedRendererV2::Rule* rule )
553
- {
554
- mRootRule ->children ().insert ( index , rule );
555
- }
556
-
557
- void QgsRuleBasedRendererV2::updateRuleAt ( int index, QgsRuleBasedRendererV2::Rule* rule )
558
- {
559
- RuleList& rules = mRootRule ->children ();
560
- delete rules[index ]; // delete previous
561
- rules[index ] = rule;
562
- }
563
-
564
- void QgsRuleBasedRendererV2::removeRuleAt ( int index )
565
- {
566
- delete mRootRule ->children ().takeAt ( index );
567
- }
568
-
569
- void QgsRuleBasedRendererV2::swapRules ( int index1, int index2 )
570
- {
571
- mRootRule ->children ().swap ( index1, index2 );
572
- }
573
-
574
-
575
532
#include " qgscategorizedsymbolrendererv2.h"
576
533
#include " qgsgraduatedsymbolrendererv2.h"
577
534
578
- QgsRuleBasedRendererV2::RuleList QgsRuleBasedRendererV2::refineRuleCategories ( QgsRuleBasedRendererV2::Rule* initialRule, QgsCategorizedSymbolRendererV2* r )
535
+ void QgsRuleBasedRendererV2::refineRuleCategories ( QgsRuleBasedRendererV2::Rule* initialRule, QgsCategorizedSymbolRendererV2* r )
579
536
{
580
537
RuleList rules;
581
538
foreach ( const QgsRendererCategoryV2& cat, r->categories () )
@@ -588,14 +545,12 @@ QgsRuleBasedRendererV2::RuleList QgsRuleBasedRendererV2::refineRuleCategories( Q
588
545
filter = newfilter;
589
546
else
590
547
filter = QString ( " (%1) AND (%2)" ).arg ( filter ).arg ( newfilter );
591
- rules. append ( new Rule ( cat.symbol ()->clone (), initialRule->scaleMinDenom (), initialRule->scaleMaxDenom (), filter, label, description ) );
548
+ initialRule-> appendChild ( new Rule ( cat.symbol ()->clone (), initialRule->scaleMinDenom (), initialRule->scaleMaxDenom (), filter, label, description ) );
592
549
}
593
- return rules;
594
550
}
595
551
596
- QgsRuleBasedRendererV2::RuleList QgsRuleBasedRendererV2::refineRuleRanges ( QgsRuleBasedRendererV2::Rule* initialRule, QgsGraduatedSymbolRendererV2* r )
552
+ void QgsRuleBasedRendererV2::refineRuleRanges ( QgsRuleBasedRendererV2::Rule* initialRule, QgsGraduatedSymbolRendererV2* r )
597
553
{
598
- RuleList rules;
599
554
foreach ( const QgsRendererRangeV2& rng, r->ranges () )
600
555
{
601
556
QString newfilter = QString ( " %1 >= '%2' AND %1 <= '%3'" ).arg ( r->classAttribute () ).arg ( rng.lowerValue () ).arg ( rng.upperValue () );
@@ -606,15 +561,13 @@ QgsRuleBasedRendererV2::RuleList QgsRuleBasedRendererV2::refineRuleRanges( QgsRu
606
561
filter = newfilter;
607
562
else
608
563
filter = QString ( " (%1) AND (%2)" ).arg ( filter ).arg ( newfilter );
609
- rules. append ( new Rule ( rng.symbol ()->clone (), initialRule->scaleMinDenom (), initialRule->scaleMaxDenom (), filter, label, description ) );
564
+ initialRule-> appendChild ( new Rule ( rng.symbol ()->clone (), initialRule->scaleMinDenom (), initialRule->scaleMaxDenom (), filter, label, description ) );
610
565
}
611
- return rules;
612
566
}
613
567
614
- QgsRuleBasedRendererV2::RuleList QgsRuleBasedRendererV2::refineRuleScales ( QgsRuleBasedRendererV2::Rule* initialRule, QList<int > scales )
568
+ void QgsRuleBasedRendererV2::refineRuleScales ( QgsRuleBasedRendererV2::Rule* initialRule, QList<int > scales )
615
569
{
616
570
qSort ( scales ); // make sure the scales are in ascending order
617
- RuleList rules;
618
571
int oldScale = initialRule->scaleMinDenom ();
619
572
int maxDenom = initialRule->scaleMaxDenom ();
620
573
QString filter = initialRule->filterExpression ();
@@ -627,12 +580,11 @@ QgsRuleBasedRendererV2::RuleList QgsRuleBasedRendererV2::refineRuleScales( QgsRu
627
580
continue ; // jump over the first scales out of the interval
628
581
if ( maxDenom != 0 && maxDenom <= scale )
629
582
break ; // ignore the latter scales out of the interval
630
- rules. append ( new Rule ( symbol->clone (), oldScale, scale, filter, label, description ) );
583
+ initialRule-> appendChild ( new Rule ( symbol->clone (), oldScale, scale, filter, label, description ) );
631
584
oldScale = scale;
632
585
}
633
586
// last rule
634
- rules.append ( new Rule ( symbol->clone (), oldScale, maxDenom, filter, label, description ) );
635
- return rules;
587
+ initialRule->appendChild ( new Rule ( symbol->clone (), oldScale, maxDenom, filter, label, description ) );
636
588
}
637
589
638
590
QString QgsRuleBasedRendererV2::dump ()
0 commit comments