@@ -1239,19 +1239,19 @@ QSet< QString > QgsRuleBasedRenderer::legendKeysForFeature( const QgsFeature &fe
1239
1239
1240
1240
QgsRuleBasedRenderer *QgsRuleBasedRenderer::convertFromRenderer ( const QgsFeatureRenderer *renderer )
1241
1241
{
1242
- QgsRuleBasedRenderer *r = nullptr ;
1242
+ std::unique_ptr< QgsRuleBasedRenderer > r ;
1243
1243
if ( renderer->type () == QLatin1String ( " RuleRenderer" ) )
1244
1244
{
1245
- r = dynamic_cast <QgsRuleBasedRenderer *>( renderer->clone () );
1245
+ r. reset ( dynamic_cast <QgsRuleBasedRenderer *>( renderer->clone () ) );
1246
1246
}
1247
1247
else if ( renderer->type () == QLatin1String ( " singleSymbol" ) )
1248
1248
{
1249
1249
const QgsSingleSymbolRenderer *singleSymbolRenderer = dynamic_cast <const QgsSingleSymbolRenderer *>( renderer );
1250
1250
if ( !singleSymbolRenderer )
1251
1251
return nullptr ;
1252
1252
1253
- QgsSymbol * origSymbol = singleSymbolRenderer->symbol ()->clone ();
1254
- r = new QgsRuleBasedRenderer ( origSymbol );
1253
+ std::unique_ptr< QgsSymbol > origSymbol ( singleSymbolRenderer->symbol ()->clone () );
1254
+ r = qgis::make_unique< QgsRuleBasedRenderer > ( origSymbol. release () );
1255
1255
}
1256
1256
else if ( renderer->type () == QLatin1String ( " categorizedSymbol" ) )
1257
1257
{
@@ -1269,51 +1269,79 @@ QgsRuleBasedRenderer *QgsRuleBasedRenderer::convertFromRenderer( const QgsFeatur
1269
1269
attr = QgsExpression::quotedColumnRef ( attr );
1270
1270
}
1271
1271
1272
- QgsRuleBasedRenderer::Rule * rootrule = new QgsRuleBasedRenderer::Rule ( nullptr );
1272
+ std::unique_ptr< QgsRuleBasedRenderer::Rule > rootrule = qgis::make_unique< QgsRuleBasedRenderer::Rule > ( nullptr );
1273
1273
1274
1274
QString expression;
1275
1275
QString value;
1276
1276
QgsRendererCategory category;
1277
- for ( int i = 0 ; i < categorizedRenderer->categories (). size (); ++i )
1277
+ for ( const QgsRendererCategory &category : categorizedRenderer->categories () )
1278
1278
{
1279
- category = categorizedRenderer->categories ().value ( i );
1280
- QgsRuleBasedRenderer::Rule *rule = new QgsRuleBasedRenderer::Rule ( nullptr );
1279
+ std::unique_ptr< QgsRuleBasedRenderer::Rule > rule = qgis::make_unique< QgsRuleBasedRenderer::Rule >( nullptr );
1281
1280
1282
1281
rule->setLabel ( category.label () );
1283
1282
1284
1283
// We first define the rule corresponding to the category
1285
- // If the value is a number, we can use it directly, otherwise we need to quote it in the rule
1286
- if ( QVariant ( category.value () ).convert ( QVariant::Double ) )
1284
+ if ( category.value ().type () == QVariant::List )
1287
1285
{
1288
- value = category.value ().toString ();
1289
- }
1290
- else
1291
- {
1292
- value = QgsExpression::quotedString ( category.value ().toString () );
1293
- }
1286
+ QStringList values;
1287
+ const QVariantList list = category.value ().toList ();
1288
+ for ( const QVariant &v : list )
1289
+ {
1290
+ // If the value is a number, we can use it directly, otherwise we need to quote it in the rule
1291
+ if ( QVariant ( v ).convert ( QVariant::Double ) )
1292
+ {
1293
+ values << v.toString ();
1294
+ }
1295
+ else
1296
+ {
1297
+ values << QgsExpression::quotedString ( v.toString () );
1298
+ }
1299
+ }
1294
1300
1295
- // An empty category is equivalent to the ELSE keyword
1296
- if ( value == QLatin1String ( " ''" ) )
1297
- {
1298
- expression = QStringLiteral ( " ELSE" );
1301
+ if ( values.empty () )
1302
+ {
1303
+ expression = QStringLiteral ( " ELSE" );
1304
+ }
1305
+ else
1306
+ {
1307
+ expression = QStringLiteral ( " %1 IN (%2)" ).arg ( attr, values.join ( ' ,' ) );
1308
+ }
1299
1309
}
1300
1310
else
1301
1311
{
1302
- expression = QStringLiteral ( " %1 = %2" ).arg ( attr, value );
1312
+ // If the value is a number, we can use it directly, otherwise we need to quote it in the rule
1313
+ if ( category.value ().convert ( QVariant::Double ) )
1314
+ {
1315
+ value = category.value ().toString ();
1316
+ }
1317
+ else
1318
+ {
1319
+ value = QgsExpression::quotedString ( category.value ().toString () );
1320
+ }
1321
+
1322
+ // An empty category is equivalent to the ELSE keyword
1323
+ if ( value == QLatin1String ( " ''" ) )
1324
+ {
1325
+ expression = QStringLiteral ( " ELSE" );
1326
+ }
1327
+ else
1328
+ {
1329
+ expression = QStringLiteral ( " %1 = %2" ).arg ( attr, value );
1330
+ }
1303
1331
}
1304
1332
rule->setFilterExpression ( expression );
1305
1333
1306
1334
// Then we construct an equivalent symbol.
1307
1335
// Ideally we could simply copy the symbol, but the categorized renderer allows a separate interface to specify
1308
1336
// data dependent area and rotation, so we need to convert these to obtain the same rendering
1309
1337
1310
- QgsSymbol * origSymbol = category.symbol ()->clone ();
1311
- rule->setSymbol ( origSymbol );
1338
+ std::unique_ptr< QgsSymbol > origSymbol ( category.symbol ()->clone () );
1339
+ rule->setSymbol ( origSymbol. release () );
1312
1340
1313
- rootrule->appendChild ( rule );
1341
+ rootrule->appendChild ( rule. release () );
1314
1342
}
1315
1343
1316
- r = new QgsRuleBasedRenderer ( rootrule );
1344
+ r = qgis::make_unique< QgsRuleBasedRenderer > ( rootrule. release () );
1317
1345
}
1318
1346
else if ( renderer->type () == QLatin1String ( " graduatedSymbol" ) )
1319
1347
{
@@ -1336,14 +1364,14 @@ QgsRuleBasedRenderer *QgsRuleBasedRenderer::convertFromRenderer( const QgsFeatur
1336
1364
attr = QStringLiteral ( " (%1)" ).arg ( attr );
1337
1365
}
1338
1366
1339
- QgsRuleBasedRenderer::Rule * rootrule = new QgsRuleBasedRenderer::Rule ( nullptr );
1367
+ std::unique_ptr< QgsRuleBasedRenderer::Rule > rootrule = qgis::make_unique< QgsRuleBasedRenderer::Rule > ( nullptr );
1340
1368
1341
1369
QString expression;
1342
1370
QgsRendererRange range;
1343
1371
for ( int i = 0 ; i < graduatedRenderer->ranges ().size (); ++i )
1344
1372
{
1345
1373
range = graduatedRenderer->ranges ().value ( i );
1346
- QgsRuleBasedRenderer::Rule * rule = new QgsRuleBasedRenderer::Rule ( nullptr );
1374
+ std::unique_ptr< QgsRuleBasedRenderer::Rule > rule = qgis::make_unique< QgsRuleBasedRenderer::Rule > ( nullptr );
1347
1375
rule->setLabel ( range.label () );
1348
1376
if ( i == 0 )// The lower boundary of the first range is included, while it is excluded for the others
1349
1377
{
@@ -1361,13 +1389,13 @@ QgsRuleBasedRenderer *QgsRuleBasedRenderer::convertFromRenderer( const QgsFeatur
1361
1389
// Ideally we could simply copy the symbol, but the graduated renderer allows a separate interface to specify
1362
1390
// data dependent area and rotation, so we need to convert these to obtain the same rendering
1363
1391
1364
- QgsSymbol * symbol = range.symbol ()->clone ();
1365
- rule->setSymbol ( symbol );
1392
+ std::unique_ptr< QgsSymbol > symbol ( range.symbol ()->clone () );
1393
+ rule->setSymbol ( symbol. release () );
1366
1394
1367
- rootrule->appendChild ( rule );
1395
+ rootrule->appendChild ( rule. release () );
1368
1396
}
1369
1397
1370
- r = new QgsRuleBasedRenderer ( rootrule );
1398
+ r = qgis::make_unique< QgsRuleBasedRenderer > ( rootrule. release () );
1371
1399
}
1372
1400
else if ( renderer->type () == QLatin1String ( " pointDisplacement" ) || renderer->type () == QLatin1String ( " pointCluster" ) )
1373
1401
{
@@ -1379,7 +1407,7 @@ QgsRuleBasedRenderer *QgsRuleBasedRenderer::convertFromRenderer( const QgsFeatur
1379
1407
{
1380
1408
const QgsInvertedPolygonRenderer *invertedPolygonRenderer = dynamic_cast <const QgsInvertedPolygonRenderer *>( renderer );
1381
1409
if ( invertedPolygonRenderer )
1382
- r = convertFromRenderer ( invertedPolygonRenderer->embeddedRenderer () );
1410
+ r. reset ( convertFromRenderer ( invertedPolygonRenderer->embeddedRenderer () ) );
1383
1411
}
1384
1412
1385
1413
if ( r )
@@ -1388,7 +1416,7 @@ QgsRuleBasedRenderer *QgsRuleBasedRenderer::convertFromRenderer( const QgsFeatur
1388
1416
r->setOrderByEnabled ( renderer->orderByEnabled () );
1389
1417
}
1390
1418
1391
- return r;
1419
+ return r. release () ;
1392
1420
}
1393
1421
1394
1422
void QgsRuleBasedRenderer::convertToDataDefinedSymbology ( QgsSymbol *symbol, const QString &sizeScaleField, const QString &rotationField )
0 commit comments