From 28021ef0c53709fa6c34693b80b55dca202fca76 Mon Sep 17 00:00:00 2001 From: Larry Shaffer Date: Fri, 20 Jul 2012 04:11:30 -0600 Subject: [PATCH] Update to freeze/thaw label tool Added ability to hide label(s), i.e. set font size to 0, by holding Ctl (Cmd on Mac) modifier key. This is a temporary convenience function, until there is a specifically mapped field for showing/hiding a label. Silently fails if no font size field is mapped. Dropped What's This? text in favor of concise tool tip for freeze/thaw tool. Added self to CONTRIBUTORS. Stripped trailing whitespace from that file. --- doc/CONTRIBUTORS | 5 ++- src/app/qgsmaptoolfreezelabels.cpp | 60 ++++++++++++++++++++++++++++-- src/app/qgsmaptoolfreezelabels.h | 3 ++ src/ui/qgisapp.ui | 10 ++--- 4 files changed, 65 insertions(+), 13 deletions(-) diff --git a/doc/CONTRIBUTORS b/doc/CONTRIBUTORS index c81b48587fe..fb75dccfc7f 100644 --- a/doc/CONTRIBUTORS +++ b/doc/CONTRIBUTORS @@ -29,9 +29,10 @@ Giuseppe Sucameli Horst Duester Hyao (IRC nickname) Ivan Lucena -Jean-Denis Giguere +Jean-Denis Giguere Jeremy Palmer Jerrit Collord +Larry Shaffer Luiz Motta Magnus Homann Marco Pasetti @@ -53,5 +54,5 @@ Tamas Szekeres Tom Russo Tyler Mitchell Vita Cizek -Yann Chemin +Yann Chemin Includes Map icons CC-0 from SJJB Management diff --git a/src/app/qgsmaptoolfreezelabels.cpp b/src/app/qgsmaptoolfreezelabels.cpp index 2cf2562180c..dd580c4962b 100644 --- a/src/app/qgsmaptoolfreezelabels.cpp +++ b/src/app/qgsmaptoolfreezelabels.cpp @@ -258,6 +258,7 @@ void QgsMapToolFreezeLabels::freezeThawLabels( const QgsRectangle& ext, QMouseEv bool doThaw = e->modifiers() & Qt::ShiftModifier ? true : false; bool toggleThawOrFreeze = e->modifiers() & Qt::AltModifier ? true : false; + bool doHide = e->modifiers() & Qt::ControlModifier ? true : false; // get list of all drawn labels from all layers within, or touching, chosen extent bool labelChanged = false; @@ -314,9 +315,8 @@ void QgsMapToolFreezeLabels::freezeThawLabels( const QgsRectangle& ext, QMouseEv QString labelStringID = QString("%0|%1").arg(mCurrentLabelPos.layerID, QString::number( mCurrentLabelPos.featureId ) ); // thaw label - if ( mCurrentLabelPos.isFrozen && ( doThaw || toggleThawOrFreeze ) ) + if ( mCurrentLabelPos.isFrozen && !doHide && ( doThaw || toggleThawOrFreeze ) ) { - // thaw previously frozen label (set attribute table fields to NULL) if ( freezeThawLabel( vlayer, mCurrentLabelPos, false ) ) { @@ -329,9 +329,8 @@ void QgsMapToolFreezeLabels::freezeThawLabels( const QgsRectangle& ext, QMouseEv } // freeze label - if ( !mCurrentLabelPos.isFrozen && ( !doThaw || toggleThawOrFreeze ) ) + if ( !mCurrentLabelPos.isFrozen && !doHide && ( !doThaw || toggleThawOrFreeze ) ) { - // freeze label's location, and optionally rotation, to attribute table if ( freezeThawLabel( vlayer, mCurrentLabelPos, true ) ) { @@ -342,6 +341,20 @@ void QgsMapToolFreezeLabels::freezeThawLabels( const QgsRectangle& ext, QMouseEv QgsDebugMsg( QString( "Freeze failed for layer, label: %0, %1" ).arg( labellyr, labeltxt ) ); } } + + // hide label + if ( doHide ) + { + // write 0 font size to attribute table + if ( hideLabel( vlayer, mCurrentLabelPos ) ) + { + labelChanged = true; + } + else + { + QgsDebugMsg( QString( "Hide failed for layer, label: %0, %1" ).arg( labellyr, labeltxt ) ); + } + } } if ( labelChanged ) @@ -479,3 +492,42 @@ bool QgsMapToolFreezeLabels::freezeThawLabel( QgsVectorLayer* vlayer, } return true; } + +bool QgsMapToolFreezeLabels::hideLabel( QgsVectorLayer* vlayer, + const QgsLabelPosition& labelpos ) +{ + // skip diagrams + if ( labelpos.isDiagram ) + { + QgsDebugMsg( QString( "Label is diagram, skipping" ) ); + return false; + } + // verify attribute table has proper fields setup + bool sizeColOk; + int sizeCol; + + QVariant sizeColumn = vlayer->customProperty( "labeling/dataDefinedProperty0" ); + if ( !sizeColumn.isValid() ) + { + QgsDebugMsg( QString( "Size column not set" ) ); + return false; + } + sizeCol = sizeColumn.toInt( &sizeColOk ); + if ( !sizeColOk ) + { + QgsDebugMsg( QString( "Size column not convertible to integer" ) ); + return false; + } + + // edit attribute table + int fid = labelpos.featureId; + + vlayer->beginEditCommand( tr( "Label hidden" ) ); + if ( !vlayer->changeAttributeValue( fid, sizeCol, 0, false ) ) + { + QgsDebugMsg( QString( "Failed write to attribute table" ) ); + return false; + } + vlayer->endEditCommand(); + return true; +} diff --git a/src/app/qgsmaptoolfreezelabels.h b/src/app/qgsmaptoolfreezelabels.h index 56ec9d38c05..601e41e9ac8 100644 --- a/src/app/qgsmaptoolfreezelabels.h +++ b/src/app/qgsmaptoolfreezelabels.h @@ -95,6 +95,9 @@ class QgsMapToolFreezeLabels: public QgsMapToolLabel bool freezeThawLabel( QgsVectorLayer* vlayer, const QgsLabelPosition& labelpos, bool freeze ); + + //! Hide chosen label by setting font size to 0 + bool hideLabel( QgsVectorLayer* vlayer, const QgsLabelPosition& labelpos ); }; #endif // QGSMAPTOOLFREEZELABELS_H diff --git a/src/ui/qgisapp.ui b/src/ui/qgisapp.ui index 3a50da3b616..e79176259c2 100644 --- a/src/ui/qgisapp.ui +++ b/src/ui/qgisapp.ui @@ -1716,13 +1716,9 @@ Freeze or Thaw Labels - - Freeze (write label location and optionally rotation) to attribute table. - -Click on individual labels, or draw a marquee (labels touching will be included). Actions on in-memory attribute table fields are immediate. - -Hold Shift key down to Thaw (write NULLs to attribute table), reverting label to dynamic. -Hold Alt key down to toggle selected labels between Frozen and Thawed states. + + Freeze or Thaw Labels +Shift thaws, Alt toggles, Ctl (Cmd) hides