[FEATURE][layouts] Data defined control over grid properties

Adds data defined control over layout map grid:
- enabled state
- interval X/Y
- offset X/Y
- frame size and margin
- annotation distance from frame
- cross size
- frame line thickness

Fixes #30246, fixes #27737
This commit is contained in:
Nyall Dawson 2019-08-21 18:52:09 +10:00
parent 4f330b6234
commit 658cb0c740
9 changed files with 629 additions and 467 deletions

View File

@ -864,6 +864,8 @@ Retrieves the second fill color for the grid frame.
virtual bool accept( QgsStyleEntityVisitorInterface *visitor ) const;
virtual void refresh();
public:
};

View File

@ -136,6 +136,14 @@ A base class for objects which belong to a layout.
MapLayers,
MapStylePreset,
MapLabelMargin,
MapGridEnabled,
MapGridIntervalX,
MapGridIntervalY,
MapGridOffsetX,
MapGridOffsetY,
MapGridFrameSize,
MapGridFrameMargin,
MapGridLabelDistance,
//composer picture
PictureSource,
PictureSvgBackgroundColor,

View File

@ -158,6 +158,15 @@ QgsLayoutMapGridWidget::QgsLayoutMapGridWidget( QgsLayoutItemMapGrid *mapGrid, Q
//set initial state of frame style controls
toggleFrameControls( false, false, false );
registerDataDefinedButton( mEnabledDDBtn, QgsLayoutObject::MapGridEnabled );
registerDataDefinedButton( mIntervalXDDBtn, QgsLayoutObject::MapGridIntervalX );
registerDataDefinedButton( mIntervalYDDBtn, QgsLayoutObject::MapGridIntervalY );
registerDataDefinedButton( mOffsetXDDBtn, QgsLayoutObject::MapGridOffsetX );
registerDataDefinedButton( mOffsetYDDBtn, QgsLayoutObject::MapGridOffsetY );
registerDataDefinedButton( mFrameSizeDDBtn, QgsLayoutObject::MapGridFrameSize );
registerDataDefinedButton( mFrameMarginDDBtn, QgsLayoutObject::MapGridFrameMargin );
registerDataDefinedButton( mLabelDistDDBtn, QgsLayoutObject::MapGridLabelDistance );
updateGuiElements();
blockAllSignals( false );
@ -179,7 +188,14 @@ QgsLayoutMapGridWidget::QgsLayoutMapGridWidget( QgsLayoutItemMapGrid *mapGrid, Q
void QgsLayoutMapGridWidget::populateDataDefinedButtons()
{
// none for now
updateDataDefinedButton( mEnabledDDBtn );
updateDataDefinedButton( mIntervalXDDBtn );
updateDataDefinedButton( mIntervalYDDBtn );
updateDataDefinedButton( mOffsetXDDBtn );
updateDataDefinedButton( mOffsetYDDBtn );
updateDataDefinedButton( mFrameSizeDDBtn );
updateDataDefinedButton( mFrameMarginDDBtn );
updateDataDefinedButton( mLabelDistDDBtn );
}
void QgsLayoutMapGridWidget::setGuiElementValues()

View File

@ -367,6 +367,8 @@ bool QgsLayoutItemMapGrid::readXml( const QDomElement &itemElem, const QDomDocum
mGridAnnotationPrecision = itemElem.attribute( QStringLiteral( "annotationPrecision" ), QStringLiteral( "3" ) ).toInt();
int gridUnitInt = itemElem.attribute( QStringLiteral( "unit" ), QString::number( MapUnit ) ).toInt();
mGridUnit = ( gridUnitInt <= static_cast< int >( CM ) ) ? static_cast< GridUnit >( gridUnitInt ) : MapUnit;
refreshDataDefinedProperties();
return ok;
}
@ -390,7 +392,7 @@ QPolygonF QgsLayoutItemMapGrid::scalePolygon( const QPolygonF &polygon, const do
void QgsLayoutItemMapGrid::drawGridCrsTransform( QgsRenderContext &context, double dotsPerMM, QList< QPair< double, QLineF > > &horizontalLines,
QList< QPair< double, QLineF > > &verticalLines, bool calculateLinesOnly ) const
{
if ( !mMap || !mEnabled )
if ( !mMap || !mEnabled || !mEvaluatedEnabled )
{
return;
}
@ -546,7 +548,7 @@ void QgsLayoutItemMapGrid::calculateCrsTransformLines() const
void QgsLayoutItemMapGrid::draw( QPainter *p )
{
if ( !mMap || !mEnabled )
if ( !mMap || !mEnabled || !mEvaluatedEnabled )
{
return;
}
@ -556,6 +558,10 @@ void QgsLayoutItemMapGrid::draw( QPainter *p )
return;
}
QgsExpressionContext expressionContext = createExpressionContext();
if ( !mDataDefinedProperties.value( QgsLayoutObject::MapGridEnabled, expressionContext, true ).toBool() )
return;
p->save();
p->setCompositionMode( mBlendMode );
p->setRenderHint( QPainter::Antialiasing, mMap->layout()->renderContext().flags() & QgsLayoutRenderContext::FlagAntialiasing );
@ -576,7 +582,6 @@ void QgsLayoutItemMapGrid::draw( QPainter *p )
//setup render context
QgsRenderContext context = QgsLayoutUtils::createRenderContextForLayout( mLayout, p );
context.setForceVectorOutput( true );
QgsExpressionContext expressionContext = createExpressionContext();
context.setExpressionContext( expressionContext );
QList< QPair< double, QLineF > > verticalLines;
@ -805,7 +810,7 @@ void QgsLayoutItemMapGrid::drawGridFrameZebraBorder( QPainter *p, const QMap< do
if ( extension )
{
*extension = mGridFrameMargin + mGridFrameWidth + mGridFramePenThickness / 2.0;
*extension = mEvaluatedFrameMargin + mEvaluatedFrameSize + mGridFramePenThickness / 2.0;
return;
}
@ -857,33 +862,33 @@ void QgsLayoutItemMapGrid::drawGridFrameZebraBorder( QPainter *p, const QMap< do
if ( border == QgsLayoutItemMapGrid::Left || border == QgsLayoutItemMapGrid::Right )
{
height = posIt.key() - currentCoord;
width = mGridFrameWidth;
x = ( border == QgsLayoutItemMapGrid::Left ) ? -( mGridFrameWidth + mGridFrameMargin ) : mMap->rect().width() + mGridFrameMargin;
width = mEvaluatedFrameSize;
x = ( border == QgsLayoutItemMapGrid::Left ) ? -( mEvaluatedFrameSize + mEvaluatedFrameMargin ) : mMap->rect().width() + mEvaluatedFrameMargin;
y = currentCoord;
}
else //top or bottom
{
height = mGridFrameWidth;
height = mEvaluatedFrameSize;
width = posIt.key() - currentCoord;
x = currentCoord;
y = ( border == QgsLayoutItemMapGrid::Top ) ? -( mGridFrameWidth + mGridFrameMargin ) : mMap->rect().height() + mGridFrameMargin;
y = ( border == QgsLayoutItemMapGrid::Top ) ? -( mEvaluatedFrameSize + mEvaluatedFrameMargin ) : mMap->rect().height() + mEvaluatedFrameMargin;
}
p->drawRect( QRectF( x, y, width, height ) );
currentCoord = posIt.key();
color1 = !color1;
}
if ( mGridFrameStyle == ZebraNautical || qgsDoubleNear( mGridFrameMargin, 0.0 ) )
if ( mGridFrameStyle == ZebraNautical || qgsDoubleNear( mEvaluatedFrameMargin, 0.0 ) )
{
//draw corners
width = height = ( mGridFrameWidth + mGridFrameMargin ) ;
width = height = ( mEvaluatedFrameSize + mEvaluatedFrameMargin ) ;
p->setBrush( QBrush( mGridFrameFillColor1 ) );
if ( drawTLBox )
p->drawRect( QRectF( -( mGridFrameWidth + mGridFrameMargin ), -( mGridFrameWidth + mGridFrameMargin ), width, height ) );
p->drawRect( QRectF( -( mEvaluatedFrameSize + mEvaluatedFrameMargin ), -( mEvaluatedFrameSize + mEvaluatedFrameMargin ), width, height ) );
if ( drawTRBox )
p->drawRect( QRectF( mMap->rect().width(), -( mGridFrameWidth + mGridFrameMargin ), width, height ) );
p->drawRect( QRectF( mMap->rect().width(), -( mEvaluatedFrameSize + mEvaluatedFrameMargin ), width, height ) );
if ( drawBLBox )
p->drawRect( QRectF( -( mGridFrameWidth + mGridFrameMargin ), mMap->rect().height(), width, height ) );
p->drawRect( QRectF( -( mEvaluatedFrameSize + mEvaluatedFrameMargin ), mMap->rect().height(), width, height ) );
if ( drawBRBox )
p->drawRect( QRectF( mMap->rect().width(), mMap->rect().height(), width, height ) );
}
@ -899,7 +904,7 @@ void QgsLayoutItemMapGrid::drawGridFrameTicks( QPainter *p, const QMap< double,
if ( extension )
{
if ( mGridFrameStyle != QgsLayoutItemMapGrid::InteriorTicks )
*extension = mGridFrameMargin + mGridFrameWidth;
*extension = mEvaluatedFrameMargin + mEvaluatedFrameSize;
return;
}
@ -924,18 +929,18 @@ void QgsLayoutItemMapGrid::drawGridFrameTicks( QPainter *p, const QMap< double,
height = 0;
if ( mGridFrameStyle == QgsLayoutItemMapGrid::InteriorTicks )
{
width = mGridFrameWidth;
x = ( border == QgsLayoutItemMapGrid::Left ) ? 0 + mGridFrameMargin : mMap->rect().width() - mGridFrameWidth - mGridFrameMargin;
width = mEvaluatedFrameSize;
x = ( border == QgsLayoutItemMapGrid::Left ) ? 0 + mEvaluatedFrameMargin : mMap->rect().width() - mEvaluatedFrameSize - mEvaluatedFrameMargin;
}
else if ( mGridFrameStyle == QgsLayoutItemMapGrid::ExteriorTicks )
{
width = mGridFrameWidth;
x = ( border == QgsLayoutItemMapGrid::Left ) ? - mGridFrameWidth - mGridFrameMargin : mMap->rect().width() + mGridFrameMargin;
width = mEvaluatedFrameSize;
x = ( border == QgsLayoutItemMapGrid::Left ) ? - mEvaluatedFrameSize - mEvaluatedFrameMargin : mMap->rect().width() + mEvaluatedFrameMargin;
}
else if ( mGridFrameStyle == QgsLayoutItemMapGrid::InteriorExteriorTicks )
{
width = mGridFrameWidth * 2;
x = ( border == QgsLayoutItemMapGrid::Left ) ? - mGridFrameWidth - mGridFrameMargin : mMap->rect().width() - mGridFrameWidth + mGridFrameMargin;
width = mEvaluatedFrameSize * 2;
x = ( border == QgsLayoutItemMapGrid::Left ) ? - mEvaluatedFrameSize - mEvaluatedFrameMargin : mMap->rect().width() - mEvaluatedFrameSize + mEvaluatedFrameMargin;
}
}
else //top or bottom
@ -944,18 +949,18 @@ void QgsLayoutItemMapGrid::drawGridFrameTicks( QPainter *p, const QMap< double,
width = 0;
if ( mGridFrameStyle == QgsLayoutItemMapGrid::InteriorTicks )
{
height = mGridFrameWidth;
y = ( border == QgsLayoutItemMapGrid::Top ) ? 0 + mGridFrameMargin : mMap->rect().height() - mGridFrameWidth - mGridFrameMargin;
height = mEvaluatedFrameSize;
y = ( border == QgsLayoutItemMapGrid::Top ) ? 0 + mEvaluatedFrameMargin : mMap->rect().height() - mEvaluatedFrameSize - mEvaluatedFrameMargin;
}
else if ( mGridFrameStyle == QgsLayoutItemMapGrid::ExteriorTicks )
{
height = mGridFrameWidth;
y = ( border == QgsLayoutItemMapGrid::Top ) ? -mGridFrameWidth - mGridFrameMargin : mMap->rect().height() + mGridFrameMargin;
height = mEvaluatedFrameSize;
y = ( border == QgsLayoutItemMapGrid::Top ) ? -mEvaluatedFrameSize - mEvaluatedFrameMargin : mMap->rect().height() + mEvaluatedFrameMargin;
}
else if ( mGridFrameStyle == QgsLayoutItemMapGrid::InteriorExteriorTicks )
{
height = mGridFrameWidth * 2;
y = ( border == QgsLayoutItemMapGrid::Top ) ? -mGridFrameWidth - mGridFrameMargin : mMap->rect().height() - mGridFrameWidth + mGridFrameMargin;
height = mEvaluatedFrameSize * 2;
y = ( border == QgsLayoutItemMapGrid::Top ) ? -mEvaluatedFrameSize - mEvaluatedFrameMargin : mMap->rect().height() - mEvaluatedFrameSize + mEvaluatedFrameMargin;
}
}
p->drawLine( QLineF( x, y, x + width, y + height ) );
@ -971,7 +976,7 @@ void QgsLayoutItemMapGrid::drawGridFrameLineBorder( QPainter *p, QgsLayoutItemMa
if ( extension )
{
*extension = mGridFrameMargin + mGridFramePenThickness / 2.0;
*extension = mEvaluatedFrameMargin + mGridFramePenThickness / 2.0;
return;
}
@ -982,47 +987,47 @@ void QgsLayoutItemMapGrid::drawGridFrameLineBorder( QPainter *p, QgsLayoutItemMa
p->setBrush( Qt::NoBrush );
p->setPen( framePen );
const bool drawDiagonals = mGridFrameStyle == LineBorderNautical && !qgsDoubleNear( mGridFrameMargin, 0.0 );
const bool drawDiagonals = mGridFrameStyle == LineBorderNautical && !qgsDoubleNear( mEvaluatedFrameMargin, 0.0 );
switch ( border )
{
case QgsLayoutItemMapGrid::Left:
p->drawLine( QLineF( 0 - mGridFrameMargin, 0 - mGridFrameMargin, 0 - mGridFrameMargin, mMap->rect().height() + mGridFrameMargin ) );
p->drawLine( QLineF( 0 - mEvaluatedFrameMargin, 0 - mEvaluatedFrameMargin, 0 - mEvaluatedFrameMargin, mMap->rect().height() + mEvaluatedFrameMargin ) );
//corner left-top
if ( drawDiagonals )
{
const double X1 = 0 - mGridFrameMargin + mGridFramePenThickness / 2.0;
const double Y1 = 0 - mGridFrameMargin + mGridFramePenThickness / 2.0;
const double X1 = 0 - mEvaluatedFrameMargin + mGridFramePenThickness / 2.0;
const double Y1 = 0 - mEvaluatedFrameMargin + mGridFramePenThickness / 2.0;
p->drawLine( QLineF( 0, 0, X1, Y1 ) );
}
break;
case QgsLayoutItemMapGrid::Right:
p->drawLine( QLineF( mMap->rect().width() + mGridFrameMargin, 0 - mGridFrameMargin, mMap->rect().width() + mGridFrameMargin, mMap->rect().height() + mGridFrameMargin ) );
p->drawLine( QLineF( mMap->rect().width() + mEvaluatedFrameMargin, 0 - mEvaluatedFrameMargin, mMap->rect().width() + mEvaluatedFrameMargin, mMap->rect().height() + mEvaluatedFrameMargin ) );
//corner right-bottom
if ( drawDiagonals )
{
const double X1 = mMap->rect().width() + mGridFrameMargin - mGridFramePenThickness / 2.0 ;
const double Y1 = mMap->rect().height() + mGridFrameMargin - mGridFramePenThickness / 2.0 ;
const double X1 = mMap->rect().width() + mEvaluatedFrameMargin - mGridFramePenThickness / 2.0 ;
const double Y1 = mMap->rect().height() + mEvaluatedFrameMargin - mGridFramePenThickness / 2.0 ;
p->drawLine( QLineF( mMap->rect().width(), mMap->rect().height(), X1, Y1 ) );
}
break;
case QgsLayoutItemMapGrid::Top:
p->drawLine( QLineF( 0 - mGridFrameMargin, 0 - mGridFrameMargin, mMap->rect().width() + mGridFrameMargin, 0 - mGridFrameMargin ) );
p->drawLine( QLineF( 0 - mEvaluatedFrameMargin, 0 - mEvaluatedFrameMargin, mMap->rect().width() + mEvaluatedFrameMargin, 0 - mEvaluatedFrameMargin ) );
//corner right-top
if ( drawDiagonals )
{
const double X1 = mMap->rect().width() + mGridFrameMargin - mGridFramePenThickness / 2.0 ;
const double Y1 = 0 - mGridFrameMargin + mGridFramePenThickness / 2.0 ;
const double X1 = mMap->rect().width() + mEvaluatedFrameMargin - mGridFramePenThickness / 2.0 ;
const double Y1 = 0 - mEvaluatedFrameMargin + mGridFramePenThickness / 2.0 ;
p->drawLine( QLineF( mMap->rect().width(), 0, X1, Y1 ) );
}
break;
case QgsLayoutItemMapGrid::Bottom:
p->drawLine( QLineF( 0 - mGridFrameMargin, mMap->rect().height() + mGridFrameMargin, mMap->rect().width() + mGridFrameMargin, mMap->rect().height() + mGridFrameMargin ) );
p->drawLine( QLineF( 0 - mEvaluatedFrameMargin, mMap->rect().height() + mEvaluatedFrameMargin, mMap->rect().width() + mEvaluatedFrameMargin, mMap->rect().height() + mEvaluatedFrameMargin ) );
//corner left-bottom
if ( drawDiagonals )
{
const double X1 = 0 - mGridFrameMargin + mGridFramePenThickness / 2.0 ;
const double Y1 = mMap->rect().height() + mGridFrameMargin - mGridFramePenThickness / 2.0 ;
const double X1 = 0 - mEvaluatedFrameMargin + mGridFramePenThickness / 2.0 ;
const double Y1 = mMap->rect().height() + mEvaluatedFrameMargin - mGridFramePenThickness / 2.0 ;
p->drawLine( QLineF( 0, mMap->rect().height(), X1, Y1 ) );
}
break;
@ -1072,7 +1077,7 @@ void QgsLayoutItemMapGrid::drawCoordinateAnnotation( QPainter *p, QPointF pos, c
case InteriorTicks:
case ExteriorTicks:
case InteriorExteriorTicks:
gridFrameDistance = mGridFrameWidth;
gridFrameDistance = mEvaluatedFrameSize;
break;
case QgsLayoutItemMapGrid::Zebra:
@ -1107,19 +1112,19 @@ void QgsLayoutItemMapGrid::drawCoordinateAnnotation( QPainter *p, QPointF pos, c
}
if ( mLeftGridAnnotationDirection == QgsLayoutItemMapGrid::Vertical || mLeftGridAnnotationDirection == QgsLayoutItemMapGrid::BoundaryDirection )
{
xpos += textHeight + mAnnotationFrameDistance + gridFrameDistance;
xpos += textHeight + mEvaluatedLabelDistance + gridFrameDistance;
ypos += textWidth / 2.0;
rotation = 270;
}
else if ( mLeftGridAnnotationDirection == QgsLayoutItemMapGrid::VerticalDescending )
{
xpos += ( mAnnotationFrameDistance + gridFrameDistance );
xpos += ( mEvaluatedLabelDistance + gridFrameDistance );
ypos -= textWidth / 2.0;
rotation = 90;
}
else
{
xpos += mAnnotationFrameDistance + gridFrameDistance;
xpos += mEvaluatedLabelDistance + gridFrameDistance;
ypos += textHeight / 2.0;
}
}
@ -1131,26 +1136,26 @@ void QgsLayoutItemMapGrid::drawCoordinateAnnotation( QPainter *p, QPointF pos, c
}
if ( mLeftGridAnnotationDirection == QgsLayoutItemMapGrid::Vertical || mLeftGridAnnotationDirection == QgsLayoutItemMapGrid::BoundaryDirection )
{
xpos -= ( mAnnotationFrameDistance + gridFrameDistance );
xpos -= ( mEvaluatedLabelDistance + gridFrameDistance );
ypos += textWidth / 2.0;
rotation = 270;
if ( extension )
extension->left = std::max( extension->left, mAnnotationFrameDistance + gridFrameDistance + textHeight );
extension->left = std::max( extension->left, mEvaluatedLabelDistance + gridFrameDistance + textHeight );
}
else if ( mLeftGridAnnotationDirection == QgsLayoutItemMapGrid::VerticalDescending )
{
xpos -= textHeight + mAnnotationFrameDistance + gridFrameDistance;
xpos -= textHeight + mEvaluatedLabelDistance + gridFrameDistance;
ypos -= textWidth / 2.0;
rotation = 90;
if ( extension )
extension->left = std::max( extension->left, mAnnotationFrameDistance + gridFrameDistance + textHeight );
extension->left = std::max( extension->left, mEvaluatedLabelDistance + gridFrameDistance + textHeight );
}
else
{
xpos -= ( textWidth + mAnnotationFrameDistance + gridFrameDistance );
xpos -= ( textWidth + mEvaluatedLabelDistance + gridFrameDistance );
ypos += textHeight / 2.0;
if ( extension )
extension->left = std::max( extension->left, mAnnotationFrameDistance + gridFrameDistance + textWidth );
extension->left = std::max( extension->left, mEvaluatedLabelDistance + gridFrameDistance + textWidth );
}
}
else
@ -1179,19 +1184,19 @@ void QgsLayoutItemMapGrid::drawCoordinateAnnotation( QPainter *p, QPointF pos, c
}
if ( mRightGridAnnotationDirection == QgsLayoutItemMapGrid::Vertical )
{
xpos -= mAnnotationFrameDistance + gridFrameDistance;
xpos -= mEvaluatedLabelDistance + gridFrameDistance;
ypos += textWidth / 2.0;
rotation = 270;
}
else if ( mRightGridAnnotationDirection == QgsLayoutItemMapGrid::VerticalDescending || mRightGridAnnotationDirection == QgsLayoutItemMapGrid::BoundaryDirection )
{
xpos -= textHeight + mAnnotationFrameDistance + gridFrameDistance;
xpos -= textHeight + mEvaluatedLabelDistance + gridFrameDistance;
ypos -= textWidth / 2.0;
rotation = 90;
}
else
{
xpos -= textWidth + mAnnotationFrameDistance + gridFrameDistance;
xpos -= textWidth + mEvaluatedLabelDistance + gridFrameDistance;
ypos += textHeight / 2.0;
}
}
@ -1203,26 +1208,26 @@ void QgsLayoutItemMapGrid::drawCoordinateAnnotation( QPainter *p, QPointF pos, c
}
if ( mRightGridAnnotationDirection == QgsLayoutItemMapGrid::Vertical )
{
xpos += ( textHeight + mAnnotationFrameDistance + gridFrameDistance );
xpos += ( textHeight + mEvaluatedLabelDistance + gridFrameDistance );
ypos += textWidth / 2.0;
rotation = 270;
if ( extension )
extension->right = std::max( extension->right, mAnnotationFrameDistance + gridFrameDistance + textHeight );
extension->right = std::max( extension->right, mEvaluatedLabelDistance + gridFrameDistance + textHeight );
}
else if ( mRightGridAnnotationDirection == QgsLayoutItemMapGrid::VerticalDescending || mRightGridAnnotationDirection == QgsLayoutItemMapGrid::BoundaryDirection )
{
xpos += ( mAnnotationFrameDistance + gridFrameDistance );
xpos += ( mEvaluatedLabelDistance + gridFrameDistance );
ypos -= textWidth / 2.0;
rotation = 90;
if ( extension )
extension->right = std::max( extension->right, mAnnotationFrameDistance + gridFrameDistance + textHeight );
extension->right = std::max( extension->right, mEvaluatedLabelDistance + gridFrameDistance + textHeight );
}
else //Horizontal
{
xpos += ( mAnnotationFrameDistance + gridFrameDistance );
xpos += ( mEvaluatedLabelDistance + gridFrameDistance );
ypos += textHeight / 2.0;
if ( extension )
extension->right = std::max( extension->right, mAnnotationFrameDistance + gridFrameDistance + textWidth );
extension->right = std::max( extension->right, mEvaluatedLabelDistance + gridFrameDistance + textWidth );
}
}
else
@ -1251,19 +1256,19 @@ void QgsLayoutItemMapGrid::drawCoordinateAnnotation( QPainter *p, QPointF pos, c
}
if ( mBottomGridAnnotationDirection == QgsLayoutItemMapGrid::Horizontal || mBottomGridAnnotationDirection == QgsLayoutItemMapGrid::BoundaryDirection )
{
ypos -= mAnnotationFrameDistance + gridFrameDistance;
ypos -= mEvaluatedLabelDistance + gridFrameDistance;
xpos -= textWidth / 2.0;
}
else if ( mBottomGridAnnotationDirection == QgsLayoutItemMapGrid::VerticalDescending )
{
xpos -= textHeight / 2.0;
ypos -= textWidth + mAnnotationFrameDistance + gridFrameDistance;
ypos -= textWidth + mEvaluatedLabelDistance + gridFrameDistance;
rotation = 90;
}
else //Vertical
{
xpos += textHeight / 2.0;
ypos -= mAnnotationFrameDistance + gridFrameDistance;
ypos -= mEvaluatedLabelDistance + gridFrameDistance;
rotation = 270;
}
}
@ -1275,11 +1280,11 @@ void QgsLayoutItemMapGrid::drawCoordinateAnnotation( QPainter *p, QPointF pos, c
}
if ( mBottomGridAnnotationDirection == QgsLayoutItemMapGrid::Horizontal || mBottomGridAnnotationDirection == QgsLayoutItemMapGrid::BoundaryDirection )
{
ypos += ( mAnnotationFrameDistance + textHeight + gridFrameDistance );
ypos += ( mEvaluatedLabelDistance + textHeight + gridFrameDistance );
xpos -= textWidth / 2.0;
if ( extension )
{
extension->bottom = std::max( extension->bottom, mAnnotationFrameDistance + gridFrameDistance + textHeight );
extension->bottom = std::max( extension->bottom, mEvaluatedLabelDistance + gridFrameDistance + textHeight );
extension->left = std::max( extension->left, textWidth / 2.0 ); // annotation at bottom left/right may extend outside the bounds
extension->right = std::max( extension->right, textWidth / 2.0 );
}
@ -1287,18 +1292,18 @@ void QgsLayoutItemMapGrid::drawCoordinateAnnotation( QPainter *p, QPointF pos, c
else if ( mBottomGridAnnotationDirection == QgsLayoutItemMapGrid::VerticalDescending )
{
xpos -= textHeight / 2.0;
ypos += gridFrameDistance + mAnnotationFrameDistance;
ypos += gridFrameDistance + mEvaluatedLabelDistance;
rotation = 90;
if ( extension )
extension->bottom = std::max( extension->bottom, mAnnotationFrameDistance + gridFrameDistance + textWidth );
extension->bottom = std::max( extension->bottom, mEvaluatedLabelDistance + gridFrameDistance + textWidth );
}
else //Vertical
{
xpos += textHeight / 2.0;
ypos += ( textWidth + mAnnotationFrameDistance + gridFrameDistance );
ypos += ( textWidth + mEvaluatedLabelDistance + gridFrameDistance );
rotation = 270;
if ( extension )
extension->bottom = std::max( extension->bottom, mAnnotationFrameDistance + gridFrameDistance + textWidth );
extension->bottom = std::max( extension->bottom, mEvaluatedLabelDistance + gridFrameDistance + textWidth );
}
}
else
@ -1328,18 +1333,18 @@ void QgsLayoutItemMapGrid::drawCoordinateAnnotation( QPainter *p, QPointF pos, c
if ( mTopGridAnnotationDirection == QgsLayoutItemMapGrid::Horizontal || mTopGridAnnotationDirection == QgsLayoutItemMapGrid::BoundaryDirection )
{
xpos -= textWidth / 2.0;
ypos += textHeight + mAnnotationFrameDistance + gridFrameDistance;
ypos += textHeight + mEvaluatedLabelDistance + gridFrameDistance;
}
else if ( mTopGridAnnotationDirection == QgsLayoutItemMapGrid::VerticalDescending )
{
xpos -= textHeight / 2.0;
ypos += mAnnotationFrameDistance + gridFrameDistance;
ypos += mEvaluatedLabelDistance + gridFrameDistance;
rotation = 90;
}
else //Vertical
{
xpos += textHeight / 2.0;
ypos += textWidth + mAnnotationFrameDistance + gridFrameDistance;
ypos += textWidth + mEvaluatedLabelDistance + gridFrameDistance;
rotation = 270;
}
}
@ -1352,25 +1357,25 @@ void QgsLayoutItemMapGrid::drawCoordinateAnnotation( QPainter *p, QPointF pos, c
if ( mTopGridAnnotationDirection == QgsLayoutItemMapGrid::Horizontal || mTopGridAnnotationDirection == QgsLayoutItemMapGrid::BoundaryDirection )
{
xpos -= textWidth / 2.0;
ypos -= ( mAnnotationFrameDistance + gridFrameDistance );
ypos -= ( mEvaluatedLabelDistance + gridFrameDistance );
if ( extension )
extension->top = std::max( extension->top, mAnnotationFrameDistance + gridFrameDistance + textHeight );
extension->top = std::max( extension->top, mEvaluatedLabelDistance + gridFrameDistance + textHeight );
}
else if ( mTopGridAnnotationDirection == QgsLayoutItemMapGrid::VerticalDescending )
{
xpos -= textHeight / 2.0;
ypos -= textWidth + mAnnotationFrameDistance + gridFrameDistance;
ypos -= textWidth + mEvaluatedLabelDistance + gridFrameDistance;
rotation = 90;
if ( extension )
extension->top = std::max( extension->top, mAnnotationFrameDistance + gridFrameDistance + textWidth );
extension->top = std::max( extension->top, mEvaluatedLabelDistance + gridFrameDistance + textWidth );
}
else //Vertical
{
xpos += textHeight / 2.0;
ypos -= ( mAnnotationFrameDistance + gridFrameDistance );
ypos -= ( mEvaluatedLabelDistance + gridFrameDistance );
rotation = 270;
if ( extension )
extension->top = std::max( extension->top, mAnnotationFrameDistance + gridFrameDistance + textWidth );
extension->top = std::max( extension->top, mEvaluatedLabelDistance + gridFrameDistance + textWidth );
}
}
else
@ -1529,7 +1534,7 @@ QString QgsLayoutItemMapGrid::gridAnnotationString( double value, QgsLayoutItemM
int QgsLayoutItemMapGrid::xGridLines( QList< QPair< double, QLineF > > &lines ) const
{
lines.clear();
if ( !mMap || mGridIntervalY <= 0.0 )
if ( !mMap || mEvaluatedIntervalY <= 0.0 )
{
return 1;
}
@ -1537,8 +1542,8 @@ int QgsLayoutItemMapGrid::xGridLines( QList< QPair< double, QLineF > > &lines )
QPolygonF mapPolygon = mMap->transformedMapPolygon();
QRectF mapBoundingRect = mapPolygon.boundingRect();
double gridIntervalY = mGridIntervalY;
double gridOffsetY = mGridOffsetY;
double gridIntervalY = mEvaluatedIntervalY;
double gridOffsetY = mEvaluatedOffsetY;
double annotationScale = 1.0;
if ( mGridUnit != MapUnit )
{
@ -1615,15 +1620,15 @@ int QgsLayoutItemMapGrid::xGridLines( QList< QPair< double, QLineF > > &lines )
int QgsLayoutItemMapGrid::yGridLines( QList< QPair< double, QLineF > > &lines ) const
{
lines.clear();
if ( !mMap || mGridIntervalX <= 0.0 )
if ( !mMap || mEvaluatedIntervalX <= 0.0 )
{
return 1;
}
QPolygonF mapPolygon = mMap->transformedMapPolygon();
QRectF mapBoundingRect = mapPolygon.boundingRect();
double gridIntervalX = mGridIntervalX;
double gridOffsetX = mGridOffsetX;
double gridIntervalX = mEvaluatedIntervalX;
double gridOffsetX = mEvaluatedOffsetX;
double annotationScale = 1.0;
if ( mGridUnit != MapUnit )
{
@ -1698,13 +1703,13 @@ int QgsLayoutItemMapGrid::yGridLines( QList< QPair< double, QLineF > > &lines )
int QgsLayoutItemMapGrid::xGridLinesCrsTransform( const QgsRectangle &bbox, const QgsCoordinateTransform &t, QList< QPair< double, QPolygonF > > &lines ) const
{
lines.clear();
if ( !mMap || mGridIntervalY <= 0.0 )
if ( !mMap || mEvaluatedIntervalY <= 0.0 )
{
return 1;
}
double roundCorrection = bbox.yMaximum() > 0 ? 1.0 : 0.0;
double currentLevel = static_cast< int >( ( bbox.yMaximum() - mGridOffsetY ) / mGridIntervalY + roundCorrection ) * mGridIntervalY + mGridOffsetY;
double currentLevel = static_cast< int >( ( bbox.yMaximum() - mEvaluatedOffsetY ) / mEvaluatedIntervalY + roundCorrection ) * mEvaluatedIntervalY + mEvaluatedOffsetY;
double minX = bbox.xMinimum();
double maxX = bbox.xMaximum();
@ -1765,7 +1770,7 @@ int QgsLayoutItemMapGrid::xGridLinesCrsTransform( const QgsRectangle &bbox, cons
gridLineCount++;
}
}
currentLevel -= mGridIntervalY;
currentLevel -= mEvaluatedIntervalY;
}
return 0;
@ -1774,13 +1779,13 @@ int QgsLayoutItemMapGrid::xGridLinesCrsTransform( const QgsRectangle &bbox, cons
int QgsLayoutItemMapGrid::yGridLinesCrsTransform( const QgsRectangle &bbox, const QgsCoordinateTransform &t, QList< QPair< double, QPolygonF > > &lines ) const
{
lines.clear();
if ( !mMap || mGridIntervalX <= 0.0 )
if ( !mMap || mEvaluatedIntervalX <= 0.0 )
{
return 1;
}
double roundCorrection = bbox.xMinimum() > 0 ? 1.0 : 0.0;
double currentLevel = static_cast< int >( ( bbox.xMinimum() - mGridOffsetX ) / mGridIntervalX + roundCorrection ) * mGridIntervalX + mGridOffsetX;
double currentLevel = static_cast< int >( ( bbox.xMinimum() - mEvaluatedOffsetX ) / mEvaluatedIntervalX + roundCorrection ) * mEvaluatedIntervalX + mEvaluatedOffsetX;
double minY = bbox.yMinimum();
double maxY = bbox.yMaximum();
@ -1835,7 +1840,7 @@ int QgsLayoutItemMapGrid::yGridLinesCrsTransform( const QgsRectangle &bbox, cons
gridLineCount++;
}
}
currentLevel += mGridIntervalX;
currentLevel += mEvaluatedIntervalX;
if ( crosses180 && currentLevel > 180.0 )
{
currentLevel -= 360.0;
@ -1927,6 +1932,20 @@ bool QgsLayoutItemMapGrid::shouldShowDivisionForDisplayMode( QgsLayoutItemMapGri
|| ( mode == QgsLayoutItemMapGrid::LongitudeOnly && coordinate == QgsLayoutItemMapGrid::Longitude );
}
void QgsLayoutItemMapGrid::refreshDataDefinedProperties()
{
QgsExpressionContext context = createExpressionContext();
mEvaluatedEnabled = mDataDefinedProperties.valueAsBool( QgsLayoutObject::MapGridEnabled, context, true );
mEvaluatedIntervalX = mDataDefinedProperties.valueAsDouble( QgsLayoutObject::MapGridIntervalX, context, mGridIntervalX );
mEvaluatedIntervalY = mDataDefinedProperties.valueAsDouble( QgsLayoutObject::MapGridIntervalY, context, mGridIntervalY );
mEvaluatedOffsetX = mDataDefinedProperties.valueAsDouble( QgsLayoutObject::MapGridOffsetX, context, mGridOffsetX );
mEvaluatedOffsetY = mDataDefinedProperties.valueAsDouble( QgsLayoutObject::MapGridOffsetY, context, mGridOffsetY );
mEvaluatedFrameSize = mDataDefinedProperties.valueAsDouble( QgsLayoutObject::MapGridFrameSize, context, mGridFrameWidth );
mEvaluatedFrameMargin = mDataDefinedProperties.valueAsDouble( QgsLayoutObject::MapGridFrameMargin, context, mGridFrameMargin );
mEvaluatedLabelDistance = mDataDefinedProperties.valueAsDouble( QgsLayoutObject::MapGridLabelDistance, context, mAnnotationFrameDistance );
}
bool sortByDistance( QPair<qreal, QgsLayoutItemMapGrid::BorderSide> a, QPair<qreal, QgsLayoutItemMapGrid::BorderSide> b )
{
return a.first < b.first;
@ -2072,7 +2091,7 @@ void QgsLayoutItemMapGrid::calculateMaxExtension( double &top, double &right, do
bottom = 0.0;
left = 0.0;
if ( !mMap || !mEnabled )
if ( !mMap || !mEnabled || !mEvaluatedEnabled )
{
return;
}
@ -2130,6 +2149,7 @@ void QgsLayoutItemMapGrid::setIntervalX( const double interval )
}
mGridIntervalX = interval;
mTransformDirty = true;
refreshDataDefinedProperties();
}
void QgsLayoutItemMapGrid::setIntervalY( const double interval )
@ -2140,6 +2160,7 @@ void QgsLayoutItemMapGrid::setIntervalY( const double interval )
}
mGridIntervalY = interval;
mTransformDirty = true;
refreshDataDefinedProperties();
}
void QgsLayoutItemMapGrid::setOffsetX( const double offset )
@ -2150,6 +2171,7 @@ void QgsLayoutItemMapGrid::setOffsetX( const double offset )
}
mGridOffsetX = offset;
mTransformDirty = true;
refreshDataDefinedProperties();
}
void QgsLayoutItemMapGrid::setOffsetY( const double offset )
@ -2160,6 +2182,7 @@ void QgsLayoutItemMapGrid::setOffsetY( const double offset )
}
mGridOffsetY = offset;
mTransformDirty = true;
refreshDataDefinedProperties();
}
void QgsLayoutItemMapGrid::setStyle( const QgsLayoutItemMapGrid::GridStyle style )
@ -2172,6 +2195,12 @@ void QgsLayoutItemMapGrid::setStyle( const QgsLayoutItemMapGrid::GridStyle style
mTransformDirty = true;
}
void QgsLayoutItemMapGrid::setCrossLength( const double length )
{
mCrossLength = length;
refreshDataDefinedProperties();
}
void QgsLayoutItemMapGrid::setAnnotationDirection( const QgsLayoutItemMapGrid::AnnotationDirection direction, const QgsLayoutItemMapGrid::BorderSide border )
{
switch ( border )
@ -2243,11 +2272,31 @@ bool QgsLayoutItemMapGrid::accept( QgsStyleEntityVisitorInterface *visitor ) con
return true;
}
void QgsLayoutItemMapGrid::refresh()
{
mTransformDirty = true;
refreshDataDefinedProperties();
mMap->updateBoundingRect();
mMap->update();
}
bool QgsLayoutItemMapGrid::testFrameSideFlag( QgsLayoutItemMapGrid::FrameSideFlag flag ) const
{
return mGridFrameSides.testFlag( flag );
}
void QgsLayoutItemMapGrid::setFrameWidth( const double width )
{
mGridFrameWidth = width;
refreshDataDefinedProperties();
}
void QgsLayoutItemMapGrid::setFrameMargin( const double margin )
{
mGridFrameMargin = margin;
refreshDataDefinedProperties();
}
void QgsLayoutItemMapGrid::setAnnotationDirection( const AnnotationDirection direction )
{
mLeftGridAnnotationDirection = direction;
@ -2297,6 +2346,12 @@ QgsLayoutItemMapGrid::AnnotationPosition QgsLayoutItemMapGrid::annotationPositio
return mLeftGridAnnotationPosition; // no warnings
}
void QgsLayoutItemMapGrid::setAnnotationFrameDistance( const double distance )
{
mAnnotationFrameDistance = distance;
refreshDataDefinedProperties();
}
QgsLayoutItemMapGrid::AnnotationDirection QgsLayoutItemMapGrid::annotationDirection( const BorderSide border ) const
{
if ( !mMap )

View File

@ -413,7 +413,7 @@ class CORE_EXPORT QgsLayoutItemMapGrid : public QgsLayoutItemMapItem
* with QgsLayoutItemMapGrid::Cross styles.
* \see crossLength()
*/
void setCrossLength( const double length ) { mCrossLength = length; }
void setCrossLength( const double length );
/**
* Retrieves the length (in layout units) of the cross segments drawn for the grid. This is only used for grids
@ -589,7 +589,7 @@ class CORE_EXPORT QgsLayoutItemMapGrid : public QgsLayoutItemMapItem
* Sets the \a distance between the map frame and annotations. Units are layout units.
* \see annotationFrameDistance()
*/
void setAnnotationFrameDistance( const double distance ) { mAnnotationFrameDistance = distance; }
void setAnnotationFrameDistance( const double distance );
/**
* Returns the distance between the map frame and annotations. Units are in layout units.
@ -715,7 +715,7 @@ class CORE_EXPORT QgsLayoutItemMapGrid : public QgsLayoutItemMapItem
* setFramePenSize method.
* \see frameWidth()
*/
void setFrameWidth( const double width ) { mGridFrameWidth = width; }
void setFrameWidth( const double width );
/**
* Gets the grid frame width in layout units. This property controls how wide the grid frame is.
@ -731,7 +731,7 @@ class CORE_EXPORT QgsLayoutItemMapGrid : public QgsLayoutItemMapItem
* \see frameMargin()
* \since QGIS 3.6
*/
void setFrameMargin( const double margin ) { mGridFrameMargin = margin; }
void setFrameMargin( const double margin );
/**
* Sets the grid frame Margin (in layout units).
@ -807,6 +807,7 @@ class CORE_EXPORT QgsLayoutItemMapGrid : public QgsLayoutItemMapItem
QgsExpressionContext createExpressionContext() const override;
bool accept( QgsStyleEntityVisitorInterface *visitor ) const override;
void refresh() override;
private:
@ -911,6 +912,15 @@ class CORE_EXPORT QgsLayoutItemMapGrid : public QgsLayoutItemMapItem
QRectF mPrevPaintRect;
mutable QPolygonF mPrevMapPolygon;
bool mEvaluatedEnabled = true;
double mEvaluatedIntervalX = 0;
double mEvaluatedIntervalY = 0;
double mEvaluatedOffsetX = 0;
double mEvaluatedOffsetY = 0;
double mEvaluatedFrameSize = 0;
double mEvaluatedFrameMargin = 0;
double mEvaluatedLabelDistance = 0;
class QgsMapAnnotation
{
public:
@ -1016,6 +1026,7 @@ class CORE_EXPORT QgsLayoutItemMapGrid : public QgsLayoutItemMapItem
bool shouldShowDivisionForSide( AnnotationCoordinate coordinate, BorderSide side ) const;
bool shouldShowDivisionForDisplayMode( AnnotationCoordinate coordinate, DisplayMode mode ) const;
void refreshDataDefinedProperties();
friend class TestQgsLayoutMapGrid;

View File

@ -30,9 +30,12 @@ QgsLayoutItemMapItem::QgsLayoutItemMapItem( const QString &name, QgsLayoutItemMa
}
bool QgsLayoutItemMapItem::writeXml( QDomElement &element, QDomDocument &document, const QgsReadWriteContext & ) const
bool QgsLayoutItemMapItem::writeXml( QDomElement &element, QDomDocument &document, const QgsReadWriteContext &context ) const
{
Q_UNUSED( document )
QgsLayoutObject::writeObjectPropertiesToElement( element, document, context );
element.setAttribute( QStringLiteral( "uuid" ), mUuid );
element.setAttribute( QStringLiteral( "name" ), mName );
element.setAttribute( QStringLiteral( "show" ), mEnabled );
@ -49,9 +52,10 @@ bool QgsLayoutItemMapItem::writeXml( QDomElement &element, QDomDocument &documen
return true;
}
bool QgsLayoutItemMapItem::readXml( const QDomElement &itemElem, const QDomDocument &doc, const QgsReadWriteContext & )
bool QgsLayoutItemMapItem::readXml( const QDomElement &itemElem, const QDomDocument &doc, const QgsReadWriteContext &context )
{
Q_UNUSED( doc )
QgsLayoutObject::readObjectPropertiesFromElement( itemElem, doc, context );
mUuid = itemElem.attribute( QStringLiteral( "uuid" ) );
mName = itemElem.attribute( QStringLiteral( "name" ) );
mEnabled = ( itemElem.attribute( QStringLiteral( "show" ), QStringLiteral( "0" ) ) != QLatin1String( "0" ) );

View File

@ -68,6 +68,14 @@ void QgsLayoutObject::initPropertyDefinitions()
{ QgsLayoutObject::MapAtlasMargin, QgsPropertyDefinition( "dataDefinedMapAtlasMargin", QObject::tr( "Atlas margin" ), QgsPropertyDefinition::DoublePositive ) },
{ QgsLayoutObject::MapLayers, QgsPropertyDefinition( "dataDefinedMapLayers", QgsPropertyDefinition::DataTypeString, QObject::tr( "Map Layers" ), tr( "list of map layer names separated by | characters" ) ) },
{ QgsLayoutObject::MapStylePreset, QgsPropertyDefinition( "dataDefinedMapStylePreset", QgsPropertyDefinition::DataTypeString, QObject::tr( "Map theme" ), tr( "name of an existing map theme (case-sensitive)" ) ) },
{ QgsLayoutObject::MapGridEnabled, QgsPropertyDefinition( "dataDefinedMapGridEnabled", QObject::tr( "Grid enabled" ), QgsPropertyDefinition::Boolean ) },
{ QgsLayoutObject::MapGridIntervalX, QgsPropertyDefinition( "dataDefinedMapGridIntervalX", QObject::tr( "Grid interval X" ), QgsPropertyDefinition::DoublePositive ) },
{ QgsLayoutObject::MapGridIntervalY, QgsPropertyDefinition( "dataDefinedMapGridIntervalY", QObject::tr( "Grid interval Y" ), QgsPropertyDefinition::DoublePositive ) },
{ QgsLayoutObject::MapGridOffsetX, QgsPropertyDefinition( "dataDefinedMapGridOffsetX", QObject::tr( "Grid offset X" ), QgsPropertyDefinition::Double ) },
{ QgsLayoutObject::MapGridOffsetY, QgsPropertyDefinition( "dataDefinedMapGridOffsetY", QObject::tr( "Grid offset Y" ), QgsPropertyDefinition::Double ) },
{ QgsLayoutObject::MapGridFrameSize, QgsPropertyDefinition( "dataDefinedMapGridFrameSize", QObject::tr( "Grid frame size" ), QgsPropertyDefinition::DoublePositive ) },
{ QgsLayoutObject::MapGridFrameMargin, QgsPropertyDefinition( "dataDefinedMapGridFrameMargin", QObject::tr( "Grid frame margin" ), QgsPropertyDefinition::DoublePositive ) },
{ QgsLayoutObject::MapGridLabelDistance, QgsPropertyDefinition( "dataDefinedMapGridLabelDistance", QObject::tr( "Grid label distance" ), QgsPropertyDefinition::DoublePositive ) },
{ QgsLayoutObject::PictureSource, QgsPropertyDefinition( "dataDefinedSource", QObject::tr( "Picture source (URL)" ), QgsPropertyDefinition::String ) },
{ QgsLayoutObject::SourceUrl, QgsPropertyDefinition( "dataDefinedSourceUrl", QObject::tr( "Source URL" ), QgsPropertyDefinition::String ) },
{ QgsLayoutObject::PictureSvgBackgroundColor, QgsPropertyDefinition( "dataDefinedSvgBackgroundColor", QObject::tr( "SVG background color" ), QgsPropertyDefinition::ColorWithAlpha ) },

View File

@ -164,6 +164,14 @@ class CORE_EXPORT QgsLayoutObject: public QObject, public QgsExpressionContextGe
MapLayers, //!< Map layer set
MapStylePreset, //!< Layer and style map theme
MapLabelMargin, //!< Map label margin
MapGridEnabled, //!< Map grid enabled
MapGridIntervalX, //!< Map grid interval X
MapGridIntervalY, //!< Map grid interval Y
MapGridOffsetX, //!< Map grid offset X
MapGridOffsetY, //!< Map grid offset Y
MapGridFrameSize, //!< Map grid frame size
MapGridFrameMargin, //!< Map grid frame margin
MapGridLabelDistance, //!< Map grid label distance
//composer picture
PictureSource, //!< Picture source url
PictureSvgBackgroundColor, //!< SVG background color

View File

@ -47,9 +47,9 @@
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>389</width>
<height>1452</height>
<y>-48</y>
<width>394</width>
<height>1110</height>
</rect>
</property>
<property name="sizePolicy">
@ -65,22 +65,80 @@
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="QLabel" name="label_2">
<property name="text">
<string>Enabled</string>
</property>
</widget>
</item>
<item>
<widget class="QgsPropertyOverrideButton" name="mEnabledDDBtn">
<property name="text">
<string>…</string>
</property>
</widget>
</item>
</layout>
</item>
<item>
<widget class="QgsCollapsibleGroupBoxBasic" name="mGridCheckBox">
<property name="title">
<string>Appearance</string>
</property>
<layout class="QGridLayout" name="gridLayout_6" columnstretch="0,0">
<item row="0" column="0">
<layout class="QGridLayout" name="gridLayout_6" columnstretch="0,1,0">
<item row="9" column="0">
<widget class="QLabel" name="mMarkerStyleLabel">
<property name="text">
<string>Marker style</string>
</property>
<property name="wordWrap">
<bool>false</bool>
</property>
</widget>
</item>
<item row="6" column="0">
<widget class="QLabel" name="mOffsetXLabel_2">
<property name="text">
<string>Offset</string>
</property>
<property name="wordWrap">
<bool>false</bool>
</property>
</widget>
</item>
<item row="7" column="1">
<widget class="QgsDoubleSpinBox" name="mCrossWidthSpinBox">
<property name="suffix">
<string> mm</string>
</property>
<property name="decimals">
<number>2</number>
</property>
<property name="showClearButton" stdset="0">
<bool>false</bool>
</property>
</widget>
</item>
<item row="8" column="0">
<widget class="QLabel" name="mLineStyleLabel">
<property name="text">
<string>Line style</string>
</property>
<property name="wordWrap">
<bool>false</bool>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="mGridTypeLabel_2">
<property name="accessibleName">
<string extracomment="Hello translotor"/>
@ -93,31 +151,65 @@
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QComboBox" name="mGridTypeComboBox"/>
</item>
<item row="1" column="0">
<item row="3" column="0">
<widget class="QLabel" name="mMapGridCRSLabel">
<property name="text">
<string>CRS</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QPushButton" name="mMapGridCRSButton">
<item row="5" column="0">
<widget class="QLabel" name="mIntervalXLabel_2">
<property name="text">
<string>Change…</string>
<string>Interval</string>
</property>
<property name="wordWrap">
<bool>false</bool>
</property>
</widget>
</item>
<item row="2" column="0">
<item row="7" column="0">
<widget class="QLabel" name="mCrossWidthLabel">
<property name="text">
<string>Cross width</string>
</property>
<property name="wordWrap">
<bool>false</bool>
</property>
</widget>
</item>
<item row="10" column="0">
<widget class="QLabel" name="mGridBlendLabel">
<property name="text">
<string>Blend mode</string>
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QLabel" name="mMapGridUnitLabel">
<property name="text">
<string>Interval units</string>
</property>
</widget>
</item>
<item row="2" column="1">
<item row="7" column="2">
<widget class="QgsPropertyOverrideButton" name="mCrossWidthDDBtn">
<property name="text">
<string>…</string>
</property>
</widget>
</item>
<item row="2" column="1" colspan="2">
<widget class="QComboBox" name="mGridTypeComboBox"/>
</item>
<item row="3" column="1" colspan="2">
<widget class="QPushButton" name="mMapGridCRSButton">
<property name="text">
<string>Change…</string>
</property>
</widget>
</item>
<item row="4" column="1" colspan="2">
<widget class="QComboBox" name="mMapGridUnitComboBox">
<item>
<property name="text">
@ -136,19 +228,9 @@
</item>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="mIntervalXLabel_2">
<property name="text">
<string>Interval</string>
</property>
<property name="wordWrap">
<bool>false</bool>
</property>
</widget>
</item>
<item row="3" column="1">
<layout class="QVBoxLayout" name="verticalLayout_9">
<item>
<item row="5" column="1" colspan="2">
<layout class="QGridLayout" name="gridLayout_2">
<item row="0" column="0">
<widget class="QgsDoubleSpinBox" name="mIntervalXSpinBox">
<property name="prefix">
<string>X </string>
@ -161,7 +243,7 @@
</property>
</widget>
</item>
<item>
<item row="1" column="0">
<widget class="QgsDoubleSpinBox" name="mIntervalYSpinBox">
<property name="prefix">
<string>Y </string>
@ -174,21 +256,25 @@
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QgsPropertyOverrideButton" name="mIntervalXDDBtn">
<property name="text">
<string>…</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QgsPropertyOverrideButton" name="mIntervalYDDBtn">
<property name="text">
<string>…</string>
</property>
</widget>
</item>
</layout>
</item>
<item row="4" column="0">
<widget class="QLabel" name="mOffsetXLabel_2">
<property name="text">
<string>Offset</string>
</property>
<property name="wordWrap">
<bool>false</bool>
</property>
</widget>
</item>
<item row="4" column="1">
<layout class="QVBoxLayout" name="verticalLayout_10">
<item>
<item row="6" column="1" colspan="2">
<layout class="QGridLayout" name="gridLayout_5">
<item row="0" column="0">
<widget class="QgsDoubleSpinBox" name="mOffsetXSpinBox">
<property name="prefix">
<string>X </string>
@ -201,7 +287,7 @@
</property>
</widget>
</item>
<item>
<item row="1" column="0">
<widget class="QgsDoubleSpinBox" name="mOffsetYSpinBox">
<property name="prefix">
<string>Y </string>
@ -214,62 +300,23 @@
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QgsPropertyOverrideButton" name="mOffsetXDDBtn">
<property name="text">
<string>…</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QgsPropertyOverrideButton" name="mOffsetYDDBtn">
<property name="text">
<string>…</string>
</property>
</widget>
</item>
</layout>
</item>
<item row="5" column="0">
<widget class="QLabel" name="mCrossWidthLabel">
<property name="text">
<string>Cross width</string>
</property>
<property name="wordWrap">
<bool>false</bool>
</property>
</widget>
</item>
<item row="5" column="1">
<widget class="QgsDoubleSpinBox" name="mCrossWidthSpinBox">
<property name="suffix">
<string> mm</string>
</property>
<property name="decimals">
<number>2</number>
</property>
<property name="showClearButton" stdset="0">
<bool>false</bool>
</property>
</widget>
</item>
<item row="6" column="0">
<widget class="QLabel" name="mLineStyleLabel">
<property name="text">
<string>Line style</string>
</property>
<property name="wordWrap">
<bool>false</bool>
</property>
</widget>
</item>
<item row="7" column="0">
<widget class="QLabel" name="mMarkerStyleLabel">
<property name="text">
<string>Marker style</string>
</property>
<property name="wordWrap">
<bool>false</bool>
</property>
</widget>
</item>
<item row="8" column="0">
<widget class="QLabel" name="mGridBlendLabel">
<property name="text">
<string>Blend mode</string>
</property>
</widget>
</item>
<item row="8" column="1">
<widget class="QgsBlendModeComboBox" name="mGridBlendComboBox"/>
</item>
<item row="6" column="1">
<item row="8" column="1" colspan="2">
<widget class="QgsSymbolButton" name="mGridLineStyleButton">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
@ -282,7 +329,7 @@
</property>
</widget>
</item>
<item row="7" column="1">
<item row="9" column="1" colspan="2">
<widget class="QgsSymbolButton" name="mGridMarkerStyleButton">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
@ -295,6 +342,9 @@
</property>
</widget>
</item>
<item row="10" column="1" colspan="2">
<widget class="QgsBlendModeComboBox" name="mGridBlendComboBox"/>
</item>
</layout>
</widget>
</item>
@ -309,109 +359,8 @@
<property name="syncGroup" stdset="0">
<string notr="true">composermapgrid</string>
</property>
<layout class="QGridLayout" name="gridLayout_3" columnstretch="0,1,1">
<item row="0" column="0">
<widget class="QLabel" name="mFrameStyleLabel_2">
<property name="text">
<string>Frame style</string>
</property>
<property name="wordWrap">
<bool>false</bool>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="mFrameWidthLabel">
<property name="text">
<string>Frame size</string>
</property>
<property name="wordWrap">
<bool>false</bool>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="mFramePenLabel">
<property name="text">
<string>Frame line thickness</string>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QgsDoubleSpinBox" name="mGridFramePenSizeSpinBox">
<property name="suffix">
<string> mm</string>
</property>
<property name="showClearButton" stdset="0">
<bool>false</bool>
</property>
</widget>
</item>
<item row="3" column="2">
<widget class="QgsColorButton" name="mGridFramePenColorButton">
<property name="minimumSize">
<size>
<width>100</width>
<height>0</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>100</width>
<height>16777215</height>
</size>
</property>
<property name="text">
<string/>
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QLabel" name="mFrameFillLabel">
<property name="text">
<string>Frame fill colors</string>
</property>
</widget>
</item>
<item row="4" column="1">
<widget class="QgsColorButton" name="mGridFrameFill1ColorButton">
<property name="minimumSize">
<size>
<width>100</width>
<height>0</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>100</width>
<height>16777215</height>
</size>
</property>
<property name="text">
<string/>
</property>
</widget>
</item>
<item row="4" column="2">
<widget class="QgsColorButton" name="mGridFrameFill2ColorButton">
<property name="minimumSize">
<size>
<width>100</width>
<height>0</height>
</size>
</property>
<property name="maximumSize">
<size>
<width>100</width>
<height>16777215</height>
</size>
</property>
<property name="text">
<string/>
</property>
</widget>
</item>
<item row="9" column="0" colspan="3">
<layout class="QGridLayout" name="gridLayout_3" columnstretch="0,0,0,0,0">
<item row="12" column="0" colspan="5">
<layout class="QGridLayout" name="gridLayout_4">
<item row="0" column="0">
<widget class="QCheckBox" name="mCheckGridLeftSide">
@ -443,10 +392,44 @@
</item>
</layout>
</item>
<item row="0" column="1" colspan="2">
<item row="4" column="1" colspan="3">
<widget class="QgsDoubleSpinBox" name="mGridFrameMarginSpinBox">
<property name="suffix">
<string> mm</string>
</property>
<property name="showClearButton" stdset="0">
<bool>false</bool>
</property>
</widget>
</item>
<item row="1" column="1" colspan="4">
<widget class="QComboBox" name="mFrameStyleComboBox"/>
</item>
<item row="1" column="1" colspan="2">
<item row="8" column="0">
<widget class="QLabel" name="mLeftDivisionsLabel">
<property name="text">
<string>Left divisions</string>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="mFrameWidthLabel">
<property name="text">
<string>Frame size</string>
</property>
<property name="wordWrap">
<bool>false</bool>
</property>
</widget>
</item>
<item row="9" column="0">
<widget class="QLabel" name="mRightDivisionsLabel">
<property name="text">
<string>Right divisions</string>
</property>
</widget>
</item>
<item row="2" column="1" colspan="3">
<widget class="QgsDoubleSpinBox" name="mFrameWidthSpinBox">
<property name="suffix">
<string> mm</string>
@ -456,60 +439,148 @@
</property>
</widget>
</item>
<item row="6" column="0">
<widget class="QLabel" name="mRightDivisionsLabel">
<item row="8" column="1" colspan="4">
<widget class="QComboBox" name="mFrameDivisionsLeftComboBox"/>
</item>
<item row="1" column="0">
<widget class="QLabel" name="mFrameStyleLabel_2">
<property name="text">
<string>Right divisions</string>
<string>Frame style</string>
</property>
<property name="wordWrap">
<bool>false</bool>
</property>
</widget>
</item>
<item row="5" column="0">
<widget class="QLabel" name="mLeftDivisionsLabel">
<property name="text">
<string>Left divisions</string>
</property>
</widget>
<item row="10" column="1" colspan="4">
<widget class="QComboBox" name="mFrameDivisionsTopComboBox"/>
</item>
<item row="7" column="0">
<item row="9" column="1" colspan="4">
<widget class="QComboBox" name="mFrameDivisionsRightComboBox"/>
</item>
<item row="10" column="0">
<widget class="QLabel" name="mTopDivisionsLabel">
<property name="text">
<string>Top divisions</string>
</property>
</widget>
</item>
<item row="8" column="0">
<item row="6" column="0">
<widget class="QLabel" name="mFramePenLabel">
<property name="text">
<string>Frame line thickness</string>
</property>
</widget>
</item>
<item row="6" column="1">
<widget class="QgsDoubleSpinBox" name="mGridFramePenSizeSpinBox">
<property name="suffix">
<string> mm</string>
</property>
<property name="showClearButton" stdset="0">
<bool>false</bool>
</property>
</widget>
</item>
<item row="4" column="4">
<widget class="QgsPropertyOverrideButton" name="mFrameMarginDDBtn">
<property name="text">
<string>…</string>
</property>
</widget>
</item>
<item row="11" column="1" colspan="4">
<widget class="QComboBox" name="mFrameDivisionsBottomComboBox"/>
</item>
<item row="11" column="0">
<widget class="QLabel" name="mBottomDivisionsLabel">
<property name="text">
<string>Bottom divisions</string>
</property>
</widget>
</item>
<item row="5" column="1" colspan="2">
<widget class="QComboBox" name="mFrameDivisionsLeftComboBox"/>
<item row="7" column="0">
<widget class="QLabel" name="mFrameFillLabel">
<property name="text">
<string>Frame fill colors</string>
</property>
</widget>
</item>
<item row="6" column="1" colspan="2">
<widget class="QComboBox" name="mFrameDivisionsRightComboBox"/>
<item row="2" column="4">
<widget class="QgsPropertyOverrideButton" name="mFrameSizeDDBtn">
<property name="text">
<string>…</string>
</property>
</widget>
</item>
<item row="7" column="1" colspan="2">
<widget class="QComboBox" name="mFrameDivisionsTopComboBox"/>
</item>
<item row="8" column="1" colspan="2">
<widget class="QComboBox" name="mFrameDivisionsBottomComboBox"/>
</item>
<item row="2" column="0">
<item row="4" column="0">
<widget class="QLabel" name="mFrameMarginLabel">
<property name="text">
<string>Frame margin</string>
</property>
</widget>
</item>
<item row="2" column="1" colspan="2">
<widget class="QgsDoubleSpinBox" name="mGridFrameMarginSpinBox">
<property name="suffix">
<string> mm</string>
<item row="6" column="2">
<widget class="QgsPropertyOverrideButton" name="mCrossWidthDDBtn_4">
<property name="text">
<string></string>
</property>
<property name="showClearButton" stdset="0">
<bool>false</bool>
</widget>
</item>
<item row="7" column="3" colspan="2">
<widget class="QgsColorButton" name="mGridFrameFill2ColorButton">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>100</width>
<height>0</height>
</size>
</property>
<property name="text">
<string/>
</property>
</widget>
</item>
<item row="7" column="1" colspan="2">
<widget class="QgsColorButton" name="mGridFrameFill1ColorButton">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>100</width>
<height>0</height>
</size>
</property>
<property name="text">
<string/>
</property>
</widget>
</item>
<item row="6" column="3" colspan="2">
<widget class="QgsColorButton" name="mGridFramePenColorButton">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>100</width>
<height>0</height>
</size>
</property>
<property name="text">
<string/>
</property>
</widget>
</item>
@ -528,7 +599,7 @@
<bool>true</bool>
</property>
<property name="checked">
<bool>false</bool>
<bool>true</bool>
</property>
<property name="syncGroup" stdset="0">
<string notr="true">composermapgrid</string>
@ -536,7 +607,17 @@
<property name="collapsed" stdset="0">
<bool>false</bool>
</property>
<layout class="QGridLayout" name="gridLayout">
<layout class="QGridLayout" name="gridLayout" columnstretch="0,1,0">
<item row="10" column="0">
<widget class="QLabel" name="mAnnotationPositionLabelBottom">
<property name="text">
<string>Bottom</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QLabel" name="mAnnotationFormatLabel">
<property name="text">
@ -544,62 +625,13 @@
</property>
</widget>
</item>
<item row="0" column="1">
<layout class="QHBoxLayout" name="horizontalLayout_13">
<item>
<widget class="QComboBox" name="mAnnotationFormatComboBox"/>
</item>
<item>
<widget class="QToolButton" name="mAnnotationFormatButton">
<property name="text">
<string>…</string>
</property>
<property name="icon">
<iconset resource="../../../images/images.qrc">
<normaloff>:/images/themes/default/mIconExpression.svg</normaloff>:/images/themes/default/mIconExpression.svg</iconset>
</property>
</widget>
</item>
</layout>
</item>
<item row="1" column="0">
<widget class="QLabel" name="mAnnotationPositionLabelLeft">
<item row="14" column="0">
<widget class="QLabel" name="mFontColorLabel">
<property name="text">
<string>Left</string>
</property>
<property name="wordWrap">
<bool>true</bool>
<string>Font color</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QComboBox" name="mAnnotationDisplayLeftComboBox"/>
</item>
<item row="2" column="1">
<widget class="QComboBox" name="mAnnotationPositionLeftComboBox"/>
</item>
<item row="3" column="1">
<widget class="QComboBox" name="mAnnotationDirectionComboBoxLeft"/>
</item>
<item row="4" column="0">
<widget class="QLabel" name="mAnnotationPositionLabelRight">
<property name="text">
<string>Right</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
<item row="4" column="1">
<widget class="QComboBox" name="mAnnotationDisplayRightComboBox"/>
</item>
<item row="5" column="1">
<widget class="QComboBox" name="mAnnotationPositionRightComboBox"/>
</item>
<item row="6" column="1">
<widget class="QComboBox" name="mAnnotationDirectionComboBoxRight"/>
</item>
<item row="7" column="0">
<widget class="QLabel" name="mAnnotationPositionLabelTop">
<property name="text">
@ -610,52 +642,10 @@
</property>
</widget>
</item>
<item row="7" column="1">
<widget class="QComboBox" name="mAnnotationDisplayTopComboBox"/>
</item>
<item row="8" column="1">
<widget class="QComboBox" name="mAnnotationPositionTopComboBox"/>
</item>
<item row="9" column="1">
<widget class="QComboBox" name="mAnnotationDirectionComboBoxTop"/>
</item>
<item row="10" column="0">
<widget class="QLabel" name="mAnnotationPositionLabelBottom">
<item row="1" column="0">
<widget class="QLabel" name="mAnnotationPositionLabelLeft">
<property name="text">
<string>Bottom</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
<item row="10" column="1">
<widget class="QComboBox" name="mAnnotationDisplayBottomComboBox"/>
</item>
<item row="11" column="1">
<widget class="QComboBox" name="mAnnotationPositionBottomComboBox"/>
</item>
<item row="12" column="1">
<widget class="QComboBox" name="mAnnotationDirectionComboBoxBottom"/>
</item>
<item row="13" column="0">
<widget class="QLabel" name="label">
<property name="text">
<string>Font</string>
</property>
</widget>
</item>
<item row="14" column="0">
<widget class="QLabel" name="mFontColorLabel">
<property name="text">
<string>Font color</string>
</property>
</widget>
</item>
<item row="15" column="0">
<widget class="QLabel" name="mDistanceToFrameLabel">
<property name="text">
<string>Distance to map frame</string>
<string>Left</string>
</property>
<property name="wordWrap">
<bool>true</bool>
@ -679,14 +669,48 @@
</property>
</widget>
</item>
<item row="16" column="1">
<item row="13" column="0">
<widget class="QLabel" name="label">
<property name="text">
<string>Font</string>
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QLabel" name="mAnnotationPositionLabelRight">
<property name="text">
<string>Right</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
<item row="15" column="0">
<widget class="QLabel" name="mDistanceToFrameLabel">
<property name="text">
<string>Distance to map frame</string>
</property>
<property name="wordWrap">
<bool>true</bool>
</property>
</widget>
</item>
<item row="15" column="2">
<widget class="QgsPropertyOverrideButton" name="mLabelDistDDBtn">
<property name="text">
<string>…</string>
</property>
</widget>
</item>
<item row="16" column="1" colspan="2">
<widget class="QgsSpinBox" name="mCoordinatePrecisionSpinBox">
<property name="showClearButton" stdset="0">
<bool>false</bool>
</property>
</widget>
</item>
<item row="14" column="1">
<item row="14" column="1" colspan="2">
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QgsColorButton" name="mAnnotationFontColorButton">
@ -716,7 +740,7 @@
</item>
</layout>
</item>
<item row="13" column="1">
<item row="13" column="1" colspan="2">
<widget class="QgsFontButton" name="mAnnotationFontButton">
<property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Fixed">
@ -729,6 +753,60 @@
</property>
</widget>
</item>
<item row="12" column="1" colspan="2">
<widget class="QComboBox" name="mAnnotationDirectionComboBoxBottom"/>
</item>
<item row="11" column="1" colspan="2">
<widget class="QComboBox" name="mAnnotationPositionBottomComboBox"/>
</item>
<item row="10" column="1" colspan="2">
<widget class="QComboBox" name="mAnnotationDisplayBottomComboBox"/>
</item>
<item row="9" column="1" colspan="2">
<widget class="QComboBox" name="mAnnotationDirectionComboBoxTop"/>
</item>
<item row="8" column="1" colspan="2">
<widget class="QComboBox" name="mAnnotationPositionTopComboBox"/>
</item>
<item row="7" column="1" colspan="2">
<widget class="QComboBox" name="mAnnotationDisplayTopComboBox"/>
</item>
<item row="6" column="1" colspan="2">
<widget class="QComboBox" name="mAnnotationDirectionComboBoxRight"/>
</item>
<item row="5" column="1" colspan="2">
<widget class="QComboBox" name="mAnnotationPositionRightComboBox"/>
</item>
<item row="4" column="1" colspan="2">
<widget class="QComboBox" name="mAnnotationDisplayRightComboBox"/>
</item>
<item row="3" column="1" colspan="2">
<widget class="QComboBox" name="mAnnotationDirectionComboBoxLeft"/>
</item>
<item row="2" column="1" colspan="2">
<widget class="QComboBox" name="mAnnotationPositionLeftComboBox"/>
</item>
<item row="1" column="1" colspan="2">
<widget class="QComboBox" name="mAnnotationDisplayLeftComboBox"/>
</item>
<item row="0" column="1" colspan="2">
<layout class="QHBoxLayout" name="horizontalLayout_13">
<item>
<widget class="QComboBox" name="mAnnotationFormatComboBox"/>
</item>
<item>
<widget class="QToolButton" name="mAnnotationFormatButton">
<property name="text">
<string>…</string>
</property>
<property name="icon">
<iconset>
<normaloff>:/images/themes/default/mIconExpression.svg</normaloff>:/images/themes/default/mIconExpression.svg</iconset>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
</item>
@ -783,6 +861,11 @@
<extends>QToolButton</extends>
<header>qgssymbolbutton.h</header>
</customwidget>
<customwidget>
<class>QgsPropertyOverrideButton</class>
<extends>QToolButton</extends>
<header>qgspropertyoverridebutton.h</header>
</customwidget>
</customwidgets>
<tabstops>
<tabstop>scrollArea</tabstop>
@ -833,39 +916,6 @@
<tabstop>mDistanceToMapFrameSpinBox</tabstop>
<tabstop>mCoordinatePrecisionSpinBox</tabstop>
</tabstops>
<resources>
<include location="../../../images/images.qrc"/>
<include location="../../../images/images.qrc"/>
<include location="../../../images/images.qrc"/>
<include location="../../../images/images.qrc"/>
<include location="../../../images/images.qrc"/>
<include location="../../../images/images.qrc"/>
<include location="../../../images/images.qrc"/>
<include location="../../../images/images.qrc"/>
<include location="../../../images/images.qrc"/>
<include location="../../../images/images.qrc"/>
<include location="../../../images/images.qrc"/>
<include location="../../../images/images.qrc"/>
<include location="../../../images/images.qrc"/>
<include location="../../../images/images.qrc"/>
<include location="../../../images/images.qrc"/>
<include location="../../../images/images.qrc"/>
<include location="../../../images/images.qrc"/>
<include location="../../../images/images.qrc"/>
<include location="../../../images/images.qrc"/>
<include location="../../../images/images.qrc"/>
<include location="../../../images/images.qrc"/>
<include location="../../../images/images.qrc"/>
<include location="../../../images/images.qrc"/>
<include location="../../../images/images.qrc"/>
<include location="../../../images/images.qrc"/>
<include location="../../../images/images.qrc"/>
<include location="../../../images/images.qrc"/>
<include location="../../../images/images.qrc"/>
<include location="../../../images/images.qrc"/>
<include location="../../../images/images.qrc"/>
<include location="../../../images/images.qrc"/>
<include location="../../../images/images.qrc"/>
</resources>
<resources/>
<connections/>
</ui>