Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

improve GUI consistency & UX for data-defined style (fixes #9881) #1833

Closed
wants to merge 2 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions python/core/qgsdatadefined.sip
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,14 @@ class QgsDataDefined
const QString& expr = QString(),
const QString& field = QString() );

/**
* Construct a new data defined object, analyse the expression to determine
* if it's a simple field
*
* @param expression can be null
*/
QgsDataDefined( const QgsExpression * expression );

~QgsDataDefined();

/**Returns whether the data defined container is set to all the default
Expand Down
15 changes: 7 additions & 8 deletions python/gui/symbology-ng/qgssymbollayerv2widget.sip
Original file line number Diff line number Diff line change
Expand Up @@ -42,8 +42,8 @@ class QgsSimpleLineSymbolLayerV2Widget : QgsSymbolLayerV2Widget
void on_mPenWidthUnitWidget_changed();
void on_mOffsetUnitWidget_changed();
void on_mDashPatternUnitWidget_changed();
void on_mDataDefinedPropertiesButton_clicked();
void on_mDrawInsideCheckBox_stateChanged( int state );
void updateDataDefinedProperty();

protected:
//creates a new icon for the 'change pattern' button
Expand Down Expand Up @@ -77,11 +77,11 @@ class QgsSimpleMarkerSymbolLayerV2Widget : QgsSymbolLayerV2Widget
void on_mSizeUnitWidget_changed();
void on_mOffsetUnitWidget_changed();
void on_mOutlineWidthUnitWidget_changed();
void on_mDataDefinedPropertiesButton_clicked();
void on_mOutlineStyleComboBox_currentIndexChanged( int index );
void on_mOutlineWidthSpinBox_valueChanged( double d );
void on_mHorizontalAnchorComboBox_currentIndexChanged( int index );
void on_mVerticalAnchorComboBox_currentIndexChanged( int index );
void updateDataDefinedProperty();
};

///////////
Expand Down Expand Up @@ -110,7 +110,7 @@ class QgsSimpleFillSymbolLayerV2Widget : QgsSymbolLayerV2Widget
void offsetChanged();
void on_mBorderWidthUnitWidget_changed();
void on_mOffsetUnitWidget_changed();
void on_mDataDefinedPropertiesButton_clicked();
void updateDataDefinedProperty();
};


Expand Down Expand Up @@ -141,9 +141,9 @@ class QgsGradientFillSymbolLayerV2Widget : QgsSymbolLayerV2Widget
void offsetChanged();
void referencePointChanged();
void on_mOffsetUnitWidget_changed();
void on_mDataDefinedPropertiesButton_clicked();
void colorModeChanged();
void on_mSpinAngle_valueChanged( double value );
void updateDataDefinedProperty();
};

///////////
Expand Down Expand Up @@ -174,8 +174,8 @@ class QgsShapeburstFillSymbolLayerV2Widget : QgsSymbolLayerV2Widget
void on_mButtonEditRamp_clicked();
void offsetChanged();
void on_mOffsetUnitWidget_changed();
void on_mDataDefinedPropertiesButton_clicked();
void on_mIgnoreRingsCheckBox_stateChanged( int state );
void updateDataDefinedProperty();
};

///////////
Expand Down Expand Up @@ -204,8 +204,7 @@ class QgsMarkerLineSymbolLayerV2Widget : QgsSymbolLayerV2Widget
void on_mIntervalUnitWidget_changed();
void on_mOffsetUnitWidget_changed();
void on_mOffsetAlongLineUnitWidget_changed();
void on_mDataDefinedPropertiesButton_clicked();

void updateDataDefinedProperty();
};


Expand Down Expand Up @@ -241,9 +240,9 @@ class QgsSvgMarkerSymbolLayerV2Widget : QgsSymbolLayerV2Widget
void on_mSizeUnitWidget_changed();
void on_mBorderWidthUnitWidget_changed();
void on_mOffsetUnitWidget_changed();
void on_mDataDefinedPropertiesButton_clicked();
void on_mHorizontalAnchorComboBox_currentIndexChanged( int index );
void on_mVerticalAnchorComboBox_currentIndexChanged( int index );
void updateDataDefinedProperty();


protected:
Expand Down
10 changes: 10 additions & 0 deletions src/core/qgsdatadefined.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,16 @@ QgsDataDefined::QgsDataDefined( bool active,
mExpressionPrepared = false;
}

QgsDataDefined::QgsDataDefined( const QgsExpression * expression )
: mActive( bool( expression ) )
, mUseExpression( expression && expression->rootNode() && !dynamic_cast<const QgsExpression::NodeColumnRef*>( expression->rootNode() ) )
, mExpressionString( mUseExpression ? expression->dump() : "" )
, mField( !mUseExpression ? (expression ? expression->dump() : "") : "" )
{
mExpression = 0;
mExpressionPrepared = false;
}

QgsDataDefined::~QgsDataDefined()
{
mExpressionParams.clear();
Expand Down
8 changes: 8 additions & 0 deletions src/core/qgsdatadefined.h
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,14 @@ class CORE_EXPORT QgsDataDefined
const QString& expr = QString(),
const QString& field = QString() );

/**
* Construct a new data defined object, analyse the expression to determine
* if it's a simple field
*
* @param expression can be null
*/
explicit QgsDataDefined( const QgsExpression * expression );

