Skip to content

Commit

Permalink
[labeling][FEATURE] Allow data defined control over "label every
Browse files Browse the repository at this point in the history
part of multipart features" setting
  • Loading branch information
nyalldawson committed Jul 27, 2019
1 parent 051e315 commit ab7106a
Show file tree
Hide file tree
Showing 12 changed files with 160 additions and 87 deletions.
5 changes: 2 additions & 3 deletions src/core/pal/layer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,6 @@ Layer::Layer( QgsAbstractLabelProvider *provider, const QString &name, QgsPalLay
, mDisplayAll( displayAll )
, mCentroidInside( false )
, mArrangement( arrangement )
, mMode( LabelPerFeature )
, mMergeLines( false )
, mUpsidedownLabels( Upright )
{
Expand Down Expand Up @@ -180,7 +179,7 @@ bool Layer::registerFeature( QgsLabelFeature *lf )
continue;
}

if ( mMode == LabelPerFeature && ( type == GEOS_POLYGON || type == GEOS_LINESTRING ) )
if ( !lf->labelAllParts() && ( type == GEOS_POLYGON || type == GEOS_LINESTRING ) )
{
if ( type == GEOS_LINESTRING )
GEOSLength_r( geosctxt, geom, &geom_size );
Expand Down Expand Up @@ -249,7 +248,7 @@ bool Layer::registerFeature( QgsLabelFeature *lf )
locker.unlock();

// if using only biggest parts...
if ( ( mMode == LabelPerFeature || lf->hasFixedPosition() ) && biggest_part )
if ( ( !lf->labelAllParts() || lf->hasFixedPosition() ) && biggest_part )
{
addFeaturePart( biggest_part.release(), lf->labelText() );
addedFeature = true;
Expand Down
15 changes: 0 additions & 15 deletions src/core/pal/layer.h
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,6 @@ namespace pal
friend class LabelPosition;

public:
enum LabelMode { LabelPerFeature, LabelPerFeaturePart };
enum UpsideDownLabels
{
Upright, // upside-down labels (90 <= angle < 270) are shown upright
Expand Down Expand Up @@ -176,19 +175,6 @@ namespace pal
*/
double priority() const { return mDefaultPriority; }

/**
* Sets the layer's labeling mode.
* \param mode label mode
* \see labelMode
*/
void setLabelMode( LabelMode mode ) { mMode = mode; }

/**
* Returns the layer's labeling mode.
* \see setLabelMode
*/
LabelMode labelMode() const { return mMode; }

/**
* Sets whether connected lines should be merged before labeling
* \param merge set to TRUE to merge connected lines
Expand Down Expand Up @@ -278,7 +264,6 @@ namespace pal
//! Optional flags used for some placement methods
QgsPalLayerSettings::Placement mArrangement;

LabelMode mMode;
bool mMergeLines;

UpsideDownLabels mUpsidedownLabels;
Expand Down
17 changes: 17 additions & 0 deletions src/core/qgslabelfeature.h
Original file line number Diff line number Diff line change
Expand Up @@ -348,6 +348,7 @@ class CORE_EXPORT QgsLabelFeature
*/
void setArrangementFlags( pal::LineArrangementFlags flags ) { mArrangementFlags = flags; }


/**
* Text of the label
*
Expand Down Expand Up @@ -444,6 +445,20 @@ class CORE_EXPORT QgsLabelFeature
*/
void setOverrunSmoothDistance( double distance );

/**
* Returns TRUE if all parts of the feature should be labeled.
* \see setLabelAllParts()
* \since QGIS 3.10
*/
bool labelAllParts() const { return mLabelAllParts; }

/**
* Sets whether all parts of the feature should be labeled.
* \see labelAllParts()
* \since QGIS 3.10
*/
void setLabelAllParts( bool labelAllParts ) { mLabelAllParts = labelAllParts; }

protected:
//! Pointer to PAL layer (assigned when registered to PAL)
pal::Layer *mLayer = nullptr;
Expand Down Expand Up @@ -518,6 +533,8 @@ class CORE_EXPORT QgsLabelFeature

const QgsSymbol *mSymbol = nullptr;

bool mLabelAllParts = false;

};

#endif // QGSLABELFEATURE_H
3 changes: 0 additions & 3 deletions src/core/qgslabelingengine.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -133,9 +133,6 @@ void QgsLabelingEngine::processProvider( QgsAbstractLabelProvider *provider, Qgs
flags.testFlag( QgsAbstractLabelProvider::DrawLabels ),
flags.testFlag( QgsAbstractLabelProvider::DrawAllLabels ) );

// set label mode (label per feature is the default)
l->setLabelMode( flags.testFlag( QgsAbstractLabelProvider::LabelPerFeaturePart ) ? pal::Layer::LabelPerFeaturePart : pal::Layer::LabelPerFeature );

// set whether adjacent lines should be merged
l->setMergeConnectedLines( flags.testFlag( QgsAbstractLabelProvider::MergeConnectedLines ) );

Expand Down
1 change: 0 additions & 1 deletion src/core/qgslabelingengine.h
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,6 @@ class CORE_EXPORT QgsAbstractLabelProvider
DrawAllLabels = 1 << 2, //!< Whether all features will be labelled even though overlaps occur
MergeConnectedLines = 1 << 3, //!< Whether adjacent lines (with the same label text) should be merged
CentroidMustBeInside = 1 << 4, //!< Whether location of centroid must be inside of polygons
LabelPerFeaturePart = 1 << 6, //!< Whether to label each part of multi-part features separately
};
Q_DECLARE_FLAGS( Flags, Flag )

Expand Down
9 changes: 9 additions & 0 deletions src/core/qgspallabeling.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -241,6 +241,7 @@ void QgsPalLayerSettings::initPropertyDefinitions()
{ QgsPalLayerSettings::Show, QgsPropertyDefinition( "Show", QObject::tr( "Show label" ), QgsPropertyDefinition::Boolean, origin ) },
{ QgsPalLayerSettings::AlwaysShow, QgsPropertyDefinition( "AlwaysShow", QObject::tr( "Always show label" ), QgsPropertyDefinition::Boolean, origin ) },
{ QgsPalLayerSettings::CalloutDraw, QgsPropertyDefinition( "CalloutDraw", QObject::tr( "Draw callout" ), QgsPropertyDefinition::Boolean, origin ) },
{ QgsPalLayerSettings::LabelAllParts, QgsPropertyDefinition( "LabelAllParts", QObject::tr( "Label all parts" ), QgsPropertyDefinition::Boolean, origin ) },
};
}

