@@ -258,6 +258,7 @@ void QgsMapToolFreezeLabels::freezeThawLabels( const QgsRectangle& ext, QMouseEv
258
258
259
259
bool doThaw = e->modifiers () & Qt::ShiftModifier ? true : false ;
260
260
bool toggleThawOrFreeze = e->modifiers () & Qt::AltModifier ? true : false ;
261
+ bool doHide = e->modifiers () & Qt::ControlModifier ? true : false ;
261
262
262
263
// get list of all drawn labels from all layers within, or touching, chosen extent
263
264
bool labelChanged = false ;
@@ -314,9 +315,8 @@ void QgsMapToolFreezeLabels::freezeThawLabels( const QgsRectangle& ext, QMouseEv
314
315
QString labelStringID = QString (" %0|%1" ).arg (mCurrentLabelPos .layerID , QString::number ( mCurrentLabelPos .featureId ) );
315
316
316
317
// thaw label
317
- if ( mCurrentLabelPos .isFrozen && ( doThaw || toggleThawOrFreeze ) )
318
+ if ( mCurrentLabelPos .isFrozen && !doHide && ( doThaw || toggleThawOrFreeze ) )
318
319
{
319
-
320
320
// thaw previously frozen label (set attribute table fields to NULL)
321
321
if ( freezeThawLabel ( vlayer, mCurrentLabelPos , false ) )
322
322
{
@@ -329,9 +329,8 @@ void QgsMapToolFreezeLabels::freezeThawLabels( const QgsRectangle& ext, QMouseEv
329
329
}
330
330
331
331
// freeze label
332
- if ( !mCurrentLabelPos .isFrozen && ( !doThaw || toggleThawOrFreeze ) )
332
+ if ( !mCurrentLabelPos .isFrozen && !doHide && ( !doThaw || toggleThawOrFreeze ) )
333
333
{
334
-
335
334
// freeze label's location, and optionally rotation, to attribute table
336
335
if ( freezeThawLabel ( vlayer, mCurrentLabelPos , true ) )
337
336
{
@@ -342,6 +341,20 @@ void QgsMapToolFreezeLabels::freezeThawLabels( const QgsRectangle& ext, QMouseEv
342
341
QgsDebugMsg ( QString ( " Freeze failed for layer, label: %0, %1" ).arg ( labellyr, labeltxt ) );
343
342
}
344
343
}
344
+
345
+ // hide label
346
+ if ( doHide )
347
+ {
348
+ // write 0 font size to attribute table
349
+ if ( hideLabel ( vlayer, mCurrentLabelPos ) )
350
+ {
351
+ labelChanged = true ;
352
+ }
353
+ else
354
+ {
355
+ QgsDebugMsg ( QString ( " Hide failed for layer, label: %0, %1" ).arg ( labellyr, labeltxt ) );
356
+ }
357
+ }
345
358
}
346
359
347
360
if ( labelChanged )
@@ -479,3 +492,42 @@ bool QgsMapToolFreezeLabels::freezeThawLabel( QgsVectorLayer* vlayer,
479
492
}
480
493
return true ;
481
494
}
495
+
496
+ bool QgsMapToolFreezeLabels::hideLabel ( QgsVectorLayer* vlayer,
497
+ const QgsLabelPosition& labelpos )
498
+ {
499
+ // skip diagrams
500
+ if ( labelpos.isDiagram )
501
+ {
502
+ QgsDebugMsg ( QString ( " Label is diagram, skipping" ) );
503
+ return false ;
504
+ }
505
+ // verify attribute table has proper fields setup
506
+ bool sizeColOk;
507
+ int sizeCol;
508
+
509
+ QVariant sizeColumn = vlayer->customProperty ( " labeling/dataDefinedProperty0" );
510
+ if ( !sizeColumn.isValid () )
511
+ {
512
+ QgsDebugMsg ( QString ( " Size column not set" ) );
513
+ return false ;
514
+ }
515
+ sizeCol = sizeColumn.toInt ( &sizeColOk );
516
+ if ( !sizeColOk )
517
+ {
518
+ QgsDebugMsg ( QString ( " Size column not convertible to integer" ) );
519
+ return false ;
520
+ }
521
+
522
+ // edit attribute table
523
+ int fid = labelpos.featureId ;
524
+
525
+ vlayer->beginEditCommand ( tr ( " Label hidden" ) );
526
+ if ( !vlayer->changeAttributeValue ( fid, sizeCol, 0 , false ) )
527
+ {
528
+ QgsDebugMsg ( QString ( " Failed write to attribute table" ) );
529
+ return false ;
530
+ }
531
+ vlayer->endEditCommand ();
532
+ return true ;
533
+ }
0 commit comments