~QgsDataDefined();

/**Returns whether the data defined container is set to all the default
Expand Down
2 changes: 1 addition & 1 deletion src/gui/qgsdatadefinedbutton.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -169,7 +169,7 @@ void QgsDataDefinedButton::init( const QgsVectorLayer* vl,
fieldType = tr( "string" );
break;
case QVariant::Int:
fieldMatch = mDataTypes.testFlag( Int );
fieldMatch = mDataTypes.testFlag( Int ) || mDataTypes.testFlag( Double );
fieldType = tr( "integer" );
break;
case QVariant::Double:
Expand Down
86 changes: 39 additions & 47 deletions src/gui/symbology-ng/qgsellipsesymbollayerv2widget.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,45 @@ void QgsEllipseSymbolLayerV2Widget::setSymbolLayer( QgsSymbolLayerV2* layer )
mHorizontalAnchorComboBox->setCurrentIndex( mLayer->horizontalAnchorPoint() );
mVerticalAnchorComboBox->setCurrentIndex( mLayer->verticalAnchorPoint() );
blockComboSignals( false );

mDataDefinedPropertyButtons.clear();

#define QGS_REGISTER_DATA_DEFINED_BUTTON( button, name, type, description )\
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@vmora I don't think this should be a macro - I can't see any benefit in implementing it this way, and it breaks things like Qt Creator's find/follow/etc. I'd prefer that this was a function in QgsSymbolLayerV2Widget.

{\
QgsDataDefined dd( mLayer->dataDefinedProperty( name ) );\
button->init( mVectorLayer, &dd, QgsDataDefinedButton::type, tr( description ) );\
mDataDefinedPropertyButtons.insert( name, button );\
}
QGS_REGISTER_DATA_DEFINED_BUTTON( mSymbolWidthDDBtn, "width", Double, "" )
QGS_REGISTER_DATA_DEFINED_BUTTON( mSymbolHeightDDBtn, "height", Double, "" )
QGS_REGISTER_DATA_DEFINED_BUTTON( mRotationDDBtn, "rotation", Double, "" )
QGS_REGISTER_DATA_DEFINED_BUTTON( mOutlineWidthDDBtn, "outline_width", Double, "" )
QGS_REGISTER_DATA_DEFINED_BUTTON( mFillColorDDBtn, "fill_color", String, "'red,green,blue,alpha' e.g. '255,0,0,255'" )
QGS_REGISTER_DATA_DEFINED_BUTTON( mBorderColorDDBtn, "outline_color", String, "'red,green,blue,alpha' e.g. '255,0,0,255'" )
QGS_REGISTER_DATA_DEFINED_BUTTON( mShapeDDBtn, "symbol_name", String, "'circle', 'rectangle', 'cross', 'triangle'" )
QGS_REGISTER_DATA_DEFINED_BUTTON( mOffsetDDBtn, "offset", String, "'x,y' e.g. '2,3.5'" )
QGS_REGISTER_DATA_DEFINED_BUTTON( mHorizontalAnchorDDBtn, "horizontal_anchor_point", String, "'left', 'center' or 'right'" )
QGS_REGISTER_DATA_DEFINED_BUTTON( mVerticalAnchorDDBtn, "vertical_anchor_point", String, "'top', 'center' or 'bottom'" )
#undef QGS_REGISTER_DATA_DEFINED_BUTTON

for (QMap< QString, QgsDataDefinedButton* >::const_iterator it
= mDataDefinedPropertyButtons.begin(); it != mDataDefinedPropertyButtons.end(); ++it )
{
connect( it.value(), SIGNAL( dataDefinedChanged( const QString& ) ), this, SLOT( updateDataDefinedProperty() ) );
connect( it.value(), SIGNAL( dataDefinedActivated( bool ) ), this, SLOT( updateDataDefinedProperty() ) );
}
}

void QgsEllipseSymbolLayerV2Widget::updateDataDefinedProperty()
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@vmora This should be in QgsSymbolLayerV2Widget to avoid the code duplication (it's implemented multiple times by this PR)

{
mLayer->removeDataDefinedProperties();
for (QMap< QString, QgsDataDefinedButton* >::const_iterator it
= mDataDefinedPropertyButtons.begin(); it != mDataDefinedPropertyButtons.end(); ++it )
{
if ( it.value()->isActive() )
mLayer->setDataDefinedProperty( it.key(), it.value()->currentDefinition() );
}
emit changed();
}

QgsSymbolLayerV2* QgsEllipseSymbolLayerV2Widget::symbolLayer()
Expand Down Expand Up @@ -273,53 +312,6 @@ void QgsEllipseSymbolLayerV2Widget::on_mVerticalAnchorComboBox_currentIndexChang
}
}

void QgsEllipseSymbolLayerV2Widget::on_mDataDefinedPropertiesButton_clicked()
{
if ( !mLayer )
{
return;
}

QList< QgsDataDefinedSymbolDialog::DataDefinedSymbolEntry > dataDefinedProperties;
dataDefinedProperties << QgsDataDefinedSymbolDialog::DataDefinedSymbolEntry( "width", tr( "Symbol width" ), mLayer->dataDefinedPropertyString( "width" ),
QgsDataDefinedSymbolDialog::doubleHelpText() );
dataDefinedProperties << QgsDataDefinedSymbolDialog::DataDefinedSymbolEntry( "height", tr( "Symbol height" ), mLayer->dataDefinedPropertyString( "height" ),
QgsDataDefinedSymbolDialog::doubleHelpText() );
dataDefinedProperties << QgsDataDefinedSymbolDialog::DataDefinedSymbolEntry( "rotation", tr( "Rotation" ), mLayer->dataDefinedPropertyString( "rotation" ),
QgsDataDefinedSymbolDialog::doubleHelpText() );
dataDefinedProperties << QgsDataDefinedSymbolDialog::DataDefinedSymbolEntry( "outline_width", tr( "Outline width" ), mLayer->dataDefinedPropertyString( "outline_width" ),
QgsDataDefinedSymbolDialog::doubleHelpText() );
dataDefinedProperties << QgsDataDefinedSymbolDialog::DataDefinedSymbolEntry( "fill_color", tr( "Fill color" ), mLayer->dataDefinedPropertyString( "fill_color" ),
QgsDataDefinedSymbolDialog::colorHelpText() );
dataDefinedProperties << QgsDataDefinedSymbolDialog::DataDefinedSymbolEntry( "outline_color", tr( "Border color" ), mLayer->dataDefinedPropertyString( "outline_color" ),
QgsDataDefinedSymbolDialog::colorHelpText() );
dataDefinedProperties << QgsDataDefinedSymbolDialog::DataDefinedSymbolEntry( "symbol_name", tr( "Symbol name" ), mLayer->dataDefinedPropertyString( "symbol_name" ),
"'circle'|'rectangle'|'cross'|'triangle'" );
dataDefinedProperties << QgsDataDefinedSymbolDialog::DataDefinedSymbolEntry( "offset", tr( "Offset" ), mLayer->dataDefinedPropertyString( "offset" ),
QgsDataDefinedSymbolDialog::offsetHelpText() );
dataDefinedProperties << QgsDataDefinedSymbolDialog::DataDefinedSymbolEntry( "horizontal_anchor_point", tr( "Horizontal anchor point" ), mLayer->dataDefinedPropertyString( "horizontal_anchor_point" ),
QgsDataDefinedSymbolDialog::horizontalAnchorHelpText() );
dataDefinedProperties << QgsDataDefinedSymbolDialog::DataDefinedSymbolEntry( "vertical_anchor_point", tr( "Vertical anchor point" ), mLayer->dataDefinedPropertyString( "vertical_anchor_point" ),
QgsDataDefinedSymbolDialog::verticalAnchorHelpText() );
QgsDataDefinedSymbolDialog d( dataDefinedProperties, mVectorLayer );
if ( d.exec() == QDialog::Accepted )
{
//empty all existing properties first
mLayer->removeDataDefinedProperties();

QMap<QString, QString> properties = d.dataDefinedProperties();
QMap<QString, QString>::const_iterator it = properties.constBegin();
for ( ; it != properties.constEnd(); ++it )
{
if ( !it.value().isEmpty() )
{
mLayer->setDataDefinedProperty( it.key(), it.value() );
}
}
emit changed();
}
}

void QgsEllipseSymbolLayerV2Widget::setOffset()
{
mLayer->setOffset( QPointF( spinOffsetX->value(), spinOffsetY->value() ) );
Expand Down
2 changes: 1 addition & 1 deletion src/gui/symbology-ng/qgsellipsesymbollayerv2widget.h
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ class GUI_EXPORT QgsEllipseSymbolLayerV2Widget: public QgsSymbolLayerV2Widget, p
void on_mOffsetUnitWidget_changed();
void on_mHorizontalAnchorComboBox_currentIndexChanged( int index );
void on_mVerticalAnchorComboBox_currentIndexChanged( int index );
void on_mDataDefinedPropertiesButton_clicked();
void updateDataDefinedProperty();

void setOffset();
};
Expand Down
Loading