Port labeling to properties framework

This commit is contained in:
Nyall Dawson 2017-01-10 19:35:19 +10:00
parent 1e0c62bc3a
commit 43bbf68943
28 changed files with 831 additions and 1392 deletions

View File

@ -1,83 +1,3 @@
// QMap<QgsPalLayerSettings::DataDefinedProperties, QgsDataDefined*> is implemented as a Python dictionary.
%MappedType QMap<QgsPalLayerSettings::DataDefinedProperties, QgsDataDefined*> /DocType="dict-of-QgsPalLayerSettings.DataDefinedProperties-QgsDataDefined*"/
{
%TypeHeaderCode
#include <qmap.h>
#include <qgspallabeling.h>
#include <qgsdatadefined.h>
%End
%ConvertFromTypeCode
// Create the dictionary.
PyObject *d = PyDict_New();
if (!d)
return NULL;
// Set the dictionary elements.
QMap<QgsPalLayerSettings::DataDefinedProperties, QgsDataDefined*>::const_iterator i = sipCpp->constBegin();
while (i != sipCpp->constEnd())
{
QgsDataDefined *t = i.value();
PyObject *kobj = sipConvertFromEnum(i.key(), sipType_QgsPalLayerSettings_DataDefinedProperties);
PyObject *tobj = sipConvertFromType(t, sipType_QgsDataDefined, sipTransferObj);
if (kobj == NULL || tobj == NULL || PyDict_SetItem(d, kobj, tobj) < 0)
{
Py_DECREF(d);
if (kobj)
{
Py_DECREF(kobj);
}
if (tobj)
{
Py_DECREF(tobj);
}
else
{
delete t;
}
return NULL;
}
Py_DECREF(kobj);
Py_DECREF(tobj);
++i;
}
return d;
%End
%ConvertToTypeCode
PyObject *kobj, *tobj;
SIP_SSIZE_T i = 0;
// Check the type if that is all that is required.
if (sipIsErr == NULL)
{
if (!PyDict_Check(sipPy))
return 0;
while (PyDict_Next(sipPy, &i, &kobj, &tobj))
if (!sipCanConvertToType(tobj, sipType_QgsDataDefined, SIP_NOT_NONE))
return 0;
return 1;
}
QMap<QgsPalLayerSettings::DataDefinedProperties, QgsDataDefined*> *qm = new QMap<QgsPalLayerSettings::DataDefinedProperties, QgsDataDefined*>;
while (PyDict_Next(sipPy, &i, &kobj, &tobj))
{
int state, k = SIPLong_AsLong(kobj);
QgsDataDefined *t = reinterpret_cast<QgsDataDefined *>(sipConvertToType(tobj, sipType_QgsDataDefined, sipTransferObj, SIP_NOT_NONE, &state, sipIsErr));
if (*sipIsErr)
{
sipReleaseType(t, sipType_QgsDataDefined, state);
delete qm;
return 0;
}
qm->insert(QgsPalLayerSettings::DataDefinedProperties(k), t);
sipReleaseType(t, sipType_QgsDataDefined, state);
}
*sipCppPtr = qm;
return sipGetState(sipTransferObj);
%End
};
class QgsLabelPosition
{
%TypeHeaderCode
@ -239,7 +159,7 @@ class QgsPalLayerSettings
};
// update mDataDefinedNames QMap in constructor when adding/deleting enum value
enum DataDefinedProperties
enum Property
{
// text style
Size,
@ -507,67 +427,24 @@ class QgsPalLayerSettings
*/
QDomElement writeXml( QDomDocument& doc );
/** Get a data defined property pointer
* @note helpful for Python access
/** Returns a reference to the label's property collection, used for data defined overrides.
* @note added in QGIS 3.0
* @see setProperties()
*/
QgsDataDefined* dataDefinedProperty( QgsPalLayerSettings::DataDefinedProperties p );
QgsPropertyCollection& properties();
/** Set a property as data defined
* @note helpful for Python access
/** Returns a reference to the label's property collection, used for data defined overrides.
* @note added in QGIS 3.0
* @see setProperties()
*/
void setDataDefinedProperty( QgsPalLayerSettings::DataDefinedProperties p,
bool active, bool useExpr, const QString& expr, const QString& field );
//const QgsPropertyCollection& properties() const { return mProperties; }
/** Set a property to static instead data defined */
void removeDataDefinedProperty( QgsPalLayerSettings::DataDefinedProperties p );
/** Clear all data-defined properties
* @note added in QGIS 2.12
/** Sets the label's property collection, used for data defined overrides.
* @param collection property collection. Existing properties will be replaced.
* @note added in QGIS 3.0
* @see properties()
*/
void removeAllDataDefinedProperties();
/** Convert old property value to new one as delimited values
* @note not available in python bindings; as temporary solution until refactoring of project settings
*/
QString updateDataDefinedString( const QString& value );
/** Get property value as separate values split into Qmap
* @note not available in python bindings
*/
QMap<QString, QString> dataDefinedMap( QgsPalLayerSettings::DataDefinedProperties p ) const;
/** Get data defined property value from expression string or attribute field name
* @returns value inside QVariant
* @note not available in python bindings
*/
//QVariant dataDefinedValue( QgsPalLayerSettings::DataDefinedProperties p, QgsFeature& f, const QgsFields& fields,
// const QgsExpressionContext* context = 0 ) const;
/** Get data defined property value from expression string or attribute field name
* @returns true/false whether result is null or invalid
* @note not available in python bindings
*/
//bool dataDefinedEvaluate( QgsPalLayerSettings::DataDefinedProperties p, QVariant& exprVal, const QgsExpressionContext* context = 0 ) const;
/** Whether data definition is active
*/
bool dataDefinedIsActive( QgsPalLayerSettings::DataDefinedProperties p ) const;
/** Whether data definition is set to use an expression
*/
bool dataDefinedUseExpression( QgsPalLayerSettings::DataDefinedProperties p ) const;
/** Map of current data defined properties
*
* Pointers to QgsDataDefined should never be null, the pointers are owned by this class
*/
QMap< QgsPalLayerSettings::DataDefinedProperties, QgsDataDefined* > dataDefinedProperties;
/** Map of data defined enum to names and old-style indecies
* The QPair contains a new string for layer property key, and a reference to old-style numeric key (< QGIS 2.0)
* @note not available in python bindings;
*/
// QMap<QgsPalLayerSettings::DataDefinedProperties, QPair<QString, int> > dataDefinedNames() const;
void setProperties( const QgsPropertyCollection& collection );
/** Returns the label text formatting settings, e.g., font settings, buffer settings, etc.
* @see setFormat()
@ -737,23 +614,23 @@ class QgsPalLabeling
protected:
// update temporary QgsPalLayerSettings with any data defined text style values
void dataDefinedTextStyle( QgsPalLayerSettings& tmpLyr,
const QMap< QgsPalLayerSettings::DataDefinedProperties, QVariant >& ddValues );
const QMap< QgsPalLayerSettings::Property, QVariant >& ddValues );
// update temporary QgsPalLayerSettings with any data defined text formatting values
void dataDefinedTextFormatting( QgsPalLayerSettings& tmpLyr,
const QMap< QgsPalLayerSettings::DataDefinedProperties, QVariant >& ddValues );
const QMap< QgsPalLayerSettings::Property, QVariant >& ddValues );
// update temporary QgsPalLayerSettings with any data defined text buffer values
void dataDefinedTextBuffer( QgsPalLayerSettings& tmpLyr,
const QMap< QgsPalLayerSettings::DataDefinedProperties, QVariant >& ddValues );
const QMap< QgsPalLayerSettings::Property, QVariant >& ddValues );
// update temporary QgsPalLayerSettings with any data defined shape background values
void dataDefinedShapeBackground( QgsPalLayerSettings& tmpLyr,
const QMap< QgsPalLayerSettings::DataDefinedProperties, QVariant >& ddValues );
const QMap< QgsPalLayerSettings::Property, QVariant >& ddValues );
// update temporary QgsPalLayerSettings with any data defined drop shadow values
void dataDefinedDropShadow( QgsPalLayerSettings& tmpLyr,
const QMap< QgsPalLayerSettings::DataDefinedProperties, QVariant >& ddValues );
const QMap< QgsPalLayerSettings::Property, QVariant >& ddValues );
void deleteTemporaryData();

View File

@ -123,6 +123,17 @@ class QgsAbstractProperty
*/
int valueAsInt( const QgsExpressionContext& context, int defaultValue = 0 ) const;
/**
* Calculates the current value of the property and interprets it as an boolean.
* @param context QgsExpressionContext to evaluate the property for.
* @param defaultValue default boolean to return if the property cannot be calculated as an boolean
* @returns value parsed to boolean
* @see value()
* @see valueAsDouble()
* @see valueAsColor()
*/
bool valueAsBool( const QgsExpressionContext& context, bool defaultValue = false ) const;
/** Writes the current state of the property into an XML element
* @param propertyElem destination element for the property's state
* @param doc DOM document

View File

@ -1,3 +1,5 @@
typedef QMap< int, QString > QgsPropertyDefinition;
/**
* \ingroup core
* \class QgsAbstractPropertyCollection
@ -126,6 +128,20 @@ class QgsAbstractPropertyCollection
*/
int valueAsInt( int key, const QgsExpressionContext& context, int defaultValue = 0 ) const;
/**
* Calculates the current value of the property with the specified key and interprets it as an boolean.
* @param key integer key for property to return. The intended use case is that a context specific enum is cast to
* int and used for the key value.
* @param context QgsExpressionContext to evaluate the property for.
* @param defaultValue default boolean to return if the property cannot be calculated as a boolean
* @returns value parsed to bool
* @see value()
* @see valueAsDouble()
* @see valueAsColor()
*/
bool valueAsBool( int key, const QgsExpressionContext& context, bool defaultValue = false ) const;
/**
* Prepares the collection against a specified expression context. Calling prepare before evaluating the
* collection's properties multiple times allows precalculation of expensive setup tasks such as parsing expressions.
@ -168,7 +184,7 @@ class QgsAbstractPropertyCollection
* to avoid writing the raw integer key values to XML, for readability and future-proofness.
* @see readXML()
*/
virtual bool writeXml( QDomElement& collectionElem, QDomDocument& doc, const QMap< int, QString >& propertyNameMap ) const = 0;
virtual bool writeXml( QDomElement& collectionElem, QDomDocument& doc, const QgsPropertyDefinition& propertyNameMap ) const = 0;
/**
* Reads property collection state from an XML element.
@ -178,7 +194,7 @@ class QgsAbstractPropertyCollection
* the propertyNameMap specified when writeXML() was called.
* @see writeXML()
*/
virtual bool readXml( const QDomElement& collectionElem, const QDomDocument& doc, const QMap<int, QString> &propertyNameMap ) = 0;
virtual bool readXml( const QDomElement& collectionElem, const QDomDocument& doc, const QgsPropertyDefinition &propertyNameMap ) = 0;
};
@ -227,8 +243,8 @@ class QgsPropertyCollection : QgsAbstractPropertyCollection
bool isActive( int key ) const;
bool hasActiveProperties() const;
bool hasActiveDynamicProperties() const;
bool writeXml( QDomElement& collectionElem, QDomDocument& doc, const QMap< int, QString >& propertyNameMap ) const;
bool readXml( const QDomElement& collectionElem, const QDomDocument& doc, const QMap<int, QString> &propertyNameMap );
bool writeXml( QDomElement& collectionElem, QDomDocument& doc, const QgsPropertyDefinition& propertyNameMap ) const;
bool readXml( const QDomElement& collectionElem, const QDomDocument& doc, const QgsPropertyDefinition& propertyNameMap );
/** Adds a property to the collection and takes ownership of it.
* @param key integer key for property. Any existing property with the same key will be deleted
@ -353,7 +369,7 @@ class QgsPropertyCollectionStack : QgsAbstractPropertyCollection
QSet<int> propertyKeys() const;
bool hasProperty( int key ) const;
bool writeXml( QDomElement& collectionElem, QDomDocument& doc, const QMap< int, QString >& propertyNameMap ) const;
bool readXml( const QDomElement& collectionElem, const QDomDocument& doc, const QMap<int, QString> &propertyNameMap );
bool writeXml( QDomElement& collectionElem, QDomDocument& doc, const QgsPropertyDefinition& propertyNameMap ) const;
bool readXml( const QDomElement& collectionElem, const QDomDocument& doc, const QgsPropertyDefinition &propertyNameMap );
};

View File

@ -42,6 +42,7 @@
#include "qgsgenericprojectionselector.h"
#include "qgsmessagelog.h"
#include "qgslogger.h"
#include "qgsproperty.h"
struct CursorOverride
@ -358,14 +359,13 @@ void QgsDwgImportDialog::createGroup( QgsLayerTreeGroup *group, QString name, QS
pls.drawLabels = true;
pls.fieldName = "text";
pls.wrapChar = "\\P";
pls.setDataDefinedProperty( QgsPalLayerSettings::Size, true, false, "", "height" );
pls.setDataDefinedProperty( QgsPalLayerSettings::Color, true, false, "", "color" );
pls.setDataDefinedProperty( QgsPalLayerSettings::MultiLineHeight, true, true, "CASE WHEN interlin<0 THEN 1 ELSE interlin*1.5 END", "" );
pls.placement = QgsPalLayerSettings::OrderedPositionsAroundPoint;
pls.setDataDefinedProperty( QgsPalLayerSettings::PositionX, true, true, "$x", "" );
pls.setDataDefinedProperty( QgsPalLayerSettings::PositionY, true, true, "$y", "" );
pls.setDataDefinedProperty( QgsPalLayerSettings::Hali, true, true, QString(
"CASE"
pls.properties().setProperty( QgsPalLayerSettings::Size, new QgsFieldBasedProperty( QStringLiteral( "height" ) ) );
pls.properties().setProperty( QgsPalLayerSettings::Color, new QgsFieldBasedProperty( QStringLiteral( "color" ) ) );
pls.properties().setProperty( QgsPalLayerSettings::MultiLineHeight, new QgsExpressionBasedProperty( QStringLiteral( "CASE WHEN interlin<0 THEN 1 ELSE interlin*1.5 END" ) ) );
pls.properties().setProperty( QgsPalLayerSettings::PositionX, new QgsExpressionBasedProperty( QStringLiteral( "$x" ) ) );
pls.properties().setProperty( QgsPalLayerSettings::PositionY, new QgsExpressionBasedProperty( QStringLiteral( "$y" ) ) );
pls.properties().setProperty( QgsPalLayerSettings::Hali, new QgsExpressionBasedProperty( QStringLiteral( "CASE"
" WHEN etype=%1 THEN"
" CASE"
" WHEN alignv IN (1,4,7) THEN 'Left'"
@ -380,10 +380,8 @@ void QgsDwgImportDialog::createGroup( QgsLayerTreeGroup *group, QString name, QS
" WHEN alignh=3 THEN 'Left'"
" WHEN alignh=4 THEN 'Left'"
" END "
" END" ).arg( DRW::MTEXT ), "" );
pls.setDataDefinedProperty( QgsPalLayerSettings::Vali, true, true, QString(
"CASE"
" END" ).arg( DRW::MTEXT ) ) );
pls.properties().setProperty( QgsPalLayerSettings::Vali, new QgsExpressionBasedProperty( QStringLiteral( "CASE"
" WHEN etype=%1 THEN"
" CASE"
" WHEN alignv < 4 THEN 'Top'"
@ -397,10 +395,10 @@ void QgsDwgImportDialog::createGroup( QgsLayerTreeGroup *group, QString name, QS
" WHEN alignv=2 THEN 'Half'"
" WHEN alignv=3 THEN 'Top'"
" END"
" END" ).arg( DRW::MTEXT ), "" );
pls.setDataDefinedProperty( QgsPalLayerSettings::Rotation, true, true, "angle*180.0/pi()", "" );
" END" ).arg( DRW::MTEXT ) ) );
pls.properties().setProperty( QgsPalLayerSettings::Rotation, new QgsExpressionBasedProperty( QStringLiteral( "angle*180.0/pi()" ) ) );
pls.placement = QgsPalLayerSettings::OrderedPositionsAroundPoint;
pls.writeToLayer( l );
}

View File

@ -42,6 +42,22 @@ QgsExpressionContext QgsLabelingGui::createExpressionContext() const
return expContext;
}
void QgsLabelingGui::registerDataDefinedButton( QgsDataDefinedButtonV2* button, QgsPalLayerSettings::Property key,
QgsDataDefinedButtonV2::DataType type, const QString& description )
{
button->init( mLayer, mProperties.property( key ), type, description );
button->setProperty( "propertyKey", key );
connect( button, &QgsDataDefinedButtonV2::changed, this, &QgsLabelingGui::updateProperty );
button->registerExpressionContextGenerator( this );
}
void QgsLabelingGui::updateProperty()
{
QgsDataDefinedButtonV2* button = qobject_cast<QgsDataDefinedButtonV2*>( sender() );
QgsPalLayerSettings::Property key = static_cast< QgsPalLayerSettings::Property >( button->property( "propertyKey" ).toInt() );
mProperties.setProperty( key, button->toProperty() );
}
QgsLabelingGui::QgsLabelingGui( QgsVectorLayer* layer, QgsMapCanvas* mapCanvas, const QgsPalLayerSettings* layerSettings, QWidget* parent )
: QgsTextFormatWidget( mapCanvas, parent, QgsTextFormatWidget::Labeling )
, mLayer( layer )
@ -250,6 +266,8 @@ void QgsLabelingGui::setLayer( QgsMapLayer* mapLayer )
mZIndexSpinBox->setValue( lyr.zIndex );
mProperties = lyr.properties();
updatePlacementWidgets();
updateLinePlacementOptions();
@ -258,7 +276,7 @@ void QgsLabelingGui::setLayer( QgsMapLayer* mapLayer )
// set up data defined toolbuttons
// do this after other widgets are configured, so they can be enabled/disabled
populateDataDefinedButtons( lyr );
populateDataDefinedButtons();
enableDataDefinedAlignment( mCoordXDDBtn->isActive() && mCoordYDDBtn->isActive() );
updateUi(); // should come after data defined button setup
@ -436,403 +454,281 @@ QgsPalLayerSettings QgsLabelingGui::layerSettings()
lyr.zIndex = mZIndexSpinBox->value();
// data defined labeling
// text style
setDataDefinedProperty( mFontDDBtn, QgsPalLayerSettings::Family, lyr );
setDataDefinedProperty( mFontStyleDDBtn, QgsPalLayerSettings::FontStyle, lyr );
setDataDefinedProperty( mFontUnderlineDDBtn, QgsPalLayerSettings::Underline, lyr );
setDataDefinedProperty( mFontStrikeoutDDBtn, QgsPalLayerSettings::Strikeout, lyr );
setDataDefinedProperty( mFontBoldDDBtn, QgsPalLayerSettings::Bold, lyr );
setDataDefinedProperty( mFontItalicDDBtn, QgsPalLayerSettings::Italic, lyr );
setDataDefinedProperty( mFontSizeDDBtn, QgsPalLayerSettings::Size, lyr );
setDataDefinedProperty( mFontUnitsDDBtn, QgsPalLayerSettings::FontSizeUnit, lyr );
setDataDefinedProperty( mFontColorDDBtn, QgsPalLayerSettings::Color, lyr );
setDataDefinedProperty( mFontTranspDDBtn, QgsPalLayerSettings::FontTransp, lyr );
setDataDefinedProperty( mFontCaseDDBtn, QgsPalLayerSettings::FontCase, lyr );
setDataDefinedProperty( mFontLetterSpacingDDBtn, QgsPalLayerSettings::FontLetterSpacing, lyr );
setDataDefinedProperty( mFontWordSpacingDDBtn, QgsPalLayerSettings::FontWordSpacing, lyr );
setDataDefinedProperty( mFontBlendModeDDBtn, QgsPalLayerSettings::FontBlendMode, lyr );
// text formatting
setDataDefinedProperty( mWrapCharDDBtn, QgsPalLayerSettings::MultiLineWrapChar, lyr );
setDataDefinedProperty( mFontLineHeightDDBtn, QgsPalLayerSettings::MultiLineHeight, lyr );
setDataDefinedProperty( mFontMultiLineAlignDDBtn, QgsPalLayerSettings::MultiLineAlignment, lyr );
setDataDefinedProperty( mDirectSymbDDBtn, QgsPalLayerSettings::DirSymbDraw, lyr );
setDataDefinedProperty( mDirectSymbLeftDDBtn, QgsPalLayerSettings::DirSymbLeft, lyr );
setDataDefinedProperty( mDirectSymbRightDDBtn, QgsPalLayerSettings::DirSymbRight, lyr );
setDataDefinedProperty( mDirectSymbPlacementDDBtn, QgsPalLayerSettings::DirSymbPlacement, lyr );
setDataDefinedProperty( mDirectSymbRevDDBtn, QgsPalLayerSettings::DirSymbReverse, lyr );
setDataDefinedProperty( mFormatNumDDBtn, QgsPalLayerSettings::NumFormat, lyr );
setDataDefinedProperty( mFormatNumDecimalsDDBtn, QgsPalLayerSettings::NumDecimals, lyr );
setDataDefinedProperty( mFormatNumPlusSignDDBtn, QgsPalLayerSettings::NumPlusSign, lyr );
// text buffer
setDataDefinedProperty( mBufferDrawDDBtn, QgsPalLayerSettings::BufferDraw, lyr );
setDataDefinedProperty( mBufferSizeDDBtn, QgsPalLayerSettings::BufferSize, lyr );
setDataDefinedProperty( mBufferUnitsDDBtn, QgsPalLayerSettings::BufferUnit, lyr );
setDataDefinedProperty( mBufferColorDDBtn, QgsPalLayerSettings::BufferColor, lyr );
setDataDefinedProperty( mBufferTranspDDBtn, QgsPalLayerSettings::BufferTransp, lyr );
setDataDefinedProperty( mBufferJoinStyleDDBtn, QgsPalLayerSettings::BufferJoinStyle, lyr );
setDataDefinedProperty( mBufferBlendModeDDBtn, QgsPalLayerSettings::BufferBlendMode, lyr );
// background
setDataDefinedProperty( mShapeDrawDDBtn, QgsPalLayerSettings::ShapeDraw, lyr );
setDataDefinedProperty( mShapeTypeDDBtn, QgsPalLayerSettings::ShapeKind, lyr );
setDataDefinedProperty( mShapeSVGPathDDBtn, QgsPalLayerSettings::ShapeSVGFile, lyr );
setDataDefinedProperty( mShapeSizeTypeDDBtn, QgsPalLayerSettings::ShapeSizeType, lyr );
setDataDefinedProperty( mShapeSizeXDDBtn, QgsPalLayerSettings::ShapeSizeX, lyr );
setDataDefinedProperty( mShapeSizeYDDBtn, QgsPalLayerSettings::ShapeSizeY, lyr );
setDataDefinedProperty( mShapeSizeUnitsDDBtn, QgsPalLayerSettings::ShapeSizeUnits, lyr );
setDataDefinedProperty( mShapeRotationTypeDDBtn, QgsPalLayerSettings::ShapeRotationType, lyr );
setDataDefinedProperty( mShapeRotationDDBtn, QgsPalLayerSettings::ShapeRotation, lyr );
setDataDefinedProperty( mShapeOffsetDDBtn, QgsPalLayerSettings::ShapeOffset, lyr );
setDataDefinedProperty( mShapeOffsetUnitsDDBtn, QgsPalLayerSettings::ShapeOffsetUnits, lyr );
setDataDefinedProperty( mShapeRadiusDDBtn, QgsPalLayerSettings::ShapeRadii, lyr );
setDataDefinedProperty( mShapeRadiusUnitsDDBtn, QgsPalLayerSettings::ShapeRadiiUnits, lyr );
setDataDefinedProperty( mShapeTranspDDBtn, QgsPalLayerSettings::ShapeTransparency, lyr );
setDataDefinedProperty( mShapeBlendModeDDBtn, QgsPalLayerSettings::ShapeBlendMode, lyr );
setDataDefinedProperty( mShapeFillColorDDBtn, QgsPalLayerSettings::ShapeFillColor, lyr );
setDataDefinedProperty( mShapeBorderColorDDBtn, QgsPalLayerSettings::ShapeBorderColor, lyr );
setDataDefinedProperty( mShapeBorderWidthDDBtn, QgsPalLayerSettings::ShapeBorderWidth, lyr );
setDataDefinedProperty( mShapeBorderUnitsDDBtn, QgsPalLayerSettings::ShapeBorderWidthUnits, lyr );
setDataDefinedProperty( mShapePenStyleDDBtn, QgsPalLayerSettings::ShapeJoinStyle, lyr );
// drop shadow
setDataDefinedProperty( mShadowDrawDDBtn, QgsPalLayerSettings::ShadowDraw, lyr );
setDataDefinedProperty( mShadowUnderDDBtn, QgsPalLayerSettings::ShadowUnder, lyr );
setDataDefinedProperty( mShadowOffsetAngleDDBtn, QgsPalLayerSettings::ShadowOffsetAngle, lyr );
setDataDefinedProperty( mShadowOffsetDDBtn, QgsPalLayerSettings::ShadowOffsetDist, lyr );
setDataDefinedProperty( mShadowOffsetUnitsDDBtn, QgsPalLayerSettings::ShadowOffsetUnits, lyr );
setDataDefinedProperty( mShadowRadiusDDBtn, QgsPalLayerSettings::ShadowRadius, lyr );
setDataDefinedProperty( mShadowRadiusUnitsDDBtn, QgsPalLayerSettings::ShadowRadiusUnits, lyr );
setDataDefinedProperty( mShadowTranspDDBtn, QgsPalLayerSettings::ShadowTransparency, lyr );
setDataDefinedProperty( mShadowScaleDDBtn, QgsPalLayerSettings::ShadowScale, lyr );
setDataDefinedProperty( mShadowColorDDBtn, QgsPalLayerSettings::ShadowColor, lyr );
setDataDefinedProperty( mShadowBlendDDBtn, QgsPalLayerSettings::ShadowBlendMode, lyr );
// placement
setDataDefinedProperty( mCentroidDDBtn, QgsPalLayerSettings::CentroidWhole, lyr );
setDataDefinedProperty( mPointQuadOffsetDDBtn, QgsPalLayerSettings::OffsetQuad, lyr );
setDataDefinedProperty( mPointPositionOrderDDBtn, QgsPalLayerSettings::PredefinedPositionOrder, lyr );
setDataDefinedProperty( mPointOffsetDDBtn, QgsPalLayerSettings::OffsetXY, lyr );
setDataDefinedProperty( mPointOffsetUnitsDDBtn, QgsPalLayerSettings::OffsetUnits, lyr );
setDataDefinedProperty( mLineDistanceDDBtn, QgsPalLayerSettings::LabelDistance, lyr );
setDataDefinedProperty( mLineDistanceUnitDDBtn, QgsPalLayerSettings::DistanceUnits, lyr );
// TODO: is this necessary? maybe just use the data defined-only rotation?
//setDataDefinedProperty( mPointAngleDDBtn, QgsPalLayerSettings::OffsetRotation, lyr );
setDataDefinedProperty( mMaxCharAngleDDBtn, QgsPalLayerSettings::CurvedCharAngleInOut, lyr );
setDataDefinedProperty( mRepeatDistanceDDBtn, QgsPalLayerSettings::RepeatDistance, lyr );
setDataDefinedProperty( mRepeatDistanceUnitDDBtn, QgsPalLayerSettings::RepeatDistanceUnit, lyr );
setDataDefinedProperty( mPriorityDDBtn, QgsPalLayerSettings::Priority, lyr );
// data defined-only
setDataDefinedProperty( mCoordXDDBtn, QgsPalLayerSettings::PositionX, lyr );
setDataDefinedProperty( mCoordYDDBtn, QgsPalLayerSettings::PositionY, lyr );
setDataDefinedProperty( mCoordAlignmentHDDBtn, QgsPalLayerSettings::Hali, lyr );
setDataDefinedProperty( mCoordAlignmentVDDBtn, QgsPalLayerSettings::Vali, lyr );
setDataDefinedProperty( mCoordRotationDDBtn, QgsPalLayerSettings::Rotation, lyr );
// rendering
setDataDefinedProperty( mScaleBasedVisibilityDDBtn, QgsPalLayerSettings::ScaleVisibility, lyr );
setDataDefinedProperty( mScaleBasedVisibilityMinDDBtn, QgsPalLayerSettings::MinScale, lyr );
setDataDefinedProperty( mScaleBasedVisibilityMaxDDBtn, QgsPalLayerSettings::MaxScale, lyr );
setDataDefinedProperty( mFontLimitPixelDDBtn, QgsPalLayerSettings::FontLimitPixel, lyr );
setDataDefinedProperty( mFontMinPixelDDBtn, QgsPalLayerSettings::FontMinPixel, lyr );
setDataDefinedProperty( mFontMaxPixelDDBtn, QgsPalLayerSettings::FontMaxPixel, lyr );
setDataDefinedProperty( mShowLabelDDBtn, QgsPalLayerSettings::Show, lyr );
setDataDefinedProperty( mAlwaysShowDDBtn, QgsPalLayerSettings::AlwaysShow, lyr );
setDataDefinedProperty( mIsObstacleDDBtn, QgsPalLayerSettings::IsObstacle, lyr );
setDataDefinedProperty( mObstacleFactorDDBtn, QgsPalLayerSettings::ObstacleFactor, lyr );
setDataDefinedProperty( mZIndexDDBtn, QgsPalLayerSettings::ZIndex, lyr );
lyr.setProperties( mProperties );
return lyr;
}
void QgsLabelingGui::setDataDefinedProperty( const QgsDataDefinedButton* ddBtn, QgsPalLayerSettings::DataDefinedProperties p, QgsPalLayerSettings& lyr )
void QgsLabelingGui::populateDataDefinedButtons()
{
const QMap< QString, QString >& map = ddBtn->definedProperty();
lyr.setDataDefinedProperty( p, map.value( QStringLiteral( "active" ) ).toInt(), map.value( QStringLiteral( "useexpr" ) ).toInt(), map.value( QStringLiteral( "expression" ) ), map.value( QStringLiteral( "field" ) ) );
}
void QgsLabelingGui::populateDataDefinedButtons( QgsPalLayerSettings& s )
{
Q_FOREACH ( QgsDataDefinedButton* button, findChildren< QgsDataDefinedButton* >() )
{
button->registerExpressionContextGenerator( this );
}
// don't register enable/disable siblings, since visual feedback from data defined buttons should be enough,
// and ability to edit layer-level setting should remain enabled regardless
QString trString = tr( "string " );
// text style
registerDataDefinedButton( mFontDDBtn, QgsPalLayerSettings::Family,
QgsDataDefinedButtonV2::String,
trString + tr( "[<b>family</b>|<b>family[foundry]</b>],<br>"
"e.g. Helvetica or Helvetica [Cronyx]" ) );
mFontDDBtn->init( mLayer, s.dataDefinedProperty( QgsPalLayerSettings::Family ),
QgsDataDefinedButton::String,
trString + tr( "[<b>family</b>|<b>family[foundry]</b>],<br>"
"e.g. Helvetica or Helvetica [Cronyx]" ) );
registerDataDefinedButton( mFontStyleDDBtn, QgsPalLayerSettings::FontStyle,
QgsDataDefinedButtonV2::String,
trString + tr( "[<b>font style name</b>|<b>Ignore</b>],<br>"
"e.g. Bold Condensed or Light Italic" ) );
mFontStyleDDBtn->init( mLayer, s.dataDefinedProperty( QgsPalLayerSettings::FontStyle ),
QgsDataDefinedButton::String,
trString + tr( "[<b>font style name</b>|<b>Ignore</b>],<br>"
"e.g. Bold Condensed or Light Italic" ) );
registerDataDefinedButton( mFontUnderlineDDBtn, QgsPalLayerSettings::Underline,
QgsDataDefinedButtonV2::AnyType, QgsDataDefinedButtonV2::boolDesc() );
mFontUnderlineDDBtn->init( mLayer, s.dataDefinedProperty( QgsPalLayerSettings::Underline ),
QgsDataDefinedButton::AnyType, QgsDataDefinedButton::boolDesc() );
registerDataDefinedButton( mFontStrikeoutDDBtn, QgsPalLayerSettings::Strikeout,
QgsDataDefinedButtonV2::AnyType, QgsDataDefinedButtonV2::boolDesc() );
mFontStrikeoutDDBtn->init( mLayer, s.dataDefinedProperty( QgsPalLayerSettings::Strikeout ),
QgsDataDefinedButton::AnyType, QgsDataDefinedButton::boolDesc() );
registerDataDefinedButton( mFontBoldDDBtn, QgsPalLayerSettings::Bold,
QgsDataDefinedButtonV2::AnyType, QgsDataDefinedButtonV2::boolDesc() );
mFontBoldDDBtn->init( mLayer, s.dataDefinedProperty( QgsPalLayerSettings::Bold ),
QgsDataDefinedButton::AnyType, QgsDataDefinedButton::boolDesc() );
registerDataDefinedButton( mFontItalicDDBtn, QgsPalLayerSettings::Italic,
QgsDataDefinedButtonV2::AnyType, QgsDataDefinedButtonV2::boolDesc() );
mFontItalicDDBtn->init( mLayer, s.dataDefinedProperty( QgsPalLayerSettings::Italic ),
QgsDataDefinedButton::AnyType, QgsDataDefinedButton::boolDesc() );
registerDataDefinedButton( mFontSizeDDBtn, QgsPalLayerSettings::Size,
QgsDataDefinedButtonV2::AnyType, QgsDataDefinedButtonV2::doublePosDesc() );
mFontSizeDDBtn->init( mLayer, s.dataDefinedProperty( QgsPalLayerSettings::Size ),
QgsDataDefinedButton::AnyType, QgsDataDefinedButton::doublePosDesc() );
registerDataDefinedButton( mFontUnitsDDBtn, QgsPalLayerSettings::FontSizeUnit,
QgsDataDefinedButtonV2::String, trString + "[<b>Points</b>|<b>MapUnit</b>]" );
mFontUnitsDDBtn->init( mLayer, s.dataDefinedProperty( QgsPalLayerSettings::FontSizeUnit ),
QgsDataDefinedButton::String, trString + "[<b>Points</b>|<b>MapUnit</b>]" );
registerDataDefinedButton( mFontColorDDBtn, QgsPalLayerSettings::Color,
QgsDataDefinedButtonV2::String, QgsDataDefinedButtonV2::colorNoAlphaDesc() );
mFontColorDDBtn->init( mLayer, s.dataDefinedProperty( QgsPalLayerSettings::Color ),
QgsDataDefinedButton::String, QgsDataDefinedButton::colorNoAlphaDesc() );
registerDataDefinedButton( mFontTranspDDBtn, QgsPalLayerSettings::FontTransp,
QgsDataDefinedButtonV2::AnyType, QgsDataDefinedButtonV2::intTranspDesc() );
mFontTranspDDBtn->init( mLayer, s.dataDefinedProperty( QgsPalLayerSettings::FontTransp ),
QgsDataDefinedButton::AnyType, QgsDataDefinedButton::intTranspDesc() );
registerDataDefinedButton( mFontCaseDDBtn, QgsPalLayerSettings::FontCase,
QgsDataDefinedButtonV2::String,
trString + QStringLiteral( "[<b>NoChange</b>|<b>Upper</b>|<br>"
"<b>Lower</b>|<b>Capitalize</b>]" ) );
mFontCaseDDBtn->init( mLayer, s.dataDefinedProperty( QgsPalLayerSettings::FontCase ),
QgsDataDefinedButton::String,
trString + QStringLiteral( "[<b>NoChange</b>|<b>Upper</b>|<br>"
"<b>Lower</b>|<b>Capitalize</b>]" ) );
registerDataDefinedButton( mFontLetterSpacingDDBtn, QgsPalLayerSettings::FontLetterSpacing,
QgsDataDefinedButtonV2::AnyType, QgsDataDefinedButtonV2::doubleDesc() );
registerDataDefinedButton( mFontWordSpacingDDBtn, QgsPalLayerSettings::FontWordSpacing,
QgsDataDefinedButtonV2::AnyType, QgsDataDefinedButtonV2::doubleDesc() );
mFontLetterSpacingDDBtn->init( mLayer, s.dataDefinedProperty( QgsPalLayerSettings::FontLetterSpacing ),
QgsDataDefinedButton::AnyType, QgsDataDefinedButton::doubleDesc() );
mFontWordSpacingDDBtn->init( mLayer, s.dataDefinedProperty( QgsPalLayerSettings::FontWordSpacing ),
QgsDataDefinedButton::AnyType, QgsDataDefinedButton::doubleDesc() );
mFontBlendModeDDBtn->init( mLayer, s.dataDefinedProperty( QgsPalLayerSettings::FontBlendMode ),
QgsDataDefinedButton::String, QgsDataDefinedButton::blendModesDesc() );
registerDataDefinedButton( mFontBlendModeDDBtn, QgsPalLayerSettings::FontBlendMode,
QgsDataDefinedButtonV2::String, QgsDataDefinedButtonV2::blendModesDesc() );
// text formatting
mWrapCharDDBtn->init( mLayer, s.dataDefinedProperty( QgsPalLayerSettings::MultiLineWrapChar ),
QgsDataDefinedButton::String, QgsDataDefinedButton::anyStringDesc() );
mFontLineHeightDDBtn->init( mLayer, s.dataDefinedProperty( QgsPalLayerSettings::MultiLineHeight ),
QgsDataDefinedButton::AnyType, tr( "double [0.0-10.0]" ) );
mFontMultiLineAlignDDBtn->init( mLayer, s.dataDefinedProperty( QgsPalLayerSettings::MultiLineAlignment ),
QgsDataDefinedButton::String, trString + "[<b>Left</b>|<b>Center</b>|<b>Right</b>|<b>Follow</b>]" );
registerDataDefinedButton( mWrapCharDDBtn, QgsPalLayerSettings::MultiLineWrapChar,
QgsDataDefinedButtonV2::String, QgsDataDefinedButtonV2::anyStringDesc() );
registerDataDefinedButton( mFontLineHeightDDBtn, QgsPalLayerSettings::MultiLineHeight,
QgsDataDefinedButtonV2::AnyType, tr( "double [0.0-10.0]" ) );
registerDataDefinedButton( mFontMultiLineAlignDDBtn, QgsPalLayerSettings::MultiLineAlignment,
QgsDataDefinedButtonV2::String, trString + "[<b>Left</b>|<b>Center</b>|<b>Right</b>|<b>Follow</b>]" );
mDirectSymbDDBtn->init( mLayer, s.dataDefinedProperty( QgsPalLayerSettings::DirSymbDraw ),
QgsDataDefinedButton::AnyType, QgsDataDefinedButton::boolDesc() );
registerDataDefinedButton( mDirectSymbDDBtn, QgsPalLayerSettings::DirSymbDraw,
QgsDataDefinedButtonV2::AnyType, QgsDataDefinedButtonV2::boolDesc() );
mDirectSymbDDBtn->registerCheckedWidget( mDirectSymbChkBx );
mDirectSymbLeftDDBtn->init( mLayer, s.dataDefinedProperty( QgsPalLayerSettings::DirSymbLeft ),
QgsDataDefinedButton::String, QgsDataDefinedButton::anyStringDesc() );
mDirectSymbRightDDBtn->init( mLayer, s.dataDefinedProperty( QgsPalLayerSettings::DirSymbRight ),
QgsDataDefinedButton::String, QgsDataDefinedButton::anyStringDesc() );
registerDataDefinedButton( mDirectSymbLeftDDBtn, QgsPalLayerSettings::DirSymbLeft,
QgsDataDefinedButtonV2::String, QgsDataDefinedButtonV2::anyStringDesc() );
registerDataDefinedButton( mDirectSymbRightDDBtn, QgsPalLayerSettings::DirSymbRight,
QgsDataDefinedButtonV2::String, QgsDataDefinedButtonV2::anyStringDesc() );
mDirectSymbPlacementDDBtn->init( mLayer, s.dataDefinedProperty( QgsPalLayerSettings::DirSymbPlacement ),
QgsDataDefinedButton::String,
trString + "[<b>LeftRight</b>|<b>Above</b>|<b>Below</b>]" );
mDirectSymbRevDDBtn->init( mLayer, s.dataDefinedProperty( QgsPalLayerSettings::DirSymbReverse ),
QgsDataDefinedButton::AnyType, QgsDataDefinedButton::boolDesc() );
registerDataDefinedButton( mDirectSymbPlacementDDBtn, QgsPalLayerSettings::DirSymbPlacement,
QgsDataDefinedButtonV2::String,
trString + "[<b>LeftRight</b>|<b>Above</b>|<b>Below</b>]" );
registerDataDefinedButton( mDirectSymbRevDDBtn, QgsPalLayerSettings::DirSymbReverse,
QgsDataDefinedButtonV2::AnyType, QgsDataDefinedButtonV2::boolDesc() );
mFormatNumDDBtn->init( mLayer, s.dataDefinedProperty( QgsPalLayerSettings::NumFormat ),
QgsDataDefinedButton::AnyType, QgsDataDefinedButton::boolDesc() );
registerDataDefinedButton( mFormatNumDDBtn, QgsPalLayerSettings::NumFormat,
QgsDataDefinedButtonV2::AnyType, QgsDataDefinedButtonV2::boolDesc() );
mFormatNumDDBtn->registerCheckedWidget( mFormatNumChkBx );
mFormatNumDecimalsDDBtn->init( mLayer, s.dataDefinedProperty( QgsPalLayerSettings::NumDecimals ),
QgsDataDefinedButton::AnyType, tr( "int [0-20]" ) );
mFormatNumPlusSignDDBtn->init( mLayer, s.dataDefinedProperty( QgsPalLayerSettings::NumPlusSign ),
QgsDataDefinedButton::AnyType, QgsDataDefinedButton::boolDesc() );
registerDataDefinedButton( mFormatNumDecimalsDDBtn, QgsPalLayerSettings::NumDecimals,
QgsDataDefinedButtonV2::AnyType, tr( "int [0-20]" ) );
registerDataDefinedButton( mFormatNumPlusSignDDBtn, QgsPalLayerSettings::NumPlusSign,
QgsDataDefinedButtonV2::AnyType, QgsDataDefinedButtonV2::boolDesc() );
// text buffer
mBufferDrawDDBtn->init( mLayer, s.dataDefinedProperty( QgsPalLayerSettings::BufferDraw ),
QgsDataDefinedButton::AnyType, QgsDataDefinedButton::boolDesc() );
registerDataDefinedButton( mBufferDrawDDBtn, QgsPalLayerSettings::BufferDraw,
QgsDataDefinedButtonV2::AnyType, QgsDataDefinedButtonV2::boolDesc() );
mBufferDrawDDBtn->registerCheckedWidget( mBufferDrawChkBx );
mBufferSizeDDBtn->init( mLayer, s.dataDefinedProperty( QgsPalLayerSettings::BufferSize ),
QgsDataDefinedButton::AnyType, QgsDataDefinedButton::doublePosDesc() );
mBufferUnitsDDBtn->init( mLayer, s.dataDefinedProperty( QgsPalLayerSettings::BufferUnit ),
QgsDataDefinedButton::String, QgsDataDefinedButton::unitsMmMuDesc() );
mBufferColorDDBtn->init( mLayer, s.dataDefinedProperty( QgsPalLayerSettings::BufferColor ),
QgsDataDefinedButton::String, QgsDataDefinedButton::colorNoAlphaDesc() );
mBufferTranspDDBtn->init( mLayer, s.dataDefinedProperty( QgsPalLayerSettings::BufferTransp ),
QgsDataDefinedButton::AnyType, QgsDataDefinedButton::intTranspDesc() );
mBufferJoinStyleDDBtn->init( mLayer, s.dataDefinedProperty( QgsPalLayerSettings::BufferJoinStyle ),
QgsDataDefinedButton::String, QgsDataDefinedButton::penJoinStyleDesc() );
mBufferBlendModeDDBtn->init( mLayer, s.dataDefinedProperty( QgsPalLayerSettings::BufferBlendMode ),
QgsDataDefinedButton::String, QgsDataDefinedButton::blendModesDesc() );
registerDataDefinedButton( mBufferSizeDDBtn, QgsPalLayerSettings::BufferSize,
QgsDataDefinedButtonV2::AnyType, QgsDataDefinedButtonV2::doublePosDesc() );
registerDataDefinedButton( mBufferUnitsDDBtn, QgsPalLayerSettings::BufferUnit,
QgsDataDefinedButtonV2::String, QgsDataDefinedButtonV2::unitsMmMuDesc() );
registerDataDefinedButton( mBufferColorDDBtn, QgsPalLayerSettings::BufferColor,
QgsDataDefinedButtonV2::String, QgsDataDefinedButtonV2::colorNoAlphaDesc() );
registerDataDefinedButton( mBufferTranspDDBtn, QgsPalLayerSettings::BufferTransp,
QgsDataDefinedButtonV2::AnyType, QgsDataDefinedButtonV2::intTranspDesc() );
registerDataDefinedButton( mBufferJoinStyleDDBtn, QgsPalLayerSettings::BufferJoinStyle,
QgsDataDefinedButtonV2::String, QgsDataDefinedButtonV2::penJoinStyleDesc() );
registerDataDefinedButton( mBufferBlendModeDDBtn, QgsPalLayerSettings::BufferBlendMode,
QgsDataDefinedButtonV2::String, QgsDataDefinedButtonV2::blendModesDesc() );
// background
mShapeDrawDDBtn->init( mLayer, s.dataDefinedProperty( QgsPalLayerSettings::ShapeDraw ),
QgsDataDefinedButton::AnyType, QgsDataDefinedButton::boolDesc() );
registerDataDefinedButton( mShapeDrawDDBtn, QgsPalLayerSettings::ShapeDraw,
QgsDataDefinedButtonV2::AnyType, QgsDataDefinedButtonV2::boolDesc() );
mShapeDrawDDBtn->registerCheckedWidget( mShapeDrawChkBx );
mShapeTypeDDBtn->init( mLayer, s.dataDefinedProperty( QgsPalLayerSettings::ShapeKind ),
QgsDataDefinedButton::String,
trString + QStringLiteral( "[<b>Rectangle</b>|<b>Square</b>|<br>"
"<b>Ellipse</b>|<b>Circle</b>|<b>SVG</b>]" ) );
mShapeSVGPathDDBtn->init( mLayer, s.dataDefinedProperty( QgsPalLayerSettings::ShapeSVGFile ),
QgsDataDefinedButton::String, QgsDataDefinedButton::svgPathDesc() );
mShapeSizeTypeDDBtn->init( mLayer, s.dataDefinedProperty( QgsPalLayerSettings::ShapeSizeType ),
QgsDataDefinedButton::String,
registerDataDefinedButton( mShapeTypeDDBtn, QgsPalLayerSettings::ShapeKind,
QgsDataDefinedButtonV2::String,
trString + QStringLiteral( "[<b>Rectangle</b>|<b>Square</b>|<br>"
"<b>Ellipse</b>|<b>Circle</b>|<b>SVG</b>]" ) );
registerDataDefinedButton( mShapeSVGPathDDBtn, QgsPalLayerSettings::ShapeSVGFile,
QgsDataDefinedButtonV2::String, QgsDataDefinedButtonV2::svgPathDesc() );
registerDataDefinedButton( mShapeSizeTypeDDBtn, QgsPalLayerSettings::ShapeSizeType,
QgsDataDefinedButtonV2::String,
trString + "[<b>Buffer</b>|<b>Fixed</b>]" );
mShapeSizeXDDBtn->init( mLayer, s.dataDefinedProperty( QgsPalLayerSettings::ShapeSizeX ),
QgsDataDefinedButton::AnyType, QgsDataDefinedButton::doubleDesc() );
mShapeSizeYDDBtn->init( mLayer, s.dataDefinedProperty( QgsPalLayerSettings::ShapeSizeY ),
QgsDataDefinedButton::AnyType, QgsDataDefinedButton::doubleDesc() );
mShapeSizeUnitsDDBtn->init( mLayer, s.dataDefinedProperty( QgsPalLayerSettings::ShapeSizeUnits ),
QgsDataDefinedButton::String, QgsDataDefinedButton::unitsMmMuDesc() );
mShapeRotationTypeDDBtn->init( mLayer, s.dataDefinedProperty( QgsPalLayerSettings::ShapeRotationType ),
QgsDataDefinedButton::String,
trString + "[<b>Sync</b>|<b>Offset</b>|<b>Fixed</b>]" );
mShapeRotationDDBtn->init( mLayer, s.dataDefinedProperty( QgsPalLayerSettings::ShapeRotation ),
QgsDataDefinedButton::AnyType, QgsDataDefinedButton::double180RotDesc() );
mShapeOffsetDDBtn->init( mLayer, s.dataDefinedProperty( QgsPalLayerSettings::ShapeOffset ),
QgsDataDefinedButton::AnyType, QgsDataDefinedButton::doubleXYDesc() );
mShapeOffsetUnitsDDBtn->init( mLayer, s.dataDefinedProperty( QgsPalLayerSettings::ShapeOffsetUnits ),
QgsDataDefinedButton::String, QgsDataDefinedButton::unitsMmMuDesc() );
mShapeRadiusDDBtn->init( mLayer, s.dataDefinedProperty( QgsPalLayerSettings::ShapeRadii ),
QgsDataDefinedButton::AnyType, QgsDataDefinedButton::doubleXYDesc() );
mShapeRadiusUnitsDDBtn->init( mLayer, s.dataDefinedProperty( QgsPalLayerSettings::ShapeRadiiUnits ),
QgsDataDefinedButton::String, QgsDataDefinedButton::unitsMmMuPercentDesc() );
mShapeTranspDDBtn->init( mLayer, s.dataDefinedProperty( QgsPalLayerSettings::ShapeTransparency ),
QgsDataDefinedButton::AnyType, QgsDataDefinedButton::intTranspDesc() );
mShapeBlendModeDDBtn->init( mLayer, s.dataDefinedProperty( QgsPalLayerSettings::ShapeBlendMode ),
QgsDataDefinedButton::String, QgsDataDefinedButton::blendModesDesc() );
mShapeFillColorDDBtn->init( mLayer, s.dataDefinedProperty( QgsPalLayerSettings::ShapeFillColor ),
QgsDataDefinedButton::String, QgsDataDefinedButton::colorAlphaDesc() );
mShapeBorderColorDDBtn->init( mLayer, s.dataDefinedProperty( QgsPalLayerSettings::ShapeBorderColor ),
QgsDataDefinedButton::String, QgsDataDefinedButton::colorAlphaDesc() );
mShapeBorderWidthDDBtn->init( mLayer, s.dataDefinedProperty( QgsPalLayerSettings::ShapeBorderWidth ),
QgsDataDefinedButton::AnyType, QgsDataDefinedButton::doublePosDesc() );
mShapeBorderUnitsDDBtn->init( mLayer, s.dataDefinedProperty( QgsPalLayerSettings::ShapeBorderWidthUnits ),
QgsDataDefinedButton::String, QgsDataDefinedButton::unitsMmMuDesc() );
mShapePenStyleDDBtn->init( mLayer, s.dataDefinedProperty( QgsPalLayerSettings::ShapeJoinStyle ),
QgsDataDefinedButton::String, QgsDataDefinedButton::penJoinStyleDesc() );
registerDataDefinedButton( mShapeSizeXDDBtn, QgsPalLayerSettings::ShapeSizeX,
QgsDataDefinedButtonV2::AnyType, QgsDataDefinedButtonV2::doubleDesc() );
registerDataDefinedButton( mShapeSizeYDDBtn, QgsPalLayerSettings::ShapeSizeY,
QgsDataDefinedButtonV2::AnyType, QgsDataDefinedButtonV2::doubleDesc() );
registerDataDefinedButton( mShapeSizeUnitsDDBtn, QgsPalLayerSettings::ShapeSizeUnits,
QgsDataDefinedButtonV2::String, QgsDataDefinedButtonV2::unitsMmMuDesc() );
registerDataDefinedButton( mShapeRotationTypeDDBtn, QgsPalLayerSettings::ShapeRotationType,
QgsDataDefinedButtonV2::String,
trString + "[<b>Sync</b>|<b>Offset</b>|<b>Fixed</b>]" );
registerDataDefinedButton( mShapeRotationDDBtn, QgsPalLayerSettings::ShapeRotation,
QgsDataDefinedButtonV2::AnyType, QgsDataDefinedButtonV2::double180RotDesc() );
registerDataDefinedButton( mShapeOffsetDDBtn, QgsPalLayerSettings::ShapeOffset,
QgsDataDefinedButtonV2::AnyType, QgsDataDefinedButtonV2::doubleXYDesc() );
registerDataDefinedButton( mShapeOffsetUnitsDDBtn, QgsPalLayerSettings::ShapeOffsetUnits,
QgsDataDefinedButtonV2::String, QgsDataDefinedButtonV2::unitsMmMuDesc() );
registerDataDefinedButton( mShapeRadiusDDBtn, QgsPalLayerSettings::ShapeRadii,
QgsDataDefinedButtonV2::AnyType, QgsDataDefinedButtonV2::doubleXYDesc() );
registerDataDefinedButton( mShapeRadiusUnitsDDBtn, QgsPalLayerSettings::ShapeRadiiUnits,
QgsDataDefinedButtonV2::String, QgsDataDefinedButtonV2::unitsMmMuPercentDesc() );
registerDataDefinedButton( mShapeTranspDDBtn, QgsPalLayerSettings::ShapeTransparency,
QgsDataDefinedButtonV2::AnyType, QgsDataDefinedButtonV2::intTranspDesc() );
registerDataDefinedButton( mShapeBlendModeDDBtn, QgsPalLayerSettings::ShapeBlendMode,
QgsDataDefinedButtonV2::String, QgsDataDefinedButtonV2::blendModesDesc() );
registerDataDefinedButton( mShapeFillColorDDBtn, QgsPalLayerSettings::ShapeFillColor,
QgsDataDefinedButtonV2::String, QgsDataDefinedButtonV2::colorAlphaDesc() );
registerDataDefinedButton( mShapeBorderColorDDBtn, QgsPalLayerSettings::ShapeBorderColor,
QgsDataDefinedButtonV2::String, QgsDataDefinedButtonV2::colorAlphaDesc() );
registerDataDefinedButton( mShapeBorderWidthDDBtn, QgsPalLayerSettings::ShapeBorderWidth,
QgsDataDefinedButtonV2::AnyType, QgsDataDefinedButtonV2::doublePosDesc() );
registerDataDefinedButton( mShapeBorderUnitsDDBtn, QgsPalLayerSettings::ShapeBorderWidthUnits,
QgsDataDefinedButtonV2::String, QgsDataDefinedButtonV2::unitsMmMuDesc() );
registerDataDefinedButton( mShapePenStyleDDBtn, QgsPalLayerSettings::ShapeJoinStyle,
QgsDataDefinedButtonV2::String, QgsDataDefinedButtonV2::penJoinStyleDesc() );
// drop shadows
mShadowDrawDDBtn->init( mLayer, s.dataDefinedProperty( QgsPalLayerSettings::ShadowDraw ),
QgsDataDefinedButton::AnyType, QgsDataDefinedButton::boolDesc() );
registerDataDefinedButton( mShadowDrawDDBtn, QgsPalLayerSettings::ShadowDraw,
QgsDataDefinedButtonV2::AnyType, QgsDataDefinedButtonV2::boolDesc() );
mShadowDrawDDBtn->registerCheckedWidget( mShadowDrawChkBx );
mShadowUnderDDBtn->init( mLayer, s.dataDefinedProperty( QgsPalLayerSettings::ShadowUnder ),
QgsDataDefinedButton::String,
trString + QStringLiteral( "[<b>Lowest</b>|<b>Text</b>|<br>"
"<b>Buffer</b>|<b>Background</b>]" ) );
mShadowOffsetAngleDDBtn->init( mLayer, s.dataDefinedProperty( QgsPalLayerSettings::ShadowOffsetAngle ),
QgsDataDefinedButton::AnyType, QgsDataDefinedButton::double180RotDesc() );
mShadowOffsetDDBtn->init( mLayer, s.dataDefinedProperty( QgsPalLayerSettings::ShadowOffsetDist ),
QgsDataDefinedButton::AnyType, QgsDataDefinedButton::doublePosDesc() );
mShadowOffsetUnitsDDBtn->init( mLayer, s.dataDefinedProperty( QgsPalLayerSettings::ShadowOffsetUnits ),
QgsDataDefinedButton::String, QgsDataDefinedButton::unitsMmMuDesc() );
mShadowRadiusDDBtn->init( mLayer, s.dataDefinedProperty( QgsPalLayerSettings::ShadowRadius ),
QgsDataDefinedButton::AnyType, QgsDataDefinedButton::doublePosDesc() );
mShadowRadiusUnitsDDBtn->init( mLayer, s.dataDefinedProperty( QgsPalLayerSettings::ShadowRadiusUnits ),
QgsDataDefinedButton::String, QgsDataDefinedButton::unitsMmMuDesc() );
mShadowTranspDDBtn->init( mLayer, s.dataDefinedProperty( QgsPalLayerSettings::ShadowTransparency ),
QgsDataDefinedButton::AnyType, QgsDataDefinedButton::intTranspDesc() );
mShadowScaleDDBtn->init( mLayer, s.dataDefinedProperty( QgsPalLayerSettings::ShadowScale ),
QgsDataDefinedButton::AnyType, tr( "int [0-2000]" ) );
mShadowColorDDBtn->init( mLayer, s.dataDefinedProperty( QgsPalLayerSettings::ShadowColor ),
QgsDataDefinedButton::String, QgsDataDefinedButton::colorNoAlphaDesc() );
mShadowBlendDDBtn->init( mLayer, s.dataDefinedProperty( QgsPalLayerSettings::ShadowBlendMode ),
QgsDataDefinedButton::String, QgsDataDefinedButton::blendModesDesc() );
registerDataDefinedButton( mShadowUnderDDBtn, QgsPalLayerSettings::ShadowUnder,
QgsDataDefinedButtonV2::String,
trString + QStringLiteral( "[<b>Lowest</b>|<b>Text</b>|<br>"
"<b>Buffer</b>|<b>Background</b>]" ) );
registerDataDefinedButton( mShadowOffsetAngleDDBtn, QgsPalLayerSettings::ShadowOffsetAngle,
QgsDataDefinedButtonV2::AnyType, QgsDataDefinedButtonV2::double180RotDesc() );
registerDataDefinedButton( mShadowOffsetDDBtn, QgsPalLayerSettings::ShadowOffsetDist,
QgsDataDefinedButtonV2::AnyType, QgsDataDefinedButtonV2::doublePosDesc() );
registerDataDefinedButton( mShadowOffsetUnitsDDBtn, QgsPalLayerSettings::ShadowOffsetUnits,
QgsDataDefinedButtonV2::String, QgsDataDefinedButtonV2::unitsMmMuDesc() );
registerDataDefinedButton( mShadowRadiusDDBtn, QgsPalLayerSettings::ShadowRadius,
QgsDataDefinedButtonV2::AnyType, QgsDataDefinedButtonV2::doublePosDesc() );
registerDataDefinedButton( mShadowRadiusUnitsDDBtn, QgsPalLayerSettings::ShadowRadiusUnits,
QgsDataDefinedButtonV2::String, QgsDataDefinedButtonV2::unitsMmMuDesc() );
registerDataDefinedButton( mShadowTranspDDBtn, QgsPalLayerSettings::ShadowTransparency,
QgsDataDefinedButtonV2::AnyType, QgsDataDefinedButtonV2::intTranspDesc() );
registerDataDefinedButton( mShadowScaleDDBtn, QgsPalLayerSettings::ShadowScale,
QgsDataDefinedButtonV2::AnyType, tr( "int [0-2000]" ) );
registerDataDefinedButton( mShadowColorDDBtn, QgsPalLayerSettings::ShadowColor,
QgsDataDefinedButtonV2::String, QgsDataDefinedButtonV2::colorNoAlphaDesc() );
registerDataDefinedButton( mShadowBlendDDBtn, QgsPalLayerSettings::ShadowBlendMode,
QgsDataDefinedButtonV2::String, QgsDataDefinedButtonV2::blendModesDesc() );
// placement
mCentroidDDBtn->init( mLayer, s.dataDefinedProperty( QgsPalLayerSettings::CentroidWhole ),
QgsDataDefinedButton::String,
trString + "[<b>Visible</b>|<b>Whole</b>]" );
mPointQuadOffsetDDBtn->init( mLayer, s.dataDefinedProperty( QgsPalLayerSettings::OffsetQuad ),
QgsDataDefinedButton::AnyType,
tr( "int<br>" ) + QStringLiteral( "[<b>0</b>=Above Left|<b>1</b>=Above|<b>2</b>=Above Right|<br>"
"<b>3</b>=Left|<b>4</b>=Over|<b>5</b>=Right|<br>"
"<b>6</b>=Below Left|<b>7</b>=Below|<b>8</b>=Below Right]" ) );
mPointPositionOrderDDBtn->init( mLayer, s.dataDefinedProperty( QgsPalLayerSettings::PredefinedPositionOrder ),
QgsDataDefinedButton::String,
tr( "Comma separated list of placements in order of priority<br>" )
+ QStringLiteral( "[<b>TL</b>=Top left|<b>TSL</b>=Top, slightly left|<b>T</b>=Top middle|<br>"
"<b>TSR</b>=Top, slightly right|<b>TR</b>=Top right|<br>"
"<b>L</b>=Left|<b>R</b>=Right|<br>"
"<b>BL</b>=Bottom left|<b>BSL</b>=Bottom, slightly left|<b>B</b>=Bottom middle|<br>"
"<b>BSR</b>=Bottom, slightly right|<b>BR</b>=Bottom right]" ) );
mPointOffsetDDBtn->init( mLayer, s.dataDefinedProperty( QgsPalLayerSettings::OffsetXY ),
QgsDataDefinedButton::AnyType, QgsDataDefinedButton::doubleXYDesc() );
mPointOffsetUnitsDDBtn->init( mLayer, s.dataDefinedProperty( QgsPalLayerSettings::OffsetUnits ),
QgsDataDefinedButton::String, QgsDataDefinedButton::unitsMmMuDesc() );
mLineDistanceDDBtn->init( mLayer, s.dataDefinedProperty( QgsPalLayerSettings::LabelDistance ),
QgsDataDefinedButton::AnyType, QgsDataDefinedButton::doublePosDesc() );
mLineDistanceUnitDDBtn->init( mLayer, s.dataDefinedProperty( QgsPalLayerSettings::DistanceUnits ),
QgsDataDefinedButton::String, QgsDataDefinedButton::unitsMmMuDesc() );
mPriorityDDBtn->init( mLayer, s.dataDefinedProperty( QgsPalLayerSettings::Priority ),
QgsDataDefinedButton::AnyType, tr( "double [0.0-10.0]" ) );
registerDataDefinedButton( mCentroidDDBtn, QgsPalLayerSettings::CentroidWhole,
QgsDataDefinedButtonV2::String,
trString + "[<b>Visible</b>|<b>Whole</b>]" );
registerDataDefinedButton( mPointQuadOffsetDDBtn, QgsPalLayerSettings::OffsetQuad,
QgsDataDefinedButtonV2::AnyType,
tr( "int<br>" ) + QStringLiteral( "[<b>0</b>=Above Left|<b>1</b>=Above|<b>2</b>=Above Right|<br>"
"<b>3</b>=Left|<b>4</b>=Over|<b>5</b>=Right|<br>"
"<b>6</b>=Below Left|<b>7</b>=Below|<b>8</b>=Below Right]" ) );
registerDataDefinedButton( mPointPositionOrderDDBtn, QgsPalLayerSettings::PredefinedPositionOrder,
QgsDataDefinedButtonV2::String,
tr( "Comma separated list of placements in order of priority<br>" )
+ QStringLiteral( "[<b>TL</b>=Top left|<b>TSL</b>=Top, slightly left|<b>T</b>=Top middle|<br>"
"<b>TSR</b>=Top, slightly right|<b>TR</b>=Top right|<br>"
"<b>L</b>=Left|<b>R</b>=Right|<br>"
"<b>BL</b>=Bottom left|<b>BSL</b>=Bottom, slightly left|<b>B</b>=Bottom middle|<br>"
"<b>BSR</b>=Bottom, slightly right|<b>BR</b>=Bottom right]" ) );
registerDataDefinedButton( mPointOffsetDDBtn, QgsPalLayerSettings::OffsetXY,
QgsDataDefinedButtonV2::AnyType, QgsDataDefinedButtonV2::doubleXYDesc() );
registerDataDefinedButton( mPointOffsetUnitsDDBtn, QgsPalLayerSettings::OffsetUnits,
QgsDataDefinedButtonV2::String, QgsDataDefinedButtonV2::unitsMmMuDesc() );
registerDataDefinedButton( mLineDistanceDDBtn, QgsPalLayerSettings::LabelDistance,
QgsDataDefinedButtonV2::AnyType, QgsDataDefinedButtonV2::doublePosDesc() );
registerDataDefinedButton( mLineDistanceUnitDDBtn, QgsPalLayerSettings::DistanceUnits,
QgsDataDefinedButtonV2::String, QgsDataDefinedButtonV2::unitsMmMuDesc() );
registerDataDefinedButton( mPriorityDDBtn, QgsPalLayerSettings::Priority,
QgsDataDefinedButtonV2::AnyType, tr( "double [0.0-10.0]" ) );
// TODO: is this necessary? maybe just use the data defined-only rotation?
//mPointAngleDDBtn->init( mLayer, s.dataDefinedProperty( QgsPalLayerSettings::OffsetRotation ),
// QgsDataDefinedButton::AnyType, QgsDataDefinedButton::double180RotDesc() );
mMaxCharAngleDDBtn->init( mLayer, s.dataDefinedProperty( QgsPalLayerSettings::CurvedCharAngleInOut ),
QgsDataDefinedButton::AnyType, tr( "double coord [<b>in,out</b> as 20.0-60.0,20.0-95.0]" ) );
mRepeatDistanceDDBtn->init( mLayer, s.dataDefinedProperty( QgsPalLayerSettings::RepeatDistance ),
QgsDataDefinedButton::AnyType, QgsDataDefinedButton::doublePosDesc() );
mRepeatDistanceUnitDDBtn->init( mLayer, s.dataDefinedProperty( QgsPalLayerSettings::RepeatDistanceUnit ),
QgsDataDefinedButton::String, QgsDataDefinedButton::unitsMmMuDesc() );
//mPointAngleDDBtn, QgsPalLayerSettings::OffsetRotation,
// QgsDataDefinedButtonV2::AnyType, QgsDataDefinedButtonV2::double180RotDesc() );
registerDataDefinedButton( mMaxCharAngleDDBtn, QgsPalLayerSettings::CurvedCharAngleInOut,
QgsDataDefinedButtonV2::AnyType, tr( "double coord [<b>in,out</b> as 20.0-60.0,20.0-95.0]" ) );
registerDataDefinedButton( mRepeatDistanceDDBtn, QgsPalLayerSettings::RepeatDistance,
QgsDataDefinedButtonV2::AnyType, QgsDataDefinedButtonV2::doublePosDesc() );
registerDataDefinedButton( mRepeatDistanceUnitDDBtn, QgsPalLayerSettings::RepeatDistanceUnit,
QgsDataDefinedButtonV2::String, QgsDataDefinedButtonV2::unitsMmMuDesc() );
// data defined-only
QString ddPlaceInfo = tr( "In edit mode, layer's relevant labeling map tool is:<br>"
"&nbsp;&nbsp;Defined attribute field -&gt; <i>enabled</i><br>"
"&nbsp;&nbsp;Defined expression -&gt; <i>disabled</i>" );
mCoordXDDBtn->init( mLayer, s.dataDefinedProperty( QgsPalLayerSettings::PositionX ),
QgsDataDefinedButton::AnyType, QgsDataDefinedButton::doubleDesc() );
registerDataDefinedButton( mCoordXDDBtn, QgsPalLayerSettings::PositionX,
QgsDataDefinedButtonV2::AnyType, QgsDataDefinedButtonV2::doubleDesc() );
mCoordXDDBtn->setUsageInfo( ddPlaceInfo );
mCoordYDDBtn->init( mLayer, s.dataDefinedProperty( QgsPalLayerSettings::PositionY ),
QgsDataDefinedButton::AnyType, QgsDataDefinedButton::doubleDesc() );
registerDataDefinedButton( mCoordYDDBtn, QgsPalLayerSettings::PositionY,
QgsDataDefinedButtonV2::AnyType, QgsDataDefinedButtonV2::doubleDesc() );
mCoordYDDBtn->setUsageInfo( ddPlaceInfo );
mCoordAlignmentHDDBtn->init( mLayer, s.dataDefinedProperty( QgsPalLayerSettings::Hali ),
QgsDataDefinedButton::String,
trString + "[<b>Left</b>|<b>Center</b>|<b>Right</b>]" );
registerDataDefinedButton( mCoordAlignmentHDDBtn, QgsPalLayerSettings::Hali,
QgsDataDefinedButtonV2::String,
trString + "[<b>Left</b>|<b>Center</b>|<b>Right</b>]" );
mCoordAlignmentHDDBtn->setUsageInfo( ddPlaceInfo );
mCoordAlignmentVDDBtn->init( mLayer, s.dataDefinedProperty( QgsPalLayerSettings::Vali ),
QgsDataDefinedButton::String,
trString + QStringLiteral( "[<b>Bottom</b>|<b>Base</b>|<br>"
"<b>Half</b>|<b>Cap</b>|<b>Top</b>]" ) );
registerDataDefinedButton( mCoordAlignmentVDDBtn, QgsPalLayerSettings::Vali,
QgsDataDefinedButtonV2::String,
trString + QStringLiteral( "[<b>Bottom</b>|<b>Base</b>|<br>"
"<b>Half</b>|<b>Cap</b>|<b>Top</b>]" ) );
mCoordAlignmentVDDBtn->setUsageInfo( ddPlaceInfo );
mCoordRotationDDBtn->init( mLayer, s.dataDefinedProperty( QgsPalLayerSettings::Rotation ),
QgsDataDefinedButton::AnyType, QgsDataDefinedButton::double180RotDesc() );
registerDataDefinedButton( mCoordRotationDDBtn, QgsPalLayerSettings::Rotation,
QgsDataDefinedButtonV2::AnyType, QgsDataDefinedButtonV2::double180RotDesc() );
mCoordRotationDDBtn->setUsageInfo( ddPlaceInfo );
// rendering
QString ddScaleVisInfo = tr( "Value &lt; 0 represents a scale closer than 1:1, e.g. -10 = 10:1<br>"
"Value of 0 disables the specific limit." );
mScaleBasedVisibilityDDBtn->init( mLayer, s.dataDefinedProperty( QgsPalLayerSettings::ScaleVisibility ),
QgsDataDefinedButton::AnyType, QgsDataDefinedButton::boolDesc() );
registerDataDefinedButton( mScaleBasedVisibilityDDBtn, QgsPalLayerSettings::ScaleVisibility,
QgsDataDefinedButtonV2::AnyType, QgsDataDefinedButtonV2::boolDesc() );
mScaleBasedVisibilityDDBtn->registerCheckedWidget( mScaleBasedVisibilityChkBx );
mScaleBasedVisibilityMinDDBtn->init( mLayer, s.dataDefinedProperty( QgsPalLayerSettings::MinScale ),
QgsDataDefinedButton::AnyType, QgsDataDefinedButton::intDesc() );
registerDataDefinedButton( mScaleBasedVisibilityMinDDBtn, QgsPalLayerSettings::MinScale,
QgsDataDefinedButtonV2::AnyType, QgsDataDefinedButtonV2::intDesc() );
mScaleBasedVisibilityMinDDBtn->setUsageInfo( ddScaleVisInfo );
mScaleBasedVisibilityMaxDDBtn->init( mLayer, s.dataDefinedProperty( QgsPalLayerSettings::MaxScale ),
QgsDataDefinedButton::AnyType, QgsDataDefinedButton::intDesc() );
registerDataDefinedButton( mScaleBasedVisibilityMaxDDBtn, QgsPalLayerSettings::MaxScale,
QgsDataDefinedButtonV2::AnyType, QgsDataDefinedButtonV2::intDesc() );
mScaleBasedVisibilityMaxDDBtn->setUsageInfo( ddScaleVisInfo );
mFontLimitPixelDDBtn->init( mLayer, s.dataDefinedProperty( QgsPalLayerSettings::FontLimitPixel ),
QgsDataDefinedButton::AnyType, QgsDataDefinedButton::boolDesc() );
registerDataDefinedButton( mFontLimitPixelDDBtn, QgsPalLayerSettings::FontLimitPixel,
QgsDataDefinedButtonV2::AnyType, QgsDataDefinedButtonV2::boolDesc() );
mFontLimitPixelDDBtn->registerCheckedWidget( mFontLimitPixelChkBox );
mFontMinPixelDDBtn->init( mLayer, s.dataDefinedProperty( QgsPalLayerSettings::FontMinPixel ),
QgsDataDefinedButton::AnyType, tr( "int [1-1000]" ) );
mFontMaxPixelDDBtn->init( mLayer, s.dataDefinedProperty( QgsPalLayerSettings::FontMaxPixel ),
QgsDataDefinedButton::AnyType, tr( "int [1-10000]" ) );
registerDataDefinedButton( mFontMinPixelDDBtn, QgsPalLayerSettings::FontMinPixel,
QgsDataDefinedButtonV2::AnyType, tr( "int [1-1000]" ) );
registerDataDefinedButton( mFontMaxPixelDDBtn, QgsPalLayerSettings::FontMaxPixel,
QgsDataDefinedButtonV2::AnyType, tr( "int [1-10000]" ) );
mShowLabelDDBtn->init( mLayer, s.dataDefinedProperty( QgsPalLayerSettings::Show ),
QgsDataDefinedButton::AnyType, QgsDataDefinedButton::boolDesc() );
registerDataDefinedButton( mShowLabelDDBtn, QgsPalLayerSettings::Show,
QgsDataDefinedButtonV2::AnyType, QgsDataDefinedButtonV2::boolDesc() );
mAlwaysShowDDBtn->init( mLayer, s.dataDefinedProperty( QgsPalLayerSettings::AlwaysShow ),
QgsDataDefinedButton::AnyType, QgsDataDefinedButton::boolDesc() );
registerDataDefinedButton( mAlwaysShowDDBtn, QgsPalLayerSettings::AlwaysShow,
QgsDataDefinedButtonV2::AnyType, QgsDataDefinedButtonV2::boolDesc() );
mIsObstacleDDBtn->init( mLayer, s.dataDefinedProperty( QgsPalLayerSettings::IsObstacle ),
QgsDataDefinedButton::AnyType, QgsDataDefinedButton::boolDesc() );
mObstacleFactorDDBtn->init( mLayer, s.dataDefinedProperty( QgsPalLayerSettings::ObstacleFactor ),
QgsDataDefinedButton::AnyType, tr( "double [0.0-10.0]" ) );
mZIndexDDBtn->init( mLayer, s.dataDefinedProperty( QgsPalLayerSettings::ZIndex ),
QgsDataDefinedButton::AnyType, QgsDataDefinedButton::doubleDesc() );
registerDataDefinedButton( mIsObstacleDDBtn, QgsPalLayerSettings::IsObstacle,
QgsDataDefinedButtonV2::AnyType, QgsDataDefinedButtonV2::boolDesc() );
registerDataDefinedButton( mObstacleFactorDDBtn, QgsPalLayerSettings::ObstacleFactor,
QgsDataDefinedButtonV2::AnyType, tr( "double [0.0-10.0]" ) );
registerDataDefinedButton( mZIndexDDBtn, QgsPalLayerSettings::ZIndex,
QgsDataDefinedButtonV2::AnyType, QgsDataDefinedButtonV2::doubleDesc() );
}
void QgsLabelingGui::syncDefinedCheckboxFrame( QgsDataDefinedButton* ddBtn, QCheckBox* chkBx, QFrame* f )
void QgsLabelingGui::syncDefinedCheckboxFrame( QgsDataDefinedButtonV2* ddBtn, QCheckBox* chkBx, QFrame* f )
{
if ( ddBtn->isActive() && !chkBx->isChecked() )
{

View File

@ -20,6 +20,7 @@
#include "qgspallabeling.h"
#include "qgstextformatwidget.h"
#include "qgsdatadefinedbuttonv2.h"
#include "qgis_app.h"
class APP_EXPORT QgsLabelingGui : public QgsTextFormatWidget, private QgsExpressionContextGenerator
@ -51,18 +52,23 @@ class APP_EXPORT QgsLabelingGui : public QgsTextFormatWidget, private QgsExpress
protected:
void blockInitSignals( bool block );
void syncDefinedCheckboxFrame( QgsDataDefinedButton* ddBtn, QCheckBox* chkBx, QFrame* f );
void populateDataDefinedButtons( QgsPalLayerSettings& s );
//! Sets data defined property attribute to map
void setDataDefinedProperty( const QgsDataDefinedButton* ddBtn, QgsPalLayerSettings::DataDefinedProperties p, QgsPalLayerSettings& lyr );
void syncDefinedCheckboxFrame( QgsDataDefinedButtonV2* ddBtn, QCheckBox* chkBx, QFrame* f );
private:
QgsVectorLayer* mLayer;
const QgsPalLayerSettings* mSettings;
QgsPropertyCollection mProperties;
LabelMode mMode;
QgsExpressionContext createExpressionContext() const override;
void populateDataDefinedButtons();
void registerDataDefinedButton( QgsDataDefinedButtonV2 *button, QgsPalLayerSettings::Property key, QgsDataDefinedButtonV2::DataType type, const QString &description );
private slots:
void updateProperty();
};
#endif // QGSLABELINGGUI_H

View File

@ -25,7 +25,7 @@
#include "qgisapp.h"
#include "qgsmapcanvas.h"
#include "qgsvectorlayerlabeling.h"
#include "qgsproperty.h"
#include <QColorDialog>
#include <QFontDatabase>
#include <QSettings>
@ -49,8 +49,6 @@ QgsLabelPropertyDialog::~QgsLabelPropertyDialog()
{
QSettings settings;
settings.setValue( QStringLiteral( "/Windows/ChangeLabelProps/geometry" ), saveGeometry() );
qDeleteAll( mDataDefinedProperties );
}
void QgsLabelPropertyDialog::on_buttonBox_clicked( QAbstractButton *button )
@ -153,14 +151,10 @@ void QgsLabelPropertyDialog::init( const QString& layerId, const QString& provid
disableGuiElements();
QMap< QgsPalLayerSettings::DataDefinedProperties, QgsDataDefined* >::const_iterator it = layerSettings.dataDefinedProperties.constBegin();
for ( ; it != layerSettings.dataDefinedProperties.constEnd(); ++it )
{
mDataDefinedProperties.insert( it.key(), it.value() ? new QgsDataDefined( *it.value() ) : nullptr );
}
mDataDefinedProperties = layerSettings.properties();
//set widget values from data defined results
setDataDefinedValues( layerSettings, vlayer );
setDataDefinedValues( vlayer );
//enable widgets connected to data defined fields
enableDataDefinedWidgets( vlayer );
@ -215,7 +209,7 @@ void QgsLabelPropertyDialog::blockElementSignals( bool block )
mRotationSpinBox->blockSignals( block );
}
void QgsLabelPropertyDialog::setDataDefinedValues( const QgsPalLayerSettings &layerSettings, QgsVectorLayer* vlayer )
void QgsLabelPropertyDialog::setDataDefinedValues( QgsVectorLayer* vlayer )
{
//loop through data defined properties and set all the GUI widget values. We can do this
//even if the data defined property is set to an expression, as it's useful to show
@ -229,22 +223,13 @@ void QgsLabelPropertyDialog::setDataDefinedValues( const QgsPalLayerSettings &la
<< QgsExpressionContextUtils::layerScope( vlayer );
context.setFeature( mCurLabelFeat );
QMap< QgsPalLayerSettings::DataDefinedProperties, QgsDataDefined* >::const_iterator propIt = mDataDefinedProperties.constBegin();
for ( ; propIt != mDataDefinedProperties.constEnd(); ++propIt )
Q_FOREACH ( int key, mDataDefinedProperties.propertyKeys() )
{
QgsDataDefined* dd = propIt.value();
if ( !dd || !dd->isActive() )
{
if ( !mDataDefinedProperties.isActive( key ) )
continue;
}
if ( !dd->expressionIsPrepared() )
{
dd->prepareExpression( context );
}
//TODO - pass expression context
QVariant result = layerSettings.dataDefinedValue( propIt.key(), mCurLabelFeat, vlayer->fields(), &context );
QVariant result = mDataDefinedProperties.value( key, context );
if ( !result.isValid() || result.isNull() )
{
//could not evaluate data defined value
@ -252,7 +237,7 @@ void QgsLabelPropertyDialog::setDataDefinedValues( const QgsPalLayerSettings &la
}
bool ok = false;
switch ( propIt.key() )
switch ( key )
{
case QgsPalLayerSettings::Show:
{
@ -362,20 +347,20 @@ void QgsLabelPropertyDialog::enableDataDefinedWidgets( QgsVectorLayer* vlayer )
{
//loop through data defined properties, this time setting whether or not the widgets are enabled
//this can only be done for properties which are assigned to fields
QMap< QgsPalLayerSettings::DataDefinedProperties, QgsDataDefined* >::const_iterator propIt = mDataDefinedProperties.constBegin();
for ( ; propIt != mDataDefinedProperties.constEnd(); ++propIt )
Q_FOREACH ( int key, mDataDefinedProperties.propertyKeys() )
{
QgsDataDefined* dd = propIt.value();
if ( !dd )
{
continue;
}
QString ddField = dd->field();
if ( !dd->isActive() || dd->useExpression() || ddField.isEmpty() )
QgsAbstractProperty* prop = mDataDefinedProperties.property( key );
if ( !prop || !prop->isActive() || prop->propertyType() != QgsAbstractProperty::FieldBasedProperty )
{
continue; // can only modify attributes with an active data definition of a mapped field
}
QString ddField = static_cast< QgsFieldBasedProperty*>( prop )->field();
if ( ddField.isEmpty() )
{
continue;
}
int ddIndx = vlayer->fields().lookupField( ddField );
if ( ddIndx == -1 )
{
@ -384,7 +369,7 @@ void QgsLabelPropertyDialog::enableDataDefinedWidgets( QgsVectorLayer* vlayer )
QgsDebugMsg( QString( "ddField: %1" ).arg( ddField ) );
switch ( propIt.key() )
switch ( key )
{
case QgsPalLayerSettings::Show:
mShowLabelChkbx->setEnabled( true );
@ -664,16 +649,14 @@ void QgsLabelPropertyDialog::on_mLabelTextLineEdit_textChanged( const QString& t
}
}
void QgsLabelPropertyDialog::insertChangedValue( QgsPalLayerSettings::DataDefinedProperties p, const QVariant& value )
void QgsLabelPropertyDialog::insertChangedValue( QgsPalLayerSettings::Property p, const QVariant& value )
{
QMap< QgsPalLayerSettings::DataDefinedProperties, QgsDataDefined* >::const_iterator ddIt = mDataDefinedProperties.constFind( p );
if ( ddIt != mDataDefinedProperties.constEnd() )
if ( mDataDefinedProperties.isActive( p ) )
{
QgsDataDefined* dd = ddIt.value();
if ( dd && dd->isActive() && !dd->useExpression() && !dd->field().isEmpty() )
QgsAbstractProperty* prop = mDataDefinedProperties.property( p );
if ( prop->propertyType() == QgsAbstractProperty::FieldBasedProperty )
{
mChangedProperties.insert( mCurLabelFeat.fieldNameIndex( dd->field() ), value );
mChangedProperties.insert( mCurLabelFeat.fieldNameIndex( static_cast< QgsFieldBasedProperty* >( prop )->field() ), value );
}
}
}

View File

@ -74,7 +74,7 @@ class APP_EXPORT QgsLabelPropertyDialog: public QDialog, private Ui::QgsLabelPro
//! Block / unblock all input element signals
void blockElementSignals( bool block );
void setDataDefinedValues( const QgsPalLayerSettings &layerSettings, QgsVectorLayer* vlayer );
void setDataDefinedValues( QgsVectorLayer* vlayer );
void enableDataDefinedWidgets( QgsVectorLayer* vlayer );
//! Updates font when family or style is updated
@ -87,10 +87,10 @@ class APP_EXPORT QgsLabelPropertyDialog: public QDialog, private Ui::QgsLabelPro
void fillValiComboBox();
//! Insert changed value into mChangedProperties
void insertChangedValue( QgsPalLayerSettings::DataDefinedProperties p, const QVariant& value );
void insertChangedValue( QgsPalLayerSettings::Property p, const QVariant& value );
QgsAttributeMap mChangedProperties;
QMap< QgsPalLayerSettings::DataDefinedProperties, QgsDataDefined* > mDataDefinedProperties;
QgsPropertyCollection mDataDefinedProperties;
QFont mLabelFont;
QFontDatabase mFontDB;

View File

@ -409,23 +409,19 @@ bool QgsMapToolLabel::hasDataDefinedColumn( QgsPalLayerSettings::DataDefinedProp
}
#endif
QString QgsMapToolLabel::dataDefinedColumnName( QgsPalLayerSettings::DataDefinedProperties p, const QgsPalLayerSettings& labelSettings ) const
QString QgsMapToolLabel::dataDefinedColumnName( QgsPalLayerSettings::Property p, const QgsPalLayerSettings& labelSettings ) const
{
//QgsDebugMsg( QString( "dataDefinedProperties count:%1" ).arg( labelSettings.dataDefinedProperties.size() ) );
if ( !labelSettings.properties().isActive( p ) )
return QString();
QMap< QgsPalLayerSettings::DataDefinedProperties, QgsDataDefined* >::const_iterator dIt = labelSettings.dataDefinedProperties.constFind( p );
if ( dIt != labelSettings.dataDefinedProperties.constEnd() )
{
QgsDataDefined* dd = dIt.value();
const QgsAbstractProperty* prop = labelSettings.properties().property( p );
if ( prop->propertyType() != QgsAbstractProperty::FieldBasedProperty )
return QString();
// can only modify attributes that are data defined with a mapped field
if ( dd->isActive() && !dd->useExpression() && !dd->field().isEmpty() )
return dd->field();
}
return QString();
return static_cast< const QgsFieldBasedProperty* >( prop )->field();
}
int QgsMapToolLabel::dataDefinedColumnIndex( QgsPalLayerSettings::DataDefinedProperties p, const QgsPalLayerSettings& labelSettings, const QgsVectorLayer* vlayer ) const
int QgsMapToolLabel::dataDefinedColumnIndex( QgsPalLayerSettings::Property p, const QgsPalLayerSettings& labelSettings, const QgsVectorLayer* vlayer ) const
{
QString fieldname = dataDefinedColumnName( p, labelSettings );
if ( !fieldname.isEmpty() )

View File

@ -117,11 +117,11 @@ class APP_EXPORT QgsMapToolLabel: public QgsMapTool
QFont currentLabelFont();
//! Returns a data defined attribute column name for particular property or empty string if not defined
QString dataDefinedColumnName( QgsPalLayerSettings::DataDefinedProperties p, const QgsPalLayerSettings& labelSettings ) const;
QString dataDefinedColumnName( QgsPalLayerSettings::Property p, const QgsPalLayerSettings& labelSettings ) const;
/** Returns a data defined attribute column index
@return -1 if column does not exist or an expression is used instead */
int dataDefinedColumnIndex( QgsPalLayerSettings::DataDefinedProperties p, const QgsPalLayerSettings& labelSettings, const QgsVectorLayer* vlayer ) const;
int dataDefinedColumnIndex( QgsPalLayerSettings::Property p, const QgsPalLayerSettings& labelSettings, const QgsVectorLayer* vlayer ) const;
//! Returns whether to preserve predefined rotation data during label pin/unpin operations
bool currentLabelPreserveRotation();

