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 class QgsLabelPosition
{ {
%TypeHeaderCode %TypeHeaderCode
@ -239,7 +159,7 @@ class QgsPalLayerSettings
}; };
// update mDataDefinedNames QMap in constructor when adding/deleting enum value // update mDataDefinedNames QMap in constructor when adding/deleting enum value
enum DataDefinedProperties enum Property
{ {
// text style // text style
Size, Size,
@ -507,67 +427,24 @@ class QgsPalLayerSettings
*/ */
QDomElement writeXml( QDomDocument& doc ); QDomElement writeXml( QDomDocument& doc );
/** Get a data defined property pointer /** Returns a reference to the label's property collection, used for data defined overrides.
* @note helpful for Python access * @note added in QGIS 3.0
* @see setProperties()
*/ */
QgsDataDefined* dataDefinedProperty( QgsPalLayerSettings::DataDefinedProperties p ); QgsPropertyCollection& properties();
/** Set a property as data defined /** Returns a reference to the label's property collection, used for data defined overrides.
* @note helpful for Python access * @note added in QGIS 3.0
* @see setProperties()
*/ */
void setDataDefinedProperty( QgsPalLayerSettings::DataDefinedProperties p, //const QgsPropertyCollection& properties() const { return mProperties; }
bool active, bool useExpr, const QString& expr, const QString& field );
/** Set a property to static instead data defined */ /** Sets the label's property collection, used for data defined overrides.
void removeDataDefinedProperty( QgsPalLayerSettings::DataDefinedProperties p ); * @param collection property collection. Existing properties will be replaced.
* @note added in QGIS 3.0
/** Clear all data-defined properties * @see properties()
* @note added in QGIS 2.12
*/ */
void removeAllDataDefinedProperties(); void setProperties( const QgsPropertyCollection& collection );
/** 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;
/** Returns the label text formatting settings, e.g., font settings, buffer settings, etc. /** Returns the label text formatting settings, e.g., font settings, buffer settings, etc.
* @see setFormat() * @see setFormat()
@ -737,23 +614,23 @@ class QgsPalLabeling
protected: protected:
// update temporary QgsPalLayerSettings with any data defined text style values // update temporary QgsPalLayerSettings with any data defined text style values
void dataDefinedTextStyle( QgsPalLayerSettings& tmpLyr, 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 // update temporary QgsPalLayerSettings with any data defined text formatting values
void dataDefinedTextFormatting( QgsPalLayerSettings& tmpLyr, 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 // update temporary QgsPalLayerSettings with any data defined text buffer values
void dataDefinedTextBuffer( QgsPalLayerSettings& tmpLyr, 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 // update temporary QgsPalLayerSettings with any data defined shape background values
void dataDefinedShapeBackground( QgsPalLayerSettings& tmpLyr, 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 // update temporary QgsPalLayerSettings with any data defined drop shadow values
void dataDefinedDropShadow( QgsPalLayerSettings& tmpLyr, void dataDefinedDropShadow( QgsPalLayerSettings& tmpLyr,
const QMap< QgsPalLayerSettings::DataDefinedProperties, QVariant >& ddValues ); const QMap< QgsPalLayerSettings::Property, QVariant >& ddValues );
void deleteTemporaryData(); void deleteTemporaryData();

View File

@ -123,6 +123,17 @@ class QgsAbstractProperty
*/ */
int valueAsInt( const QgsExpressionContext& context, int defaultValue = 0 ) const; 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 /** Writes the current state of the property into an XML element
* @param propertyElem destination element for the property's state * @param propertyElem destination element for the property's state
* @param doc DOM document * @param doc DOM document

View File

@ -1,3 +1,5 @@
typedef QMap< int, QString > QgsPropertyDefinition;
/** /**
* \ingroup core * \ingroup core
* \class QgsAbstractPropertyCollection * \class QgsAbstractPropertyCollection
@ -126,6 +128,20 @@ class QgsAbstractPropertyCollection
*/ */
int valueAsInt( int key, const QgsExpressionContext& context, int defaultValue = 0 ) const; 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 * 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. * 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. * to avoid writing the raw integer key values to XML, for readability and future-proofness.
* @see readXML() * @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. * Reads property collection state from an XML element.
@ -178,7 +194,7 @@ class QgsAbstractPropertyCollection
* the propertyNameMap specified when writeXML() was called. * the propertyNameMap specified when writeXML() was called.
* @see writeXML() * @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 isActive( int key ) const;
bool hasActiveProperties() const; bool hasActiveProperties() const;
bool hasActiveDynamicProperties() const; bool hasActiveDynamicProperties() const;
bool writeXml( QDomElement& collectionElem, QDomDocument& doc, const QMap< int, QString >& propertyNameMap ) const; bool writeXml( QDomElement& collectionElem, QDomDocument& doc, const QgsPropertyDefinition& propertyNameMap ) const;
bool readXml( const QDomElement& collectionElem, const QDomDocument& doc, const QMap<int, QString> &propertyNameMap ); bool readXml( const QDomElement& collectionElem, const QDomDocument& doc, const QgsPropertyDefinition& propertyNameMap );
/** Adds a property to the collection and takes ownership of it. /** 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 * @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; QSet<int> propertyKeys() const;
bool hasProperty( int key ) const; bool hasProperty( int key ) const;
bool writeXml( QDomElement& collectionElem, QDomDocument& doc, const QMap< int, QString >& propertyNameMap ) const; bool writeXml( QDomElement& collectionElem, QDomDocument& doc, const QgsPropertyDefinition& propertyNameMap ) const;
bool readXml( const QDomElement& collectionElem, const QDomDocument& doc, const QMap<int, QString> &propertyNameMap ); bool readXml( const QDomElement& collectionElem, const QDomDocument& doc, const QgsPropertyDefinition &propertyNameMap );
}; };

View File

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

View File

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

View File

@ -20,6 +20,7 @@
#include "qgspallabeling.h" #include "qgspallabeling.h"
#include "qgstextformatwidget.h" #include "qgstextformatwidget.h"
#include "qgsdatadefinedbuttonv2.h"
#include "qgis_app.h" #include "qgis_app.h"
class APP_EXPORT QgsLabelingGui : public QgsTextFormatWidget, private QgsExpressionContextGenerator class APP_EXPORT QgsLabelingGui : public QgsTextFormatWidget, private QgsExpressionContextGenerator
@ -51,18 +52,23 @@ class APP_EXPORT QgsLabelingGui : public QgsTextFormatWidget, private QgsExpress
protected: protected:
void blockInitSignals( bool block ); void blockInitSignals( bool block );
void syncDefinedCheckboxFrame( QgsDataDefinedButton* ddBtn, QCheckBox* chkBx, QFrame* f ); void syncDefinedCheckboxFrame( QgsDataDefinedButtonV2* 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 );
private: private:
QgsVectorLayer* mLayer; QgsVectorLayer* mLayer;
const QgsPalLayerSettings* mSettings; const QgsPalLayerSettings* mSettings;
QgsPropertyCollection mProperties;
LabelMode mMode; LabelMode mMode;
QgsExpressionContext createExpressionContext() const override; 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 #endif // QGSLABELINGGUI_H

View File

@ -25,7 +25,7 @@
#include "qgisapp.h" #include "qgisapp.h"
#include "qgsmapcanvas.h" #include "qgsmapcanvas.h"
#include "qgsvectorlayerlabeling.h" #include "qgsvectorlayerlabeling.h"
#include "qgsproperty.h"
#include <QColorDialog> #include <QColorDialog>
#include <QFontDatabase> #include <QFontDatabase>
#include <QSettings> #include <QSettings>
@ -49,8 +49,6 @@ QgsLabelPropertyDialog::~QgsLabelPropertyDialog()
{ {
QSettings settings; QSettings settings;
settings.setValue( QStringLiteral( "/Windows/ChangeLabelProps/geometry" ), saveGeometry() ); settings.setValue( QStringLiteral( "/Windows/ChangeLabelProps/geometry" ), saveGeometry() );
qDeleteAll( mDataDefinedProperties );
} }
void QgsLabelPropertyDialog::on_buttonBox_clicked( QAbstractButton *button ) void QgsLabelPropertyDialog::on_buttonBox_clicked( QAbstractButton *button )
@ -153,14 +151,10 @@ void QgsLabelPropertyDialog::init( const QString& layerId, const QString& provid
disableGuiElements(); disableGuiElements();
QMap< QgsPalLayerSettings::DataDefinedProperties, QgsDataDefined* >::const_iterator it = layerSettings.dataDefinedProperties.constBegin(); mDataDefinedProperties = layerSettings.properties();
for ( ; it != layerSettings.dataDefinedProperties.constEnd(); ++it )
{
mDataDefinedProperties.insert( it.key(), it.value() ? new QgsDataDefined( *it.value() ) : nullptr );
}
//set widget values from data defined results //set widget values from data defined results
setDataDefinedValues( layerSettings, vlayer ); setDataDefinedValues( vlayer );
//enable widgets connected to data defined fields //enable widgets connected to data defined fields
enableDataDefinedWidgets( vlayer ); enableDataDefinedWidgets( vlayer );
@ -215,7 +209,7 @@ void QgsLabelPropertyDialog::blockElementSignals( bool block )
mRotationSpinBox->blockSignals( 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 //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 //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 ); << QgsExpressionContextUtils::layerScope( vlayer );
context.setFeature( mCurLabelFeat ); context.setFeature( mCurLabelFeat );
QMap< QgsPalLayerSettings::DataDefinedProperties, QgsDataDefined* >::const_iterator propIt = mDataDefinedProperties.constBegin(); Q_FOREACH ( int key, mDataDefinedProperties.propertyKeys() )
for ( ; propIt != mDataDefinedProperties.constEnd(); ++propIt )
{ {
QgsDataDefined* dd = propIt.value(); if ( !mDataDefinedProperties.isActive( key ) )
if ( !dd || !dd->isActive() )
{
continue; continue;
}
if ( !dd->expressionIsPrepared() )
{
dd->prepareExpression( context );
}
//TODO - pass expression 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() ) if ( !result.isValid() || result.isNull() )
{ {
//could not evaluate data defined value //could not evaluate data defined value
@ -252,7 +237,7 @@ void QgsLabelPropertyDialog::setDataDefinedValues( const QgsPalLayerSettings &la
} }
bool ok = false; bool ok = false;
switch ( propIt.key() ) switch ( key )
{ {
case QgsPalLayerSettings::Show: 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 //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 //this can only be done for properties which are assigned to fields
QMap< QgsPalLayerSettings::DataDefinedProperties, QgsDataDefined* >::const_iterator propIt = mDataDefinedProperties.constBegin(); Q_FOREACH ( int key, mDataDefinedProperties.propertyKeys() )
for ( ; propIt != mDataDefinedProperties.constEnd(); ++propIt )
{ {
QgsDataDefined* dd = propIt.value(); QgsAbstractProperty* prop = mDataDefinedProperties.property( key );
if ( !dd ) if ( !prop || !prop->isActive() || prop->propertyType() != QgsAbstractProperty::FieldBasedProperty )
{
continue;
}
QString ddField = dd->field();
if ( !dd->isActive() || dd->useExpression() || ddField.isEmpty() )
{ {
continue; // can only modify attributes with an active data definition of a mapped field 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 ); int ddIndx = vlayer->fields().lookupField( ddField );
if ( ddIndx == -1 ) if ( ddIndx == -1 )
{ {
@ -384,7 +369,7 @@ void QgsLabelPropertyDialog::enableDataDefinedWidgets( QgsVectorLayer* vlayer )
QgsDebugMsg( QString( "ddField: %1" ).arg( ddField ) ); QgsDebugMsg( QString( "ddField: %1" ).arg( ddField ) );
switch ( propIt.key() ) switch ( key )
{ {
case QgsPalLayerSettings::Show: case QgsPalLayerSettings::Show:
mShowLabelChkbx->setEnabled( true ); 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 ( mDataDefinedProperties.isActive( p ) )
if ( ddIt != mDataDefinedProperties.constEnd() )
{ {
QgsDataDefined* dd = ddIt.value(); QgsAbstractProperty* prop = mDataDefinedProperties.property( p );
if ( prop->propertyType() == QgsAbstractProperty::FieldBasedProperty )
if ( dd && dd->isActive() && !dd->useExpression() && !dd->field().isEmpty() )
{ {
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 //! Block / unblock all input element signals
void blockElementSignals( bool block ); void blockElementSignals( bool block );
void setDataDefinedValues( const QgsPalLayerSettings &layerSettings, QgsVectorLayer* vlayer ); void setDataDefinedValues( QgsVectorLayer* vlayer );
void enableDataDefinedWidgets( QgsVectorLayer* vlayer ); void enableDataDefinedWidgets( QgsVectorLayer* vlayer );
//! Updates font when family or style is updated //! Updates font when family or style is updated
@ -87,10 +87,10 @@ class APP_EXPORT QgsLabelPropertyDialog: public QDialog, private Ui::QgsLabelPro
void fillValiComboBox(); void fillValiComboBox();
//! Insert changed value into mChangedProperties //! Insert changed value into mChangedProperties
void insertChangedValue( QgsPalLayerSettings::DataDefinedProperties p, const QVariant& value ); void insertChangedValue( QgsPalLayerSettings::Property p, const QVariant& value );
QgsAttributeMap mChangedProperties; QgsAttributeMap mChangedProperties;
QMap< QgsPalLayerSettings::DataDefinedProperties, QgsDataDefined* > mDataDefinedProperties; QgsPropertyCollection mDataDefinedProperties;
QFont mLabelFont; QFont mLabelFont;
QFontDatabase mFontDB; QFontDatabase mFontDB;

View File

@ -409,23 +409,19 @@ bool QgsMapToolLabel::hasDataDefinedColumn( QgsPalLayerSettings::DataDefinedProp
} }
#endif #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 ); const QgsAbstractProperty* prop = labelSettings.properties().property( p );
if ( dIt != labelSettings.dataDefinedProperties.constEnd() ) if ( prop->propertyType() != QgsAbstractProperty::FieldBasedProperty )
{ return QString();
QgsDataDefined* dd = dIt.value();
// can only modify attributes that are data defined with a mapped field return static_cast< const QgsFieldBasedProperty* >( prop )->field();
if ( dd->isActive() && !dd->useExpression() && !dd->field().isEmpty() )
return dd->field();
}
return QString();
} }
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 ); QString fieldname = dataDefinedColumnName( p, labelSettings );
if ( !fieldname.isEmpty() ) if ( !fieldname.isEmpty() )

View File

@ -117,11 +117,11 @@ class APP_EXPORT QgsMapToolLabel: public QgsMapTool
QFont currentLabelFont(); QFont currentLabelFont();
//! Returns a data defined attribute column name for particular property or empty string if not defined //! 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 /** Returns a data defined attribute column index
@return -1 if column does not exist or an expression is used instead */ @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 //! Returns whether to preserve predefined rotation data during label pin/unpin operations
bool currentLabelPreserveRotation(); bool currentLabelPreserveRotation();

View File

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

View File

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

View File

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

File diff suppressed because it is too large Load Diff

View File

@ -38,6 +38,7 @@
#include "qgsmapunitscale.h" #include "qgsmapunitscale.h"
#include "qgsstringutils.h" #include "qgsstringutils.h"
#include "qgstextrenderer.h" #include "qgstextrenderer.h"
#include "qgspropertycollection.h"
namespace pal namespace pal
{ {
@ -261,7 +262,7 @@ class CORE_EXPORT QgsPalLayerSettings
//! Data definable properties. //! Data definable properties.
// update sPropertyNameMap QMap in constructor when adding/deleting enum value // update sPropertyNameMap QMap in constructor when adding/deleting enum value
enum DataDefinedProperties enum Property
{ {
// text style // text style
Size = 0, //!< Label size Size = 0, //!< Label size
@ -529,61 +530,24 @@ class CORE_EXPORT QgsPalLayerSettings
*/ */
QDomElement writeXml( QDomDocument& doc ); QDomElement writeXml( QDomDocument& doc );
/** Get a data defined property pointer /** Returns a reference to the label's property collection, used for data defined overrides.
* @note helpful for Python access * @note added in QGIS 3.0
* @see setProperties()
*/ */
QgsDataDefined* dataDefinedProperty( QgsPalLayerSettings::DataDefinedProperties p ); QgsPropertyCollection& properties() { return mProperties; }
/** Set a property as data defined /** Returns a reference to the label's property collection, used for data defined overrides.
* @note helpful for Python access * @note added in QGIS 3.0
* @see setProperties()
*/ */
void setDataDefinedProperty( QgsPalLayerSettings::DataDefinedProperties p, const QgsPropertyCollection& properties() const { return mProperties; }
bool active, bool useExpr, const QString& expr, const QString& field );
//! Set a property to static instead data defined /** Sets the label's property collection, used for data defined overrides.
void removeDataDefinedProperty( QgsPalLayerSettings::DataDefinedProperties p ); * @param collection property collection. Existing properties will be replaced.
* @note added in QGIS 3.0
/** Clear all data-defined properties * @see properties()
* @note added in QGIS 2.12
*/ */
void removeAllDataDefinedProperties(); void setProperties( const QgsPropertyCollection& collection ) { mProperties = collection; }
/** 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;
/** Returns the label text formatting settings, e.g., font settings, buffer settings, etc. /** Returns the label text formatting settings, e.g., font settings, buffer settings, etc.
* @see setFormat() * @see setFormat()
@ -614,16 +578,15 @@ class CORE_EXPORT QgsPalLayerSettings
private: private:
void readDataDefinedPropertyMap( QgsVectorLayer* layer, QDomElement* parentElem, /**
QMap < QgsPalLayerSettings::DataDefinedProperties, * Reads data defined properties from a QGIS 2.x project.
QgsDataDefined* > & propertyMap ); */
void writeDataDefinedPropertyMap( QgsVectorLayer* layer, QDomElement* parentElem, void readOldDataDefinedPropertyMap( QgsVectorLayer* layer, QDomElement* parentElem );
const QMap < QgsPalLayerSettings::DataDefinedProperties,
QgsDataDefined* > & propertyMap ); /**
void readDataDefinedProperty( QgsVectorLayer* layer, * Reads a data defined property from a QGIS 2.x project.
QgsPalLayerSettings::DataDefinedProperties p, */
QMap < QgsPalLayerSettings::DataDefinedProperties, void readOldDataDefinedProperty( QgsVectorLayer* layer, QgsPalLayerSettings::Property p );
QgsDataDefined* > & propertyMap );
enum DataDefinedValueType enum DataDefinedValueType
{ {
@ -644,7 +607,7 @@ class CORE_EXPORT QgsPalLayerSettings
// convenience data defined evaluation function // convenience data defined evaluation function
bool dataDefinedValEval( DataDefinedValueType valType, bool dataDefinedValEval( DataDefinedValueType valType,
QgsPalLayerSettings::DataDefinedProperties p, QgsPalLayerSettings::Property p,
QVariant& exprVal, QgsExpressionContext &context, const QVariant& originalValue = QVariant() ); QVariant& exprVal, QgsExpressionContext &context, const QVariant& originalValue = QVariant() );
void parseTextStyle( QFont& labelFont, void parseTextStyle( QFont& labelFont,
@ -667,14 +630,18 @@ class CORE_EXPORT QgsPalLayerSettings
*/ */
void registerObstacleFeature( QgsFeature &f, QgsRenderContext &context, QgsLabelFeature** obstacleFeature, QgsGeometry* obstacleGeometry = nullptr ); 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; QgsExpression* expression;
QFontDatabase mFontDB; QFontDatabase mFontDB;
QgsTextFormat mFormat; QgsTextFormat mFormat;
static const QMap< int, QString > sPropertyNameMap; static const QgsPropertyDefinition sPropertyNameMap;
static const QVector< PredefinedPointPosition > DEFAULT_PLACEMENT_ORDER; static const QVector< PredefinedPointPosition > DEFAULT_PLACEMENT_ORDER;
}; };
@ -821,23 +788,23 @@ class CORE_EXPORT QgsPalLabeling
protected: protected:
// update temporary QgsPalLayerSettings with any data defined text style values // update temporary QgsPalLayerSettings with any data defined text style values
static void dataDefinedTextStyle( QgsPalLayerSettings& tmpLyr, 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 // update temporary QgsPalLayerSettings with any data defined text formatting values
static void dataDefinedTextFormatting( QgsPalLayerSettings& tmpLyr, 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 // update temporary QgsPalLayerSettings with any data defined text buffer values
static void dataDefinedTextBuffer( QgsPalLayerSettings& tmpLyr, 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 // update temporary QgsPalLayerSettings with any data defined shape background values
static void dataDefinedShapeBackground( QgsPalLayerSettings& tmpLyr, 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 // update temporary QgsPalLayerSettings with any data defined drop shadow values
static void dataDefinedDropShadow( QgsPalLayerSettings& tmpLyr, 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 QgsVectorLayerLabelProvider; // to allow calling the static methods above
friend class QgsDxfExport; // 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; 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 bool QgsAbstractProperty::writeXml( QDomElement &propertyElem, QDomDocument &doc ) const
{ {
Q_UNUSED( doc ); Q_UNUSED( doc );

View File

@ -152,6 +152,17 @@ class CORE_EXPORT QgsAbstractProperty
*/ */
int valueAsInt( const QgsExpressionContext& context, int defaultValue = 0 ) const; 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 * Writes the current state of the property into an XML element
* @param propertyElem destination element for the property's state * @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 ); 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 bool QgsPropertyCollection::hasProperty( int key ) const
{ {
if ( mProperties.isEmpty() )
return false;
return mProperties.contains( key ); return mProperties.contains( key );
} }
QgsAbstractProperty* QgsPropertyCollection::property( int key ) QgsAbstractProperty* QgsPropertyCollection::property( int key )
{ {
if ( mProperties.isEmpty() )
return nullptr;
mDirty = true; mDirty = true;
return mProperties.value( key, nullptr ); return mProperties.value( key, nullptr );
} }
const QgsAbstractProperty *QgsPropertyCollection::property( int key ) const const QgsAbstractProperty *QgsPropertyCollection::property( int key ) const
{ {
if ( mProperties.isEmpty() )
return nullptr;
return mProperties.value( key, nullptr ); return mProperties.value( key, nullptr );
} }
QVariant QgsPropertyCollection::value( int key, const QgsExpressionContext& context, const QVariant& defaultValue ) const QVariant QgsPropertyCollection::value( int key, const QgsExpressionContext& context, const QVariant& defaultValue ) const
{ {
if ( mProperties.isEmpty() )
return defaultValue;
QgsAbstractProperty* prop = mProperties.value( key, nullptr ); QgsAbstractProperty* prop = mProperties.value( key, nullptr );
if ( !prop || !prop->isActive() ) if ( !prop || !prop->isActive() )
return defaultValue; return defaultValue;
@ -201,6 +222,9 @@ QSet< QString > QgsPropertyCollection::referencedFields( const QgsExpressionCont
bool QgsPropertyCollection::isActive( int key ) const bool QgsPropertyCollection::isActive( int key ) const
{ {
if ( mProperties.isEmpty() )
return false;
QgsAbstractProperty* prop = mProperties.value( key, nullptr ); QgsAbstractProperty* prop = mProperties.value( key, nullptr );
return prop && prop->isActive(); return prop && prop->isActive();
} }

View File

@ -25,6 +25,9 @@ class QgsAbstractProperty;
class QDomElement; class QDomElement;
class QDomDocument; class QDomDocument;
//! Definition of available properties
typedef QMap< int, QString > QgsPropertyDefinition;
/** /**
* \ingroup core * \ingroup core
* \class QgsAbstractPropertyCollection * \class QgsAbstractPropertyCollection
@ -141,6 +144,19 @@ class CORE_EXPORT QgsAbstractPropertyCollection
*/ */
int valueAsInt( int key, const QgsExpressionContext& context, int defaultValue = 0 ) const; 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 * 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. * 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. * to avoid writing the raw integer key values to XML, for readability and future-proofness.
* @see readXml() * @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. * 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 isActive( int key ) const override;
bool hasActiveProperties() const override; bool hasActiveProperties() const override;
bool hasActiveDynamicProperties() 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; 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; QSet<int> propertyKeys() const override;
bool hasProperty( int key ) 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; bool readXml( const QDomElement& collectionElem, const QDomDocument& doc, const QMap<int, QString> &propertyNameMap ) override;
private: private:

View File

@ -42,9 +42,9 @@ class QgsTextLabelFeature : public QgsLabelFeature
void calculateInfo( bool curvedLabeling, QFontMetricsF* fm, const QgsMapToPixel* xform, double maxinangle, double maxoutangle ); void calculateInfo( bool curvedLabeling, QFontMetricsF* fm, const QgsMapToPixel* xform, double maxinangle, double maxoutangle );
//! Get data-defined values //! 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 //! 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 //! Set font to be used for rendering
void setDefinedFont( const QFont& f ) { mDefinedFont = f; } void setDefinedFont( const QFont& f ) { mDefinedFont = f; }
@ -62,7 +62,7 @@ class QgsTextLabelFeature : public QgsLabelFeature
//! Metrics of the font for rendering //! Metrics of the font for rendering
QFontMetricsF* mFontMetrics; QFontMetricsF* mFontMetrics;
//! Stores attribute values for data defined properties //! 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 // data defined show diagram? check this before doing any other processing
if ( mSettings.properties().hasProperty( QgsDiagramLayerSettings::Show ) if ( !mSettings.properties().valueAsBool( QgsDiagramLayerSettings::Show, context.expressionContext(), true ) )
&& mSettings.properties().property( QgsDiagramLayerSettings::Show )->isActive() ) return nullptr;
{
bool show = mSettings.properties().valueAsInt( QgsDiagramLayerSettings::Show, context.expressionContext(), true );
if ( !show )
return nullptr;
}
// data defined obstacle? // data defined obstacle?
bool isObstacle = mSettings.isObstacle(); bool isObstacle = mSettings.properties().valueAsBool( QgsDiagramLayerSettings::IsObstacle, context.expressionContext(), mSettings.isObstacle() );
if ( mSettings.properties().hasProperty( QgsDiagramLayerSettings::IsObstacle )
&& mSettings.properties().property( QgsDiagramLayerSettings::IsObstacle )->isActive() )
{
isObstacle = mSettings.properties().valueAsInt( QgsDiagramLayerSettings::IsObstacle, context.expressionContext(), isObstacle );
}
//convert geom to geos //convert geom to geos
QgsGeometry geom = feat.geometry(); QgsGeometry geom = feat.geometry();
@ -289,12 +279,8 @@ QgsLabelFeature* QgsVectorLayerDiagramProvider::registerDiagram( QgsFeature& fea
// feature to the layer // feature to the layer
bool alwaysShow = mSettings.showAllDiagrams(); bool alwaysShow = mSettings.showAllDiagrams();
if ( mSettings.properties().hasProperty( QgsDiagramLayerSettings::AlwaysShow ) context.expressionContext().setOriginalValueVariable( alwaysShow );
&& mSettings.properties().property( QgsDiagramLayerSettings::AlwaysShow )->isActive() ) alwaysShow = mSettings.properties().valueAsBool( QgsDiagramLayerSettings::AlwaysShow, context.expressionContext(), alwaysShow );
{
context.expressionContext().setOriginalValueVariable( alwaysShow );
alwaysShow = mSettings.properties().valueAsInt( QgsDiagramLayerSettings::AlwaysShow, context.expressionContext(), alwaysShow );
}
// new style data defined position // new style data defined position
bool ddPos = false; bool ddPos = false;

View File

@ -177,26 +177,9 @@ bool QgsVectorLayerLabelProvider::prepare( const QgsRenderContext& context, QSet
attributeNames.insert( lyr.fieldName ); attributeNames.insert( lyr.fieldName );
} }
lyr.properties().prepare( context.expressionContext() );
// add field indices of data defined expression or field // add field indices of data defined expression or field
QMap< QgsPalLayerSettings::DataDefinedProperties, QgsDataDefined* >::const_iterator dIt = lyr.dataDefinedProperties.constBegin(); attributeNames.unite( lyr.properties().referencedFields( context.expressionContext() ) );
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 );
}
}
} }
// NOW INITIALIZE QgsPalLayerSettings // NOW INITIALIZE QgsPalLayerSettings
@ -389,7 +372,7 @@ void QgsVectorLayerLabelProvider::drawLabel( QgsRenderContext& context, pal::Lab
QgsPalLayerSettings tmpLyr( mSettings ); QgsPalLayerSettings tmpLyr( mSettings );
// apply any previously applied data defined settings for the label // 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 //font
QFont dFont = lf->definedFont(); QFont dFont = lf->definedFont();

View File

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

View File

@ -39,6 +39,7 @@ class GUI_EXPORT QgsDataDefinedButtonV2: public QToolButton
{ {
Q_OBJECT Q_OBJECT
Q_PROPERTY( QString usageInfo READ usageInfo WRITE setUsageInfo ) Q_PROPERTY( QString usageInfo READ usageInfo WRITE setUsageInfo )
Q_PROPERTY( bool active READ isActive WRITE setActive )
public: public:
@ -82,6 +83,11 @@ class GUI_EXPORT QgsDataDefinedButtonV2: public QToolButton
QgsAbstractProperty* toProperty(); 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) * 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 * 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(); } 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 //! Callback function for retrieving the expression context for the button
typedef QgsExpressionContext( *ExpressionContextCallback )( const void* context ); typedef QgsExpressionContext( *ExpressionContextCallback )( const void* context );

View File

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

View File

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

View File

@ -237,7 +237,8 @@ void TestQgsLabelingEngine::testRuleBased()
s2.placement = QgsPalLayerSettings::OverPoint; s2.placement = QgsPalLayerSettings::OverPoint;
s2.quadOffset = QgsPalLayerSettings::QuadrantBelowRight; s2.quadOffset = QgsPalLayerSettings::QuadrantBelowRight;
s2.displayAll = true; 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'" ) ) ); root->appendChild( new QgsRuleBasedLabeling::Rule( new QgsPalLayerSettings( s2 ), 0, 0, QStringLiteral( "Class = 'Jet'" ) ) );
@ -311,8 +312,8 @@ void TestQgsLabelingEngine::zOrder()
pls1.setFormat( format ); pls1.setFormat( format );
//use data defined coloring and font size so that stacking order of labels can be determined //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.properties().setProperty( QgsPalLayerSettings::Color, new QgsExpressionBasedProperty( QStringLiteral( "case when \"Class\"='Jet' then '#ff5500' when \"Class\"='B52' then '#00ffff' else '#ff00ff' end" ) ) );
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::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 ); QgsVectorLayerLabelProvider* provider1 = new QgsVectorLayerLabelProvider( vl, QString(), true, &pls1 );
QgsLabelingEngine engine; QgsLabelingEngine engine;
@ -329,7 +330,7 @@ void TestQgsLabelingEngine::zOrder()
img = job.renderedImage(); img = job.renderedImage();
//test data defined z-index //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 ); provider1 = new QgsVectorLayerLabelProvider( vl, QString(), true, &pls1 );
engine.addProvider( provider1 ); engine.addProvider( provider1 );
p.begin( &img ); p.begin( &img );
@ -341,7 +342,7 @@ void TestQgsLabelingEngine::zOrder()
QVERIFY( imageCheck( "label_order_zindex", img, 20 ) ); QVERIFY( imageCheck( "label_order_zindex", img, 20 ) );
img = job.renderedImage(); img = job.renderedImage();
pls1.removeAllDataDefinedProperties(); pls1.properties().clear();
format = pls1.format(); format = pls1.format();
format.setColor( QColor( 255, 50, 100 ) ); format.setColor( QColor( 255, 50, 100 ) );
format.setSize( 30 ); format.setSize( 30 );
@ -386,7 +387,7 @@ void TestQgsLabelingEngine::zOrder()
//try mixing layer order and z-index //try mixing layer order and z-index
engine.removeProvider( provider1 ); 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 ); provider1 = new QgsVectorLayerLabelProvider( vl, QString(), true, &pls1 );
engine.addProvider( provider1 ); 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 i1->setStaticValue( "i am not a int" ); //not a int, should return default value
QCOMPARE( i1->valueAsInt( context, -11 ), -11 ); QCOMPARE( i1->valueAsInt( context, -11 ), -11 );
QCOMPARE( collection.valueAsInt( 2, 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() void TestQgsProperty::staticProperty()