Expand Down Expand Up @@ -2207,6 +2208,13 @@ void QgsPalLayerSettings::registerFeature( const QgsFeature &f, QgsRenderContext
// users with options they likely don't need to see...
const double overrunSmoothDist = context.convertToMapUnits( 1, QgsUnitTypes::RenderMillimeters );

bool labelAll = labelPerPart;
if ( mDataDefinedProperties.isActive( QgsPalLayerSettings::LabelAllParts ) )
{
context.expressionContext().setOriginalValueVariable( labelPerPart );
labelAll = mDataDefinedProperties.valueAsBool( QgsPalLayerSettings::LabelAllParts, context.expressionContext(), labelPerPart );
}

// feature to the layer
QgsTextLabelFeature *lf = new QgsTextLabelFeature( feature.id(), std::move( geos_geom_clone ), QSizeF( labelX, labelY ) );
lf->setFeature( feature );
Expand All @@ -2228,6 +2236,7 @@ void QgsPalLayerSettings::registerFeature( const QgsFeature &f, QgsRenderContext
( *labelFeature )->setPermissibleZone( permissibleZone );
( *labelFeature )->setOverrunDistance( overrunDistanceEval );
( *labelFeature )->setOverrunSmoothDistance( overrunSmoothDist );
( *labelFeature )->setLabelAllParts( labelAll );
if ( geosObstacleGeomClone )
{
( *labelFeature )->setObstacleGeometry( std::move( geosObstacleGeomClone ) );
Expand Down
1 change: 1 addition & 0 deletions src/core/qgspallabeling.h
Original file line number Diff line number Diff line change
Expand Up @@ -432,6 +432,7 @@ class CORE_EXPORT QgsPalLayerSettings
PredefinedPositionOrder = 91,
LinePlacementOptions = 99, //!< Line placement flags
OverrunDistance = 102, //!< Distance which labels can extend past either end of linear features
LabelAllParts = 103, //!< Whether all parts of multi-part features should be labeled

// rendering
ScaleVisibility = 23,
Expand Down
2 changes: 0 additions & 2 deletions src/core/qgsvectorlayerlabelprovider.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -66,8 +66,6 @@ void QgsVectorLayerLabelProvider::init()
mFlags |= MergeConnectedLines;
if ( mSettings.centroidInside )
mFlags |= CentroidMustBeInside;
if ( mSettings.labelPerPart )
mFlags |= LabelPerFeaturePart;

mPriority = 1 - mSettings.priority / 10.0; // convert 0..10 --> 1..0

Expand Down
1 change: 1 addition & 0 deletions src/gui/qgstextformatwidget.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -756,6 +756,7 @@ void QgsTextFormatWidget::populateDataDefinedButtons()
registerDataDefinedButton( mZIndexDDBtn, QgsPalLayerSettings::ZIndex );

registerDataDefinedButton( mCalloutDrawDDBtn, QgsPalLayerSettings::CalloutDraw );
registerDataDefinedButton( mLabelAllPartsDDBtn, QgsPalLayerSettings::LabelAllParts );
}

void QgsTextFormatWidget::registerDataDefinedButton( QgsPropertyOverrideButton *button, QgsPalLayerSettings::Property key )
Expand Down
134 changes: 71 additions & 63 deletions src/ui/qgstextformatwidgetbase.ui
Original file line number Diff line number Diff line change
Expand Up @@ -6095,30 +6095,43 @@ font-style: italic;</string>
<property name="syncGroup" stdset="0">
<string notr="true">labelrenderinggroup</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<layout class="QGridLayout" name="gridLayout_47">
<property name="leftMargin">
<number>8</number>
</property>
<property name="rightMargin">
<number>8</number>
</property>
<item>
<item row="0" column="0">
<widget class="QCheckBox" name="chkLabelPerFeaturePart">
<property name="text">
<string>Label every part of multi-part features</string>
</property>
</widget>
</item>
<item>
<item row="0" column="1">
<widget class="QgsPropertyOverrideButton" name="mLabelAllPartsDDBtn">
<property name="text">
<string>…</string>
</property>
</widget>
</item>
<item row="1" column="0" colspan="2">
<widget class="QCheckBox" name="chkMergeLines">
<property name="text">
<string>Merge connected lines to avoid duplicate labels</string>
</property>
</widget>
</item>
<item>
<widget class="QFrame" name="mLimitLabelFrame">
<layout class="QGridLayout" name="gridLayout_20">
<item row="4" column="0" colspan="2">
<widget class="QFrame" name="mPolygonFeatureOptionsFrame">
<property name="frameShape">
<enum>QFrame::NoFrame</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Raised</enum>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_12">
<property name="leftMargin">
<number>0</number>
</property>
Expand All @@ -6131,58 +6144,17 @@ font-style: italic;</string>
<property name="bottomMargin">
<number>0</number>
</property>
<property name="verticalSpacing">
<number>6</number>
</property>
<item row="1" column="0">
<spacer name="verticalSpacer_8">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Fixed</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>8</width>
<height>0</height>
</size>
</property>
</spacer>
</item>
<item row="1" column="1">
<widget class="QgsSpinBox" name="mLimitLabelSpinBox">
<property name="enabled">
<bool>false</bool>
</property>
<property name="toolTip">
<string>Number of features sent to labeling engine, though not all may be labeled</string>
</property>
<property name="minimum">
<number>0</number>
</property>
<property name="maximum">
<number>999999999</number>
</property>
<property name="value">
<number>2000</number>
</property>
<property name="showClearButton" stdset="0">
<bool>false</bool>
</property>
</widget>
</item>
<item row="0" column="0" colspan="2">
<widget class="QCheckBox" name="mLimitLabelChkBox">
<item>
<widget class="QCheckBox" name="mFitInsidePolygonCheckBox">
<property name="text">
<string>Limit number of features to be labeled to</string>
<string>Only draw labels which fit completely within feature</string>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<item row="3" column="0" colspan="2">
<widget class="QFrame" name="mMinSizeFrame">
<layout class="QGridLayout" name="gridLayout_21">
<property name="leftMargin">
Expand Down Expand Up @@ -6233,15 +6205,9 @@ font-style: italic;</string>
</layout>
</widget>
</item>
<item>
<widget class="QFrame" name="mPolygonFeatureOptionsFrame">
<property name="frameShape">
<enum>QFrame::NoFrame</enum>
</property>
<property name="frameShadow">
<enum>QFrame::Raised</enum>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_12">
<item row="2" column="0" colspan="2">
<widget class="QFrame" name="mLimitLabelFrame">
<layout class="QGridLayout" name="gridLayout_20">
<property name="leftMargin">
<number>0</number>
</property>
Expand All @@ -6254,10 +6220,51 @@ font-style: italic;</string>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QCheckBox" name="mFitInsidePolygonCheckBox">
<property name="verticalSpacing">
<number>6</number>
</property>
<item row="1" column="0">
<spacer name="verticalSpacer_8">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeType">
<enum>QSizePolicy::Fixed</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>8</width>
<height>0</height>
</size>
</property>
</spacer>
</item>
<item row="1" column="1">
<widget class="QgsSpinBox" name="mLimitLabelSpinBox">
<property name="enabled">
<bool>false</bool>
</property>
<property name="toolTip">
<string>Number of features sent to labeling engine, though not all may be labeled</string>
</property>
<property name="minimum">
<number>0</number>
</property>
<property name="maximum">
<number>999999999</number>
</property>
<property name="value">
<number>2000</number>
</property>
<property name="showClearButton" stdset="0">
<bool>false</bool>
</property>
</widget>
</item>
<item row="0" column="0" colspan="2">
<widget class="QCheckBox" name="mLimitLabelChkBox">
<property name="text">
<string>Only draw labels which fit completely within feature</string>
<string>Limit number of features to be labeled to</string>
</property>
</widget>
</item>
Expand Down Expand Up @@ -6821,6 +6828,7 @@ font-style: italic;</string>
<tabstop>mUpsidedownRadioDefined</tabstop>
<tabstop>mUpsidedownRadioAll</tabstop>
<tabstop>chkLabelPerFeaturePart</tabstop>
<tabstop>mLabelAllPartsDDBtn</tabstop>
<tabstop>chkMergeLines</tabstop>
<tabstop>mLimitLabelChkBox</tabstop>
<tabstop>mLimitLabelSpinBox</tabstop>
Expand Down
Loading

0 comments on commit ab7106a

Please sign in to comment.