View File

@ -4259,7 +4259,7 @@ void QgsDxfExport::drawLabel( const QString& layerId, QgsRenderContext& context,
QgsPalLayerSettings tmpLyr( settings );
// apply any previously applied data defined settings for the label
const QMap< QgsPalLayerSettings::DataDefinedProperties, QVariant >& ddValues = lf->dataDefinedValues();
const QMap< QgsPalLayerSettings::Property, QVariant >& ddValues = lf->dataDefinedValues();
//font
QFont dFont = lf->definedFont();

View File

@ -25,7 +25,7 @@
#include <QDomElement>
#include <QPainter>
const QMap< int, QString > QgsDiagramLayerSettings::sPropertyNameMap
const QgsPropertyDefinition QgsDiagramLayerSettings::sPropertyNameMap
{
{ QgsDiagramLayerSettings::BackgroundColor, "backgroundColor" },
{ QgsDiagramLayerSettings::OutlineColor, "outlineColor" },

View File

@ -308,7 +308,7 @@ class CORE_EXPORT QgsDiagramLayerSettings
//! Property collection for data defined diagram settings
QgsPropertyCollection mProperties;
static const QMap< int, QString > sPropertyNameMap;
static const QgsPropertyDefinition sPropertyNameMap;
};
/** \ingroup core

File diff suppressed because it is too large Load Diff

View File

@ -38,6 +38,7 @@
#include "qgsmapunitscale.h"
#include "qgsstringutils.h"
#include "qgstextrenderer.h"
#include "qgspropertycollection.h"
namespace pal
{
@ -261,7 +262,7 @@ class CORE_EXPORT QgsPalLayerSettings
//! Data definable properties.
// update sPropertyNameMap QMap in constructor when adding/deleting enum value
enum DataDefinedProperties
enum Property
{
// text style
Size = 0, //!< Label size
@ -529,61 +530,24 @@ class CORE_EXPORT QgsPalLayerSettings
*/
QDomElement writeXml( QDomDocument& doc );
/** Get a data defined property pointer
* @note helpful for Python access
/** Returns a reference to the label's property collection, used for data defined overrides.
* @note added in QGIS 3.0
* @see setProperties()
*/
QgsDataDefined* dataDefinedProperty( QgsPalLayerSettings::DataDefinedProperties p );
QgsPropertyCollection& properties() { return mProperties; }
/** Set a property as data defined
* @note helpful for Python access
/** Returns a reference to the label's property collection, used for data defined overrides.
* @note added in QGIS 3.0
* @see setProperties()
*/
void setDataDefinedProperty( QgsPalLayerSettings::DataDefinedProperties p,
bool active, bool useExpr, const QString& expr, const QString& field );
const QgsPropertyCollection& properties() const { return mProperties; }
//! Set a property to static instead data defined
void removeDataDefinedProperty( QgsPalLayerSettings::DataDefinedProperties p );
/** Clear all data-defined properties
* @note added in QGIS 2.12
/** Sets the label's property collection, used for data defined overrides.
* @param collection property collection. Existing properties will be replaced.
* @note added in QGIS 3.0
* @see properties()
*/
void removeAllDataDefinedProperties();
/** Convert old property value to new one as delimited values
* @note not available in python bindings; as temporary solution until refactoring of project settings
*/
QString updateDataDefinedString( const QString& value );
/** Get property value as separate values split into Qmap
* @note not available in python bindings
*/
QMap<QString, QString> dataDefinedMap( QgsPalLayerSettings::DataDefinedProperties p ) const;
/** Get data defined property value from expression string or attribute field name
* @returns value inside QVariant
* @note not available in python bindings
*/
QVariant dataDefinedValue( QgsPalLayerSettings::DataDefinedProperties p, QgsFeature& f, const QgsFields& fields,
const QgsExpressionContext* context = nullptr ) const;
/** Get data defined property value from expression string or attribute field name
* @returns true/false whether result is null or invalid
* @note not available in python bindings
*/
bool dataDefinedEvaluate( QgsPalLayerSettings::DataDefinedProperties p, QVariant& exprVal, QgsExpressionContext* context = nullptr, const QVariant& originalValue = QVariant() ) const;
/** Whether data definition is active
*/
bool dataDefinedIsActive( QgsPalLayerSettings::DataDefinedProperties p ) const;
/** Whether data definition is set to use an expression
*/
bool dataDefinedUseExpression( QgsPalLayerSettings::DataDefinedProperties p ) const;
/** Map of current data defined properties
*
* Pointers to QgsDataDefined should never be null, the pointers are owned by this class
*/
QMap< QgsPalLayerSettings::DataDefinedProperties, QgsDataDefined* > dataDefinedProperties;
void setProperties( const QgsPropertyCollection& collection ) { mProperties = collection; }
/** Returns the label text formatting settings, e.g., font settings, buffer settings, etc.
* @see setFormat()
@ -614,16 +578,15 @@ class CORE_EXPORT QgsPalLayerSettings
private:
void readDataDefinedPropertyMap( QgsVectorLayer* layer, QDomElement* parentElem,
QMap < QgsPalLayerSettings::DataDefinedProperties,
QgsDataDefined* > & propertyMap );
void writeDataDefinedPropertyMap( QgsVectorLayer* layer, QDomElement* parentElem,
const QMap < QgsPalLayerSettings::DataDefinedProperties,
QgsDataDefined* > & propertyMap );
void readDataDefinedProperty( QgsVectorLayer* layer,
QgsPalLayerSettings::DataDefinedProperties p,
QMap < QgsPalLayerSettings::DataDefinedProperties,
QgsDataDefined* > & propertyMap );
/**
* Reads data defined properties from a QGIS 2.x project.
*/
void readOldDataDefinedPropertyMap( QgsVectorLayer* layer, QDomElement* parentElem );
/**
* Reads a data defined property from a QGIS 2.x project.
*/
void readOldDataDefinedProperty( QgsVectorLayer* layer, QgsPalLayerSettings::Property p );
enum DataDefinedValueType
{
@ -644,7 +607,7 @@ class CORE_EXPORT QgsPalLayerSettings
// convenience data defined evaluation function
bool dataDefinedValEval( DataDefinedValueType valType,
QgsPalLayerSettings::DataDefinedProperties p,
QgsPalLayerSettings::Property p,
QVariant& exprVal, QgsExpressionContext &context, const QVariant& originalValue = QVariant() );
void parseTextStyle( QFont& labelFont,
@ -667,14 +630,18 @@ class CORE_EXPORT QgsPalLayerSettings
*/
void registerObstacleFeature( QgsFeature &f, QgsRenderContext &context, QgsLabelFeature** obstacleFeature, QgsGeometry* obstacleGeometry = nullptr );
QMap<DataDefinedProperties, QVariant> dataDefinedValues;
QMap<Property, QVariant> dataDefinedValues;
//! Property collection for data defined label settings
QgsPropertyCollection mProperties;
QgsExpression* expression;
QFontDatabase mFontDB;
QgsTextFormat mFormat;
static const QMap< int, QString > sPropertyNameMap;
static const QgsPropertyDefinition sPropertyNameMap;
static const QVector< PredefinedPointPosition > DEFAULT_PLACEMENT_ORDER;
};
@ -821,23 +788,23 @@ class CORE_EXPORT QgsPalLabeling
protected:
// update temporary QgsPalLayerSettings with any data defined text style values
static void dataDefinedTextStyle( QgsPalLayerSettings& tmpLyr,
const QMap< QgsPalLayerSettings::DataDefinedProperties, QVariant >& ddValues );
const QMap< QgsPalLayerSettings::Property, QVariant >& ddValues );
// update temporary QgsPalLayerSettings with any data defined text formatting values
static void dataDefinedTextFormatting( QgsPalLayerSettings& tmpLyr,
const QMap< QgsPalLayerSettings::DataDefinedProperties, QVariant >& ddValues );
const QMap< QgsPalLayerSettings::Property, QVariant >& ddValues );
// update temporary QgsPalLayerSettings with any data defined text buffer values
static void dataDefinedTextBuffer( QgsPalLayerSettings& tmpLyr,
const QMap< QgsPalLayerSettings::DataDefinedProperties, QVariant >& ddValues );
const QMap< QgsPalLayerSettings::Property, QVariant >& ddValues );
// update temporary QgsPalLayerSettings with any data defined shape background values
static void dataDefinedShapeBackground( QgsPalLayerSettings& tmpLyr,
const QMap< QgsPalLayerSettings::DataDefinedProperties, QVariant >& ddValues );
const QMap< QgsPalLayerSettings::Property, QVariant >& ddValues );
// update temporary QgsPalLayerSettings with any data defined drop shadow values
static void dataDefinedDropShadow( QgsPalLayerSettings& tmpLyr,
const QMap< QgsPalLayerSettings::DataDefinedProperties, QVariant >& ddValues );
const QMap< QgsPalLayerSettings::Property, QVariant >& ddValues );
friend class QgsVectorLayerLabelProvider; // to allow calling the static methods above
friend class QgsDxfExport; // to allow calling the static methods above

View File

@ -140,6 +140,16 @@ int QgsAbstractProperty::valueAsInt( const QgsExpressionContext &context, int de
return integer;
}
bool QgsAbstractProperty::valueAsBool( const QgsExpressionContext& context, bool defaultValue ) const
{
QVariant val = value( context, defaultValue );
if ( !val.isValid() )
return defaultValue;
return val.toBool();
}
bool QgsAbstractProperty::writeXml( QDomElement &propertyElem, QDomDocument &doc ) const
{
Q_UNUSED( doc );

View File

@ -152,6 +152,17 @@ class CORE_EXPORT QgsAbstractProperty
*/
int valueAsInt( const QgsExpressionContext& context, int defaultValue = 0 ) const;
/**
* Calculates the current value of the property and interprets it as an boolean.
* @param context QgsExpressionContext to evaluate the property for.
* @param defaultValue default boolean to return if the property cannot be calculated as an boolean
* @returns value parsed to boolean
* @see value()
* @see valueAsDouble()
* @see valueAsColor()
*/
bool valueAsBool( const QgsExpressionContext& context, bool defaultValue = false ) const;
/**
* Writes the current state of the property into an XML element
* @param propertyElem destination element for the property's state

View File

@ -53,6 +53,15 @@ int QgsAbstractPropertyCollection::valueAsInt( int key, const QgsExpressionConte
return prop->valueAsInt( context, defaultValue );
}
bool QgsAbstractPropertyCollection::valueAsBool( int key, const QgsExpressionContext& context, bool defaultValue ) const
{
const QgsAbstractProperty* prop = property( key );
if ( !prop || !prop->isActive() )
return defaultValue;
return prop->valueAsBool( context, defaultValue );
}
//
@ -148,22 +157,34 @@ void QgsPropertyCollection::setProperty( int key, const QVariant& value )
bool QgsPropertyCollection::hasProperty( int key ) const
{
if ( mProperties.isEmpty() )
return false;
return mProperties.contains( key );
}
QgsAbstractProperty* QgsPropertyCollection::property( int key )
{
if ( mProperties.isEmpty() )
return nullptr;
mDirty = true;
return mProperties.value( key, nullptr );
}
const QgsAbstractProperty *QgsPropertyCollection::property( int key ) const
{
if ( mProperties.isEmpty() )
return nullptr;
return mProperties.value( key, nullptr );
}
QVariant QgsPropertyCollection::value( int key, const QgsExpressionContext& context, const QVariant& defaultValue ) const
{
if ( mProperties.isEmpty() )
return defaultValue;
QgsAbstractProperty* prop = mProperties.value( key, nullptr );
if ( !prop || !prop->isActive() )
return defaultValue;
@ -201,6 +222,9 @@ QSet< QString > QgsPropertyCollection::referencedFields( const QgsExpressionCont
bool QgsPropertyCollection::isActive( int key ) const
{
if ( mProperties.isEmpty() )
return false;
QgsAbstractProperty* prop = mProperties.value( key, nullptr );
return prop && prop->isActive();
}

View File

@ -25,6 +25,9 @@ class QgsAbstractProperty;
class QDomElement;
class QDomDocument;
//! Definition of available properties
typedef QMap< int, QString > QgsPropertyDefinition;
/**
* \ingroup core
* \class QgsAbstractPropertyCollection
@ -141,6 +144,19 @@ class CORE_EXPORT QgsAbstractPropertyCollection
*/
int valueAsInt( int key, const QgsExpressionContext& context, int defaultValue = 0 ) const;
/**
* Calculates the current value of the property with the specified key and interprets it as an boolean.
* @param key integer key for property to return. The intended use case is that a context specific enum is cast to
* int and used for the key value.
* @param context QgsExpressionContext to evaluate the property for.
* @param defaultValue default boolean to return if the property cannot be calculated as a boolean
* @returns value parsed to bool
* @see value()
* @see valueAsDouble()
* @see valueAsColor()
*/
bool valueAsBool( int key, const QgsExpressionContext& context, bool defaultValue = false ) const;
/**
* Prepares the collection against a specified expression context. Calling prepare before evaluating the
* collection's properties multiple times allows precalculation of expensive setup tasks such as parsing expressions.
@ -183,7 +199,7 @@ class CORE_EXPORT QgsAbstractPropertyCollection
* to avoid writing the raw integer key values to XML, for readability and future-proofness.
* @see readXml()
*/
virtual bool writeXml( QDomElement& collectionElem, QDomDocument& doc, const QMap< int, QString >& propertyNameMap ) const = 0;
virtual bool writeXml( QDomElement& collectionElem, QDomDocument& doc, const QgsPropertyDefinition& propertyNameMap ) const = 0;
/**
* Reads property collection state from an XML element.
@ -244,7 +260,7 @@ class CORE_EXPORT QgsPropertyCollection : public QgsAbstractPropertyCollection
bool isActive( int key ) const override;
bool hasActiveProperties() const override;
bool hasActiveDynamicProperties() const override;
bool writeXml( QDomElement& collectionElem, QDomDocument& doc, const QMap< int, QString >& propertyNameMap ) const override;
bool writeXml( QDomElement& collectionElem, QDomDocument& doc, const QgsPropertyDefinition& propertyNameMap ) const override;
bool readXml( const QDomElement& collectionElem, const QDomDocument& doc, const QMap<int, QString> &propertyNameMap ) override;
/**
@ -399,7 +415,7 @@ class CORE_EXPORT QgsPropertyCollectionStack : public QgsAbstractPropertyCollect
QSet<int> propertyKeys() const override;
bool hasProperty( int key ) const override;
bool writeXml( QDomElement& collectionElem, QDomDocument& doc, const QMap< int, QString >& propertyNameMap ) const override;
bool writeXml( QDomElement& collectionElem, QDomDocument& doc, const QgsPropertyDefinition& propertyNameMap ) const override;
bool readXml( const QDomElement& collectionElem, const QDomDocument& doc, const QMap<int, QString> &propertyNameMap ) override;
private:

View File

@ -42,9 +42,9 @@ class QgsTextLabelFeature : public QgsLabelFeature
void calculateInfo( bool curvedLabeling, QFontMetricsF* fm, const QgsMapToPixel* xform, double maxinangle, double maxoutangle );
//! Get data-defined values
const QMap< QgsPalLayerSettings::DataDefinedProperties, QVariant >& dataDefinedValues() const { return mDataDefinedValues; }
const QMap< QgsPalLayerSettings::Property, QVariant >& dataDefinedValues() const { return mDataDefinedValues; }
//! Set data-defined values
void setDataDefinedValues( const QMap< QgsPalLayerSettings::DataDefinedProperties, QVariant >& values ) { mDataDefinedValues = values; }
void setDataDefinedValues( const QMap< QgsPalLayerSettings::Property, QVariant >& values ) { mDataDefinedValues = values; }
//! Set font to be used for rendering
void setDefinedFont( const QFont& f ) { mDefinedFont = f; }
@ -62,7 +62,7 @@ class QgsTextLabelFeature : public QgsLabelFeature
//! Metrics of the font for rendering
QFontMetricsF* mFontMetrics;
//! Stores attribute values for data defined properties
QMap< QgsPalLayerSettings::DataDefinedProperties, QVariant > mDataDefinedValues;
QMap< QgsPalLayerSettings::Property, QVariant > mDataDefinedValues;
};

View File

@ -220,21 +220,11 @@ QgsLabelFeature* QgsVectorLayerDiagramProvider::registerDiagram( QgsFeature& fea
}
// data defined show diagram? check this before doing any other processing
if ( mSettings.properties().hasProperty( QgsDiagramLayerSettings::Show )
&& mSettings.properties().property( QgsDiagramLayerSettings::Show )->isActive() )
{
bool show = mSettings.properties().valueAsInt( QgsDiagramLayerSettings::Show, context.expressionContext(), true );
if ( !show )
return nullptr;
}
if ( !mSettings.properties().valueAsBool( QgsDiagramLayerSettings::Show, context.expressionContext(), true ) )
return nullptr;
// data defined obstacle?
bool isObstacle = mSettings.isObstacle();
if ( mSettings.properties().hasProperty( QgsDiagramLayerSettings::IsObstacle )
&& mSettings.properties().property( QgsDiagramLayerSettings::IsObstacle )->isActive() )
{
isObstacle = mSettings.properties().valueAsInt( QgsDiagramLayerSettings::IsObstacle, context.expressionContext(), isObstacle );
}
bool isObstacle = mSettings.properties().valueAsBool( QgsDiagramLayerSettings::IsObstacle, context.expressionContext(), mSettings.isObstacle() );
//convert geom to geos
QgsGeometry geom = feat.geometry();
@ -289,12 +279,8 @@ QgsLabelFeature* QgsVectorLayerDiagramProvider::registerDiagram( QgsFeature& fea
// feature to the layer
bool alwaysShow = mSettings.showAllDiagrams();
if ( mSettings.properties().hasProperty( QgsDiagramLayerSettings::AlwaysShow )
&& mSettings.properties().property( QgsDiagramLayerSettings::AlwaysShow )->isActive() )
{
context.expressionContext().setOriginalValueVariable( alwaysShow );
alwaysShow = mSettings.properties().valueAsInt( QgsDiagramLayerSettings::AlwaysShow, context.expressionContext(), alwaysShow );
}
context.expressionContext().setOriginalValueVariable( alwaysShow );
alwaysShow = mSettings.properties().valueAsBool( QgsDiagramLayerSettings::AlwaysShow, context.expressionContext(), alwaysShow );
// new style data defined position
bool ddPos = false;

View File

@ -177,26 +177,9 @@ bool QgsVectorLayerLabelProvider::prepare( const QgsRenderContext& context, QSet
attributeNames.insert( lyr.fieldName );
}
lyr.properties().prepare( context.expressionContext() );
// add field indices of data defined expression or field
QMap< QgsPalLayerSettings::DataDefinedProperties, QgsDataDefined* >::const_iterator dIt = lyr.dataDefinedProperties.constBegin();
for ( ; dIt != lyr.dataDefinedProperties.constEnd(); ++dIt )
{
QgsDataDefined* dd = dIt.value();
if ( !dd->isActive() )
{
continue;
}
// this will return columns for expressions or field name, depending upon what is set to be used
// this also prepares any expressions, too
QSet<QString> cols = dd->referencedColumns( context.expressionContext() );
//QgsDebugMsgLevel( QString( "Data defined referenced columns:" ) + cols.join( "," ), 4 );
Q_FOREACH ( const QString& name, cols )
{
attributeNames.insert( name );
}
}
attributeNames.unite( lyr.properties().referencedFields( context.expressionContext() ) );
}
// NOW INITIALIZE QgsPalLayerSettings
@ -389,7 +372,7 @@ void QgsVectorLayerLabelProvider::drawLabel( QgsRenderContext& context, pal::Lab
QgsPalLayerSettings tmpLyr( mSettings );
// apply any previously applied data defined settings for the label
const QMap< QgsPalLayerSettings::DataDefinedProperties, QVariant >& ddValues = lf->dataDefinedValues();
const QMap< QgsPalLayerSettings::Property, QVariant >& ddValues = lf->dataDefinedValues();
//font
QFont dFont = lf->definedFont();

View File

@ -180,6 +180,11 @@ QgsAbstractProperty* QgsDataDefinedButtonV2::toProperty()
return p;
}
void QgsDataDefinedButtonV2::registerCheckedWidget( QWidget* widget )
{
//TODO
}
void QgsDataDefinedButtonV2::mouseReleaseEvent( QMouseEvent *event )
{
// Ctrl-click to toggle activated state

View File

@ -39,6 +39,7 @@ class GUI_EXPORT QgsDataDefinedButtonV2: public QToolButton
{
Q_OBJECT
Q_PROPERTY( QString usageInfo READ usageInfo WRITE setUsageInfo )
Q_PROPERTY( bool active READ isActive WRITE setActive )
public:
@ -82,6 +83,11 @@ class GUI_EXPORT QgsDataDefinedButtonV2: public QToolButton
QgsAbstractProperty* toProperty();
/**
* Returns true if the button has an active property.
*/
bool isActive() const { return mActive; }
/**
* The valid data types that will work for the definition (QVariant-coercible to expected type)
* Compared against the variant type of the QgsField from data source and expression result
@ -103,6 +109,11 @@ class GUI_EXPORT QgsDataDefinedButtonV2: public QToolButton
*/
void setUsageInfo( const QString& info ) { mUsageInfo = info; updateGui(); }
/**
* Register a sibling widget that get checked when data definition or expression is active
*/
void registerCheckedWidget( QWidget* widget );
//! Callback function for retrieving the expression context for the button
typedef QgsExpressionContext( *ExpressionContextCallback )( const void* context );

View File

@ -518,7 +518,7 @@ void QgsTextFormatWidget::setWidgetMode( QgsTextFormatWidget::Mode mode )
void QgsTextFormatWidget::toggleDDButtons( bool visible )
{
Q_FOREACH ( QgsDataDefinedButton* button, findChildren< QgsDataDefinedButton* >() )
Q_FOREACH ( QgsDataDefinedButtonV2* button, findChildren< QgsDataDefinedButtonV2* >() )
{
button->setVisible( visible );
}
@ -544,10 +544,9 @@ void QgsTextFormatWidget::connectValueChanged( const QList<QWidget *>& widgets,
{
Q_FOREACH ( QWidget* widget, widgets )
{
if ( QgsDataDefinedButton* w = qobject_cast<QgsDataDefinedButton*>( widget ) )
if ( QgsDataDefinedButtonV2* w = qobject_cast<QgsDataDefinedButtonV2*>( widget ) )
{
connect( w, SIGNAL( dataDefinedActivated( bool ) ), this, slot );
connect( w, SIGNAL( dataDefinedChanged( QString ) ), this, slot );
connect( w, SIGNAL( changed() ), this, slot );
}
else if ( QgsFieldExpressionWidget* w = qobject_cast< QgsFieldExpressionWidget*>( widget ) )
{

View File

@ -810,7 +810,7 @@
</widget>
</item>
<item>
<widget class="QgsDataDefinedButton" name="mFontUnderlineDDBtn">
<widget class="QgsDataDefinedButtonV2" name="mFontUnderlineDDBtn">
<property name="text">
<string>...</string>
</property>
@ -851,7 +851,7 @@
</widget>
</item>
<item>
<widget class="QgsDataDefinedButton" name="mFontStrikeoutDDBtn">
<widget class="QgsDataDefinedButtonV2" name="mFontStrikeoutDDBtn">
<property name="text">
<string>...</string>
</property>
@ -905,7 +905,7 @@
</widget>
</item>
<item>
<widget class="QgsDataDefinedButton" name="mFontBoldDDBtn">
<widget class="QgsDataDefinedButtonV2" name="mFontBoldDDBtn">
<property name="text">
<string>...</string>
</property>
@ -1034,42 +1034,42 @@ font-style: italic;</string>
</widget>
</item>
<item row="3" column="2">
<widget class="QgsDataDefinedButton" name="mFontStyleDDBtn">
<widget class="QgsDataDefinedButtonV2" name="mFontStyleDDBtn">
<property name="text">
<string>...</string>
</property>
</widget>
</item>
<item row="5" column="2">
<widget class="QgsDataDefinedButton" name="mFontSizeDDBtn">
<widget class="QgsDataDefinedButtonV2" name="mFontSizeDDBtn">
<property name="text">
<string>...</string>
</property>
</widget>
</item>
<item row="13" column="2">
<widget class="QgsDataDefinedButton" name="mFontBlendModeDDBtn">
<widget class="QgsDataDefinedButtonV2" name="mFontBlendModeDDBtn">
<property name="text">
<string>...</string>
</property>
</widget>
</item>
<item row="4" column="2">
<widget class="QgsDataDefinedButton" name="mFontItalicDDBtn">
<widget class="QgsDataDefinedButtonV2" name="mFontItalicDDBtn">
<property name="text">
<string>...</string>
</property>
</widget>
</item>
<item row="7" column="2">
<widget class="QgsDataDefinedButton" name="mFontColorDDBtn">
<widget class="QgsDataDefinedButtonV2" name="mFontColorDDBtn">
<property name="text">
<string>...</string>
</property>
</widget>
</item>
<item row="11" column="2">
<widget class="QgsDataDefinedButton" name="mFontLetterSpacingDDBtn">
<widget class="QgsDataDefinedButtonV2" name="mFontLetterSpacingDDBtn">
<property name="text">
<string>...</string>
</property>
@ -1083,7 +1083,7 @@ font-style: italic;</string>
</widget>
</item>
<item row="9" column="2">
<widget class="QgsDataDefinedButton" name="mFontCaseDDBtn">
<widget class="QgsDataDefinedButtonV2" name="mFontCaseDDBtn">
<property name="text">
<string>...</string>
</property>
@ -1097,7 +1097,7 @@ font-style: italic;</string>
</widget>
</item>
<item row="6" column="2">
<widget class="QgsDataDefinedButton" name="mFontUnitsDDBtn">
<widget class="QgsDataDefinedButtonV2" name="mFontUnitsDDBtn">
<property name="text">
<string>...</string>
</property>
@ -1133,7 +1133,7 @@ font-style: italic;</string>
</widget>
</item>
<item row="1" column="2">
<widget class="QgsDataDefinedButton" name="mFontDDBtn">
<widget class="QgsDataDefinedButtonV2" name="mFontDDBtn">
<property name="text">
<string>...</string>
</property>
@ -1153,7 +1153,7 @@ font-style: italic;</string>
</widget>
</item>
<item row="8" column="2">
<widget class="QgsDataDefinedButton" name="mFontTranspDDBtn">
<widget class="QgsDataDefinedButtonV2" name="mFontTranspDDBtn">
<property name="text">
<string>...</string>
</property>
@ -1241,7 +1241,7 @@ font-style: italic;</string>
</widget>
</item>
<item row="12" column="2">
<widget class="QgsDataDefinedButton" name="mFontWordSpacingDDBtn">
<widget class="QgsDataDefinedButtonV2" name="mFontWordSpacingDDBtn">
<property name="text">
<string>...</string>
</property>
@ -1491,7 +1491,7 @@ font-style: italic;</string>
<number>0</number>
</property>
<item row="0" column="2">
<widget class="QgsDataDefinedButton" name="mWrapCharDDBtn">
<widget class="QgsDataDefinedButtonV2" name="mWrapCharDDBtn">
<property name="text">
<string>...</string>
</property>
@ -1508,7 +1508,7 @@ font-style: italic;</string>
</widget>
</item>
<item row="1" column="2">
<widget class="QgsDataDefinedButton" name="mFontLineHeightDDBtn">
<widget class="QgsDataDefinedButtonV2" name="mFontLineHeightDDBtn">
<property name="text">
<string>...</string>
</property>
@ -1613,7 +1613,7 @@ font-style: italic;</string>
</widget>
</item>
<item row="2" column="2">
<widget class="QgsDataDefinedButton" name="mFontMultiLineAlignDDBtn">
<widget class="QgsDataDefinedButtonV2" name="mFontMultiLineAlignDDBtn">
<property name="text">
<string>...</string>
</property>
@ -1656,7 +1656,7 @@ font-style: italic;</string>
</spacer>
</item>
<item row="0" column="1">
<widget class="QgsDataDefinedButton" name="mDirectSymbDDBtn">
<widget class="QgsDataDefinedButtonV2" name="mDirectSymbDDBtn">
<property name="text">
<string>...</string>
</property>
@ -1747,14 +1747,14 @@ font-style: italic;</string>
</widget>
</item>
<item row="2" column="2">
<widget class="QgsDataDefinedButton" name="mDirectSymbPlacementDDBtn">
<widget class="QgsDataDefinedButtonV2" name="mDirectSymbPlacementDDBtn">
<property name="text">
<string>...</string>
</property>
</widget>
</item>
<item row="0" column="2">
<widget class="QgsDataDefinedButton" name="mDirectSymbLeftDDBtn">
<widget class="QgsDataDefinedButtonV2" name="mDirectSymbLeftDDBtn">
<property name="text">
<string>...</string>
</property>
@ -1801,7 +1801,7 @@ font-style: italic;</string>
</widget>
</item>
<item row="1" column="2">
<widget class="QgsDataDefinedButton" name="mDirectSymbRightDDBtn">
<widget class="QgsDataDefinedButtonV2" name="mDirectSymbRightDDBtn">
<property name="text">
<string>...</string>
</property>
@ -1858,7 +1858,7 @@ font-style: italic;</string>
</widget>
</item>
<item row="3" column="2">
<widget class="QgsDataDefinedButton" name="mDirectSymbRevDDBtn">
<widget class="QgsDataDefinedButtonV2" name="mDirectSymbRevDDBtn">
<property name="text">
<string>...</string>
</property>
@ -1956,7 +1956,7 @@ font-style: italic;</string>
</widget>
</item>
<item row="0" column="1">
<widget class="QgsDataDefinedButton" name="mFormatNumDDBtn">
<widget class="QgsDataDefinedButtonV2" name="mFormatNumDDBtn">
<property name="text">
<string>...</string>
</property>
@ -2004,7 +2004,7 @@ font-style: italic;</string>
</widget>
</item>
<item row="0" column="2">
<widget class="QgsDataDefinedButton" name="mFormatNumDecimalsDDBtn">
<widget class="QgsDataDefinedButtonV2" name="mFormatNumDecimalsDDBtn">
<property name="text">
<string>...</string>
</property>
@ -2021,7 +2021,7 @@ font-style: italic;</string>
</widget>
</item>
<item row="1" column="2">
<widget class="QgsDataDefinedButton" name="mFormatNumPlusSignDDBtn">
<widget class="QgsDataDefinedButtonV2" name="mFormatNumPlusSignDDBtn">
<property name="text">
<string>...</string>
</property>
@ -2098,7 +2098,7 @@ font-style: italic;</string>
<item>
<layout class="QGridLayout" name="gridLayout_36">
<item row="1" column="1">
<widget class="QgsDataDefinedButton" name="mBufferDrawDDBtn">
<widget class="QgsDataDefinedButtonV2" name="mBufferDrawDDBtn">
<property name="text">
<string>...</string>
</property>
@ -2146,14 +2146,14 @@ font-style: italic;</string>
<number>0</number>
</property>
<item row="1" column="2">
<widget class="QgsDataDefinedButton" name="mBufferUnitsDDBtn">
<widget class="QgsDataDefinedButtonV2" name="mBufferUnitsDDBtn">
<property name="text">
<string>...</string>
</property>
</widget>
</item>
<item row="6" column="2">
<widget class="QgsDataDefinedButton" name="mBufferBlendModeDDBtn">
<widget class="QgsDataDefinedButtonV2" name="mBufferBlendModeDDBtn">
<property name="text">
<string>...</string>
</property>
@ -2309,14 +2309,14 @@ font-style: italic;</string>
</widget>
</item>
<item row="4" column="2">
<widget class="QgsDataDefinedButton" name="mBufferTranspDDBtn">
<widget class="QgsDataDefinedButtonV2" name="mBufferTranspDDBtn">
<property name="text">
<string>...</string>
</property>
</widget>
</item>
<item row="5" column="2">
<widget class="QgsDataDefinedButton" name="mBufferJoinStyleDDBtn">
<widget class="QgsDataDefinedButtonV2" name="mBufferJoinStyleDDBtn">
<property name="text">
<string>...</string>
</property>
@ -2348,14 +2348,14 @@ font-style: italic;</string>
</widget>
</item>
<item row="0" column="2">
<widget class="QgsDataDefinedButton" name="mBufferSizeDDBtn">
<widget class="QgsDataDefinedButtonV2" name="mBufferSizeDDBtn">
<property name="text">
<string>...</string>
</property>
</widget>
</item>
<item row="2" column="2">
<widget class="QgsDataDefinedButton" name="mBufferColorDDBtn">
<widget class="QgsDataDefinedButtonV2" name="mBufferColorDDBtn">
<property name="text">
<string>...</string>
</property>
@ -2510,7 +2510,7 @@ font-style: italic;</string>
</widget>
</item>
<item row="1" column="1">
<widget class="QgsDataDefinedButton" name="mShapeDrawDDBtn">
<widget class="QgsDataDefinedButtonV2" name="mShapeDrawDDBtn">
<property name="text">
<string>...</string>
</property>
@ -2591,7 +2591,7 @@ font-style: italic;</string>
</widget>
</item>
<item row="17" column="2">
<widget class="QgsDataDefinedButton" name="mShapeFillColorDDBtn">
<widget class="QgsDataDefinedButtonV2" name="mShapeFillColorDDBtn">
<property name="text">
<string>...</string>
</property>
@ -2620,21 +2620,21 @@ font-style: italic;</string>
</widget>
</item>
<item row="5" column="2">
<widget class="QgsDataDefinedButton" name="mShapeSizeUnitsDDBtn">
<widget class="QgsDataDefinedButtonV2" name="mShapeSizeUnitsDDBtn">
<property name="text">
<string>...</string>
</property>
</widget>
</item>
<item row="19" column="2">
<widget class="QgsDataDefinedButton" name="mShapeBorderWidthDDBtn">
<widget class="QgsDataDefinedButtonV2" name="mShapeBorderWidthDDBtn">
<property name="text">
<string>...</string>
</property>
</widget>
</item>
<item row="18" column="2">
<widget class="QgsDataDefinedButton" name="mShapeBorderColorDDBtn">
<widget class="QgsDataDefinedButtonV2" name="mShapeBorderColorDDBtn">
<property name="text">
<string>...</string>
</property>
@ -2660,7 +2660,7 @@ font-style: italic;</string>
</widget>
</item>
<item row="15" column="2">
<widget class="QgsDataDefinedButton" name="mShapeBlendModeDDBtn">
<widget class="QgsDataDefinedButtonV2" name="mShapeBlendModeDDBtn">
<property name="text">
<string>...</string>
</property>
@ -2713,7 +2713,7 @@ font-style: italic;</string>
</widget>
</item>
<item row="21" column="2">
<widget class="QgsDataDefinedButton" name="mShapePenStyleDDBtn">
<widget class="QgsDataDefinedButtonV2" name="mShapePenStyleDDBtn">
<property name="text">
<string>...</string>
</property>
@ -2772,7 +2772,7 @@ font-style: italic;</string>
</layout>
</item>
<item row="13" column="2">
<widget class="QgsDataDefinedButton" name="mShapeRadiusUnitsDDBtn">
<widget class="QgsDataDefinedButtonV2" name="mShapeRadiusUnitsDDBtn">
<property name="text">
<string>...</string>
</property>
@ -2789,7 +2789,7 @@ font-style: italic;</string>
</widget>
</item>
<item row="0" column="2">
<widget class="QgsDataDefinedButton" name="mShapeTypeDDBtn">
<widget class="QgsDataDefinedButtonV2" name="mShapeTypeDDBtn">
<property name="text">
<string>...</string>
</property>
@ -2844,7 +2844,7 @@ font-style: italic;</string>
</widget>
</item>
<item row="11" column="2">
<widget class="QgsDataDefinedButton" name="mShapeOffsetUnitsDDBtn">
<widget class="QgsDataDefinedButtonV2" name="mShapeOffsetUnitsDDBtn">
<property name="text">
<string>...</string>
</property>
@ -2864,7 +2864,7 @@ font-style: italic;</string>
</widget>
</item>
<item row="4" column="2">
<widget class="QgsDataDefinedButton" name="mShapeSizeYDDBtn">
<widget class="QgsDataDefinedButtonV2" name="mShapeSizeYDDBtn">
<property name="text">
<string>...</string>
</property>
@ -2907,7 +2907,7 @@ font-style: italic;</string>
</widget>
</item>
<item row="3" column="2">
<widget class="QgsDataDefinedButton" name="mShapeSizeXDDBtn">
<widget class="QgsDataDefinedButtonV2" name="mShapeSizeXDDBtn">
<property name="text">
<string>...</string>
</property>
@ -2928,7 +2928,7 @@ font-style: italic;</string>
</widget>
</item>
<item row="2" column="2">
<widget class="QgsDataDefinedButton" name="mShapeSizeTypeDDBtn">
<widget class="QgsDataDefinedButtonV2" name="mShapeSizeTypeDDBtn">
<property name="text">
<string>...</string>
</property>
@ -2989,7 +2989,7 @@ font-style: italic;</string>
</widget>
</item>
<item row="7" column="2">
<widget class="QgsDataDefinedButton" name="mShapeRotationTypeDDBtn">
<widget class="QgsDataDefinedButtonV2" name="mShapeRotationTypeDDBtn">
<property name="text">
<string>...</string>
</property>
@ -3021,7 +3021,7 @@ font-style: italic;</string>
</widget>
</item>
<item>
<widget class="QgsDataDefinedButton" name="mShapeSVGPathDDBtn">
<widget class="QgsDataDefinedButtonV2" name="mShapeSVGPathDDBtn">
<property name="text">
<string>...</string>
</property>
@ -3031,7 +3031,7 @@ font-style: italic;</string>
</widget>
</item>
<item row="14" column="2">
<widget class="QgsDataDefinedButton" name="mShapeTranspDDBtn">
<widget class="QgsDataDefinedButtonV2" name="mShapeTranspDDBtn">
<property name="text">
<string>...</string>
</property>
@ -3081,14 +3081,14 @@ font-style: italic;</string>
</layout>
</item>
<item row="20" column="2">
<widget class="QgsDataDefinedButton" name="mShapeBorderUnitsDDBtn">
<widget class="QgsDataDefinedButtonV2" name="mShapeBorderUnitsDDBtn">
<property name="text">
<string>...</string>
</property>
</widget>
</item>
<item row="8" column="2">
<widget class="QgsDataDefinedButton" name="mShapeRotationDDBtn">
<widget class="QgsDataDefinedButtonV2" name="mShapeRotationDDBtn">
<property name="text">
<string>...</string>
</property>
@ -3147,7 +3147,7 @@ font-style: italic;</string>
</layout>
</item>
<item row="12" column="2">
<widget class="QgsDataDefinedButton" name="mShapeRadiusDDBtn">
<widget class="QgsDataDefinedButtonV2" name="mShapeRadiusDDBtn">
<property name="text">
<string>...</string>
</property>
@ -3215,7 +3215,7 @@ font-style: italic;</string>
</layout>
</item>
<item row="9" column="2">
<widget class="QgsDataDefinedButton" name="mShapeOffsetDDBtn">
<widget class="QgsDataDefinedButtonV2" name="mShapeOffsetDDBtn">
<property name="text">
<string>...</string>
</property>
@ -3346,7 +3346,7 @@ font-style: italic;</string>
</widget>
</item>
<item row="1" column="1">
<widget class="QgsDataDefinedButton" name="mShadowDrawDDBtn">
<widget class="QgsDataDefinedButtonV2" name="mShadowDrawDDBtn">
<property name="text">
<string>...</string>
</property>
@ -3651,70 +3651,70 @@ font-style: italic;</string>
</layout>
</item>
<item row="0" column="2">
<widget class="QgsDataDefinedButton" name="mShadowUnderDDBtn">
<widget class="QgsDataDefinedButtonV2" name="mShadowUnderDDBtn">
<property name="text">
<string>...</string>
</property>
</widget>
</item>
<item row="1" column="2">
<widget class="QgsDataDefinedButton" name="mShadowOffsetAngleDDBtn">
<widget class="QgsDataDefinedButtonV2" name="mShadowOffsetAngleDDBtn">
<property name="text">
<string>...</string>
</property>
</widget>
</item>
<item row="2" column="2">
<widget class="QgsDataDefinedButton" name="mShadowOffsetDDBtn">
<widget class="QgsDataDefinedButtonV2" name="mShadowOffsetDDBtn">
<property name="text">
<string>...</string>
</property>
</widget>
</item>
<item row="3" column="2">
<widget class="QgsDataDefinedButton" name="mShadowOffsetUnitsDDBtn">
<widget class="QgsDataDefinedButtonV2" name="mShadowOffsetUnitsDDBtn">
<property name="text">
<string>...</string>
</property>
</widget>
</item>
<item row="5" column="2">
<widget class="QgsDataDefinedButton" name="mShadowRadiusDDBtn">
<widget class="QgsDataDefinedButtonV2" name="mShadowRadiusDDBtn">
<property name="text">
<string>...</string>
</property>
</widget>
</item>
<item row="6" column="2">
<widget class="QgsDataDefinedButton" name="mShadowRadiusUnitsDDBtn">
<widget class="QgsDataDefinedButtonV2" name="mShadowRadiusUnitsDDBtn">
<property name="text">
<string>...</string>
</property>
</widget>
</item>
<item row="8" column="2">
<widget class="QgsDataDefinedButton" name="mShadowTranspDDBtn">
<widget class="QgsDataDefinedButtonV2" name="mShadowTranspDDBtn">
<property name="text">
<string>...</string>
</property>
</widget>
</item>
<item row="9" column="2">
<widget class="QgsDataDefinedButton" name="mShadowScaleDDBtn">
<widget class="QgsDataDefinedButtonV2" name="mShadowScaleDDBtn">
<property name="text">
<string>...</string>
</property>
</widget>
</item>
<item row="10" column="2">
<widget class="QgsDataDefinedButton" name="mShadowColorDDBtn">
<widget class="QgsDataDefinedButtonV2" name="mShadowColorDDBtn">
<property name="text">
<string>...</string>
</property>
</widget>
</item>
<item row="11" column="2">
<widget class="QgsDataDefinedButton" name="mShadowBlendDDBtn">
<widget class="QgsDataDefinedButtonV2" name="mShadowBlendDDBtn">
<property name="text">
<string>...</string>
</property>
@ -4225,7 +4225,7 @@ font-style: italic;</string>
</widget>
</item>
<item row="0" column="3">
<widget class="QgsDataDefinedButton" name="mCentroidDDBtn">
<widget class="QgsDataDefinedButtonV2" name="mCentroidDDBtn">
<property name="text">
<string>...</string>
</property>
@ -4301,14 +4301,14 @@ font-style: italic;</string>
</widget>
</item>
<item row="0" column="2">
<widget class="QgsDataDefinedButton" name="mLineDistanceDDBtn">
<widget class="QgsDataDefinedButtonV2" name="mLineDistanceDDBtn">
<property name="text">
<string>...</string>
</property>
</widget>
</item>
<item row="1" column="2">
<widget class="QgsDataDefinedButton" name="mLineDistanceUnitDDBtn">
<widget class="QgsDataDefinedButtonV2" name="mLineDistanceUnitDDBtn">
<property name="text">
<string>...</string>
</property>
@ -4392,7 +4392,7 @@ font-style: italic;</string>
<number>0</number>
</property>
<item row="0" column="2">
<widget class="QgsDataDefinedButton" name="mPointQuadOffsetDDBtn">
<widget class="QgsDataDefinedButtonV2" name="mPointQuadOffsetDDBtn">
<property name="text">
<string>...</string>
</property>
@ -4679,7 +4679,7 @@ font-style: italic;</string>
<number>0</number>
</property>
<item row="0" column="2">
<widget class="QgsDataDefinedButton" name="mPointPositionOrderDDBtn">
<widget class="QgsDataDefinedButtonV2" name="mPointPositionOrderDDBtn">
<property name="text">
<string>...</string>
</property>
@ -4794,14 +4794,14 @@ font-style: italic;</string>
</widget>
</item>
<item row="0" column="3">
<widget class="QgsDataDefinedButton" name="mPointOffsetDDBtn">
<widget class="QgsDataDefinedButtonV2" name="mPointOffsetDDBtn">
<property name="text">
<string>...</string>
</property>
</widget>
</item>
<item row="1" column="3">
<widget class="QgsDataDefinedButton" name="mPointOffsetUnitsDDBtn">
<widget class="QgsDataDefinedButtonV2" name="mPointOffsetUnitsDDBtn">
<property name="text">
<string>...</string>
</property>
@ -4924,7 +4924,7 @@ font-style: italic;</string>
</widget>
</item>
<item row="0" column="2">
<widget class="QgsDataDefinedButton" name="mPointAngleDDBtn">
<widget class="QgsDataDefinedButtonV2" name="mPointAngleDDBtn">
<property name="text">
<string>...</string>
</property>
@ -4984,7 +4984,7 @@ font-style: italic;</string>
</widget>
</item>
<item row="0" column="2">
<widget class="QgsDataDefinedButton" name="mRepeatDistanceDDBtn">
<widget class="QgsDataDefinedButtonV2" name="mRepeatDistanceDDBtn">
<property name="text">
<string>...</string>
</property>
@ -4998,7 +4998,7 @@ font-style: italic;</string>
</widget>
</item>
<item row="1" column="2">
<widget class="QgsDataDefinedButton" name="mRepeatDistanceUnitDDBtn">
<widget class="QgsDataDefinedButtonV2" name="mRepeatDistanceUnitDDBtn">
<property name="text">
<string>...</string>
</property>
@ -5071,7 +5071,7 @@ font-style: italic;</string>
</widget>
</item>
<item row="1" column="5">
<widget class="QgsDataDefinedButton" name="mMaxCharAngleDDBtn">
<widget class="QgsDataDefinedButtonV2" name="mMaxCharAngleDDBtn">
<property name="text">
<string>...</string>
</property>
@ -5169,7 +5169,7 @@ font-style: italic;</string>
</widget>
</item>
<item>
<widget class="QgsDataDefinedButton" name="mCoordXDDBtn">
<widget class="QgsDataDefinedButtonV2" name="mCoordXDDBtn">
<property name="text">
<string>...</string>
</property>
@ -5189,7 +5189,7 @@ font-style: italic;</string>
</widget>
</item>
<item>
<widget class="QgsDataDefinedButton" name="mCoordYDDBtn">
<widget class="QgsDataDefinedButtonV2" name="mCoordYDDBtn">
<property name="text">
<string>...</string>
</property>
@ -5234,7 +5234,7 @@ font-style: italic;</string>
<item row="2" column="1">
<layout class="QHBoxLayout" name="horizontalLayout_25">
<item>
<widget class="QgsDataDefinedButton" name="mCoordRotationDDBtn">
<widget class="QgsDataDefinedButtonV2" name="mCoordRotationDDBtn">
<property name="text">
<string>...</string>
</property>
@ -5287,7 +5287,7 @@ font-style: italic;</string>
</widget>
</item>
<item>
<widget class="QgsDataDefinedButton" name="mCoordAlignmentHDDBtn">
<widget class="QgsDataDefinedButtonV2" name="mCoordAlignmentHDDBtn">
<property name="text">
<string>...</string>
</property>
@ -5307,7 +5307,7 @@ font-style: italic;</string>
</widget>
</item>
<item>
<widget class="QgsDataDefinedButton" name="mCoordAlignmentVDDBtn">
<widget class="QgsDataDefinedButtonV2" name="mCoordAlignmentVDDBtn">
<property name="text">
<string>...</string>
</property>
@ -5381,7 +5381,7 @@ font-style: italic;</string>
</widget>
</item>
<item>
<widget class="QgsDataDefinedButton" name="mPriorityDDBtn">
<widget class="QgsDataDefinedButtonV2" name="mPriorityDDBtn">
<property name="text">
<string>...</string>
</property>
@ -5491,7 +5491,7 @@ font-style: italic;</string>
</widget>
</item>
<item row="0" column="1">
<widget class="QgsDataDefinedButton" name="mScaleBasedVisibilityDDBtn">
<widget class="QgsDataDefinedButtonV2" name="mScaleBasedVisibilityDDBtn">
<property name="text">
<string>...</string>
</property>
@ -5557,7 +5557,7 @@ font-style: italic;</string>
</widget>
</item>
<item row="0" column="1">
<widget class="QgsDataDefinedButton" name="mScaleBasedVisibilityMinDDBtn">
<widget class="QgsDataDefinedButtonV2" name="mScaleBasedVisibilityMinDDBtn">
<property name="text">
<string>...</string>
</property>
@ -5592,7 +5592,7 @@ font-style: italic;</string>
</widget>
</item>
<item row="1" column="1">
<widget class="QgsDataDefinedButton" name="mScaleBasedVisibilityMaxDDBtn">
<widget class="QgsDataDefinedButtonV2" name="mScaleBasedVisibilityMaxDDBtn">
<property name="text">
<string>...</string>
</property>
@ -5622,7 +5622,7 @@ font-style: italic;</string>
</widget>
</item>
<item row="0" column="1">
<widget class="QgsDataDefinedButton" name="mFontLimitPixelDDBtn">
<widget class="QgsDataDefinedButtonV2" name="mFontLimitPixelDDBtn">
<property name="text">
<string>...</string>
</property>
@ -5694,7 +5694,7 @@ font-style: italic;</string>
</widget>
</item>
<item row="0" column="1">
<widget class="QgsDataDefinedButton" name="mFontMinPixelDDBtn">
<widget class="QgsDataDefinedButtonV2" name="mFontMinPixelDDBtn">
<property name="text">
<string>...</string>
</property>
@ -5732,7 +5732,7 @@ font-style: italic;</string>
</widget>
</item>
<item row="1" column="1">
<widget class="QgsDataDefinedButton" name="mFontMaxPixelDDBtn">
<widget class="QgsDataDefinedButtonV2" name="mFontMaxPixelDDBtn">
<property name="text">
<string>...</string>
</property>
@ -5773,7 +5773,7 @@ font-style: italic;</string>
</widget>
</item>
<item>
<widget class="QgsDataDefinedButton" name="mZIndexDDBtn">
<widget class="QgsDataDefinedButtonV2" name="mZIndexDDBtn">
<property name="text">
<string>...</string>
</property>
@ -5839,14 +5839,14 @@ font-style: italic;</string>
</spacer>
</item>
<item row="1" column="2">
<widget class="QgsDataDefinedButton" name="mShowLabelDDBtn">
<widget class="QgsDataDefinedButtonV2" name="mShowLabelDDBtn">
<property name="text">
<string>...</string>
</property>
</widget>
</item>
<item row="1" column="5">
<widget class="QgsDataDefinedButton" name="mAlwaysShowDDBtn">
<widget class="QgsDataDefinedButtonV2" name="mAlwaysShowDDBtn">
<property name="text">
<string>...</string>
</property>
@ -6209,7 +6209,7 @@ font-style: italic;</string>
</widget>
</item>
<item>
<widget class="QgsDataDefinedButton" name="mIsObstacleDDBtn">
<widget class="QgsDataDefinedButtonV2" name="mIsObstacleDDBtn">
<property name="text">
<string>...</string>
</property>
@ -6285,7 +6285,7 @@ font-style: italic;</string>
</widget>
</item>
<item>
<widget class="QgsDataDefinedButton" name="mObstacleFactorDDBtn">
<widget class="QgsDataDefinedButtonV2" name="mObstacleFactorDDBtn">
<property name="text">
<string>...</string>
</property>
@ -6440,9 +6440,9 @@ font-style: italic;</string>
<container>1</container>
</customwidget>
<customwidget>
<class>QgsDataDefinedButton</class>
<class>QgsDataDefinedButtonV2</class>
<extends>QToolButton</extends>
<header>qgsdatadefinedbutton.h</header>
<header>qgsdatadefinedbuttonv2.h</header>
</customwidget>
<customwidget>
<class>QgsDoubleSpinBox</class>

View File

@ -237,7 +237,8 @@ void TestQgsLabelingEngine::testRuleBased()
s2.placement = QgsPalLayerSettings::OverPoint;
s2.quadOffset = QgsPalLayerSettings::QuadrantBelowRight;
s2.displayAll = true;
s2.setDataDefinedProperty( QgsPalLayerSettings::Size, true, true, QStringLiteral( "18" ), QString() );
s2.properties().setProperty( QgsPalLayerSettings::Size, new QgsStaticProperty( QStringLiteral( "18" ) ) );
root->appendChild( new QgsRuleBasedLabeling::Rule( new QgsPalLayerSettings( s2 ), 0, 0, QStringLiteral( "Class = 'Jet'" ) ) );
@ -311,8 +312,8 @@ void TestQgsLabelingEngine::zOrder()
pls1.setFormat( format );
//use data defined coloring and font size so that stacking order of labels can be determined
pls1.setDataDefinedProperty( QgsPalLayerSettings::Color, true, true, QStringLiteral( "case when \"Class\"='Jet' then '#ff5500' when \"Class\"='B52' then '#00ffff' else '#ff00ff' end" ), QString() );
pls1.setDataDefinedProperty( QgsPalLayerSettings::Size, true, true, QStringLiteral( "case when \"Class\"='Jet' then 100 when \"Class\"='B52' then 30 else 50 end" ), QString() );
pls1.properties().setProperty( QgsPalLayerSettings::Color, new QgsExpressionBasedProperty( QStringLiteral( "case when \"Class\"='Jet' then '#ff5500' when \"Class\"='B52' then '#00ffff' else '#ff00ff' end" ) ) );
pls1.properties().setProperty( QgsPalLayerSettings::Size, new QgsExpressionBasedProperty( QStringLiteral( "case when \"Class\"='Jet' then 100 when \"Class\"='B52' then 30 else 50 end" ) ) );
QgsVectorLayerLabelProvider* provider1 = new QgsVectorLayerLabelProvider( vl, QString(), true, &pls1 );
QgsLabelingEngine engine;
@ -329,7 +330,7 @@ void TestQgsLabelingEngine::zOrder()
img = job.renderedImage();
//test data defined z-index
pls1.setDataDefinedProperty( QgsPalLayerSettings::ZIndex, true, true, QStringLiteral( "case when \"Class\"='Jet' then 3 when \"Class\"='B52' then 1 else 2 end" ), QString() );
pls1.properties().setProperty( QgsPalLayerSettings::ZIndex, new QgsExpressionBasedProperty( QStringLiteral( "case when \"Class\"='Jet' then 3 when \"Class\"='B52' then 1 else 2 end" ) ) );
provider1 = new QgsVectorLayerLabelProvider( vl, QString(), true, &pls1 );
engine.addProvider( provider1 );
p.begin( &img );
@ -341,7 +342,7 @@ void TestQgsLabelingEngine::zOrder()
QVERIFY( imageCheck( "label_order_zindex", img, 20 ) );
img = job.renderedImage();
pls1.removeAllDataDefinedProperties();
pls1.properties().clear();
format = pls1.format();
format.setColor( QColor( 255, 50, 100 ) );
format.setSize( 30 );
@ -386,7 +387,7 @@ void TestQgsLabelingEngine::zOrder()
//try mixing layer order and z-index
engine.removeProvider( provider1 );
pls1.setDataDefinedProperty( QgsPalLayerSettings::ZIndex, true, true, QStringLiteral( "if(\"Class\"='Jet',3,0)" ), QString() );
pls1.properties().setProperty( QgsPalLayerSettings::ZIndex, new QgsExpressionBasedProperty( QStringLiteral( "if(\"Class\"='Jet',3,0)" ) ) );
provider1 = new QgsVectorLayerLabelProvider( vl, QString(), true, &pls1 );
engine.addProvider( provider1 );

View File

@ -190,6 +190,44 @@ void TestQgsProperty::conversions()
i1->setStaticValue( "i am not a int" ); //not a int, should return default value
QCOMPARE( i1->valueAsInt( context, -11 ), -11 );
QCOMPARE( collection.valueAsInt( 2, context, -11 ), -11 );
// test boolean conversions
QgsStaticProperty* b1 = new QgsStaticProperty( QVariant(), true );
collection.setProperty( 3, b1 );
QCOMPARE( b1->valueAsBool( context , false ), false );
QCOMPARE( b1->valueAsBool( context , true ), true );
QCOMPARE( collection.valueAsBool( 3, context , false ), false );
QCOMPARE( collection.valueAsBool( 3, context , true ), true );
b1->setStaticValue( true );
QCOMPARE( b1->valueAsBool( context , false ), true );
QCOMPARE( b1->valueAsBool( context , true ), true );
QCOMPARE( collection.valueAsBool( 3, context , false ), true );
QCOMPARE( collection.valueAsBool( 3, context , true ), true );
b1->setStaticValue( false );
QCOMPARE( b1->valueAsBool( context , false ), false );
QCOMPARE( b1->valueAsBool( context , true ), false );
QCOMPARE( collection.valueAsBool( 3, context , false ), false );
QCOMPARE( collection.valueAsBool( 3, context , true ), false );
b1->setStaticValue( 1 );
QCOMPARE( b1->valueAsBool( context , false ), true );
QCOMPARE( b1->valueAsBool( context , true ), true );
QCOMPARE( collection.valueAsBool( 3, context , false ), true );
QCOMPARE( collection.valueAsBool( 3, context , true ), true );
b1->setStaticValue( 0 );
QCOMPARE( b1->valueAsBool( context , false ), false );
QCOMPARE( b1->valueAsBool( context , true ), false );
QCOMPARE( collection.valueAsBool( 3, context , false ), false );
QCOMPARE( collection.valueAsBool( 3, context , true ), false );
b1->setStaticValue( "true" );
QCOMPARE( b1->valueAsBool( context , false ), true );
QCOMPARE( b1->valueAsBool( context , true ), true );
QCOMPARE( collection.valueAsBool( 3, context , false ), true );
QCOMPARE( collection.valueAsBool( 3, context , true ), true );
b1->setStaticValue( "" );
QCOMPARE( b1->valueAsBool( context , false ), false );
QCOMPARE( b1->valueAsBool( context , true ), false );
QCOMPARE( collection.valueAsBool( 3, context , false ), false );
QCOMPARE( collection.valueAsBool( 3, context , true ), false );
}
void TestQgsProperty::staticProperty()