18#include "moc_qgslayoutitemshape.cpp" 
   35  QVariantMap properties;
 
   36  properties.insert( QStringLiteral( 
"color" ), QStringLiteral( 
"white" ) );
 
   37  properties.insert( QStringLiteral( 
"style" ), QStringLiteral( 
"solid" ) );
 
   38  properties.insert( QStringLiteral( 
"style_border" ), QStringLiteral( 
"solid" ) );
 
   39  properties.insert( QStringLiteral( 
"color_border" ), QStringLiteral( 
"black" ) );
 
   40  properties.insert( QStringLiteral( 
"width_border" ), QStringLiteral( 
"0.3" ) );
 
   41  properties.insert( QStringLiteral( 
"joinstyle" ), QStringLiteral( 
"miter" ) );
 
   43  refreshSymbol( 
false );
 
 
   82  if ( !
id().isEmpty() )
 
   90      return tr( 
"<Ellipse>" );
 
   92      return tr( 
"<Rectangle>" );
 
   94      return tr( 
"<Triangle>" );
 
   97  return tr( 
"<Shape>" );
 
 
  109  if ( 
type == mShape )
 
  116  if ( 
mLayout && 
id().isEmpty() )
 
  119    mLayout->itemsModel()->updateItemDisplayName( 
this );
 
 
  125void QgsLayoutItemShape::refreshSymbol( 
bool redraw )
 
  127  if ( 
auto *lLayout = 
layout() )
 
  133  updateBoundingRect();
 
  141void QgsLayoutItemShape::updateBoundingRect()
 
  143  QRectF rectangle = rect();
 
  144  rectangle.adjust( -mMaxSymbolBleed, -mMaxSymbolBleed, mMaxSymbolBleed, mMaxSymbolBleed );
 
  145  if ( rectangle != mCurrentRectangle )
 
  147    prepareGeometryChange();
 
  148    mCurrentRectangle = rectangle;
 
  158  refreshSymbol( 
true );
 
 
  163  mCornerRadius = radius;
 
 
  169  QPolygonF shapePolygon = mapToScene( calculatePolygon( 1.0 ) );
 
  171  if ( shapePolygon.at( 0 ) != shapePolygon.constLast() )
 
  172    shapePolygon << shapePolygon.at( 0 );
 
 
  178  return mCurrentRectangle;
 
 
  183  return mMaxSymbolBleed;
 
 
  188  if ( mShapeStyleSymbol )
 
 
  205  QPainter *painter = renderContext.
painter();
 
  206  painter->setPen( Qt::NoPen );
 
  207  painter->setBrush( Qt::NoBrush );
 
  211  const QVector<QPolygonF> rings; 
 
 
  218QPolygonF QgsLayoutItemShape::calculatePolygon( 
double scale )
 const 
  220  QPolygonF shapePolygon;
 
  224  const QTransform t = QTransform::fromScale( 100, 100 );
 
  226  const QTransform ti = t.inverted();
 
  233      QPainterPath ellipsePath;
 
  234      ellipsePath.addEllipse( QRectF( 0, 0, rect().width() * scale, rect().height() * scale ) );
 
  235      const QPolygonF ellipsePoly = ellipsePath.toFillPolygon( t );
 
  236      shapePolygon = ti.map( ellipsePoly );
 
  242      if ( mCornerRadius.
length() > 0 )
 
  244        QPainterPath roundedRectPath;
 
  245        const double radius = 
mLayout->convertToLayoutUnits( mCornerRadius ) * scale;
 
  246        roundedRectPath.addRoundedRect( QRectF( 0, 0, rect().width() * scale, rect().height() * scale ), radius, radius );
 
  247        const QPolygonF roundedPoly = roundedRectPath.toFillPolygon( t );
 
  248        shapePolygon = ti.map( roundedPoly );
 
  252        shapePolygon = QPolygonF( QRectF( 0, 0, rect().width() * scale, rect().height() * scale ) );
 
  258      shapePolygon << QPointF( 0, rect().height() * scale );
 
  259      shapePolygon << QPointF( rect().width() * scale, rect().height() * scale );
 
  260      shapePolygon << QPointF( rect().width() / 2.0 * scale, 0 );
 
  261      shapePolygon << QPointF( 0, rect().height() * scale );
 
  270  element.setAttribute( QStringLiteral( 
"shapeType" ), mShape );
 
  271  element.setAttribute( QStringLiteral( 
"cornerRadiusMeasure" ), mCornerRadius.
encodeMeasurement() );
 
  274  element.appendChild( shapeStyleElem );
 
 
  281  mShape = 
static_cast< Shape >( element.attribute( QStringLiteral( 
"shapeType" ), QStringLiteral( 
"0" ) ).toInt() );
 
  282  if ( element.hasAttribute( QStringLiteral( 
"cornerRadiusMeasure" ) ) )
 
  285    mCornerRadius = 
QgsLayoutMeasurement( element.attribute( QStringLiteral( 
"cornerRadius" ), QStringLiteral( 
"0" ) ).toDouble() );
 
  287  const QDomElement shapeStyleSymbolElem = element.firstChildElement( QStringLiteral( 
"symbol" ) );
 
  288  if ( !shapeStyleSymbolElem.isNull() )
 
  290    mShapeStyleSymbol = QgsSymbolLayerUtils::loadSymbol<QgsFillSymbol>( shapeStyleSymbolElem, context );
 
  291    refreshSymbol( 
false );
 
 
@ Millimeters
Millimeters.
 
@ DisableSymbolClippingToExtent
Force symbol clipping to map extent to be disabled in all situations. This will result in slower rend...
 
static QIcon getThemeIcon(const QString &name, const QColor &fillColor=QColor(), const QColor &strokeColor=QColor())
Helper to get a theme icon.
 
A fill symbol type, for rendering Polygon and MultiPolygon geometries.
 
static std::unique_ptr< QgsFillSymbol > createSimple(const QVariantMap &properties)
Create a fill symbol with one symbol layer: SimpleFill with specified properties.
 
void renderPolygon(const QPolygonF &points, const QVector< QPolygonF > *rings, const QgsFeature *f, QgsRenderContext &context, int layer=-1, bool selected=false)
Renders the symbol using the given render context.
 
QgsFillSymbol * clone() const override
Returns a deep copy of this symbol.
 
A geometry is the spatial representation of a feature.
 
static QgsGeometry fromQPolygonF(const QPolygonF &polygon)
Construct geometry from a QPolygonF.
 
Contains settings and helpers relating to a render of a QgsLayoutItem.
 
QgsRenderContext & renderContext()
Returns a reference to the context's render context.
 
Layout item for basic filled shapes (e.g.
 
QRectF boundingRect() const override
 
bool readPropertiesFromElement(const QDomElement &element, const QDomDocument &document, const QgsReadWriteContext &context) override
Sets item state from a DOM element.
 
static QgsLayoutItemShape * create(QgsLayout *layout)
Returns a new shape item for the specified layout.
 
double estimatedFrameBleed() const override
Returns the estimated amount the item's frame bleeds outside the item's actual rectangle.
 
QgsFillSymbol * symbol()
Returns the fill symbol used to draw the shape.
 
~QgsLayoutItemShape() override
 
void setShapeType(QgsLayoutItemShape::Shape type)
Sets the type of shape (e.g.
 
QString displayName() const override
Gets item display name.
 
QgsLayoutItemShape(QgsLayout *layout)
Constructor for QgsLayoutItemShape, with the specified parent layout.
 
QgsGeometry clipPath() const override
Returns the clipping path generated by this item, in layout coordinates.
 
bool writePropertiesToElement(QDomElement &element, QDomDocument &document, const QgsReadWriteContext &context) const override
Stores item state within an XML DOM element.
 
void setSymbol(QgsFillSymbol *symbol)
Sets the fill symbol used to draw the shape.
 
QIcon icon() const override
Returns the item's icon.
 
bool accept(QgsStyleEntityVisitorInterface *visitor) const override
Accepts the specified style entity visitor, causing it to visit all style entities associated with th...
 
int type() const override
 
@ Rectangle
Rectangle shape.
 
@ Triangle
Triangle shape.
 
QgsLayoutItem::Flags itemFlags() const override
Returns the item's flags, which indicate how the item behaves.
 
void draw(QgsLayoutItemRenderContext &context) override
Draws the item's contents using the specified item render context.
 
void setCornerRadius(QgsLayoutMeasurement radius)
Sets the corner radius for rounded rectangle corners.
 
Base class for graphical items within a QgsLayout.
 
virtual void redraw()
Triggers a redraw (update) of the item.
 
virtual void setFrameEnabled(bool drawFrame)
Sets whether this item has a frame drawn around it or not.
 
@ FlagProvidesClipPath
Item can act as a clipping path provider (see clipPath())
 
void sizePositionChanged()
Emitted when the item's size or position changes.
 
virtual QString uuid() const
Returns the item identification string.
 
QString id() const
Returns the item's ID name.
 
void frameChanged()
Emitted if the item's frame style changes.
 
virtual Flags itemFlags() const
Returns the item's flags, which indicate how the item behaves.
 
void clipPathChanged()
Emitted when the item's clipping path has changed.
 
void setBackgroundEnabled(bool drawBackground)
Sets whether this item has a background drawn under it or not.
 
Provides a method of storing measurements for use in QGIS layouts using a variety of different measur...
 
static QgsLayoutMeasurement decodeMeasurement(const QString &string)
Decodes a measurement from a string.
 
QString encodeMeasurement() const
Encodes the layout measurement to a string.
 
double length() const
Returns the length of the measurement.
 
const QgsLayout * layout() const
Returns the layout the object is attached to.
 
QPointer< QgsLayout > mLayout
 
static QgsRenderContext createRenderContextForLayout(QgsLayout *layout, QPainter *painter, double dpi=-1)
Creates a render context suitable for the specified layout and painter destination.
 
Base class for layouts, which can contain items such as maps, labels, scalebars, etc.
 
A container for the context for various read/write operations on objects.
 
Contains information about the context of a rendering operation.
 
double convertToPainterUnits(double size, Qgis::RenderUnit unit, const QgsMapUnitScale &scale=QgsMapUnitScale(), Qgis::RenderSubcomponentProperty property=Qgis::RenderSubcomponentProperty::Generic) const
Converts a size from the specified units to painter units (pixels).
 
QPainter * painter()
Returns the destination QPainter for the render operation.
 
void setFlag(Qgis::RenderContextFlag flag, bool on=true)
Enable or disable a particular flag (other flags are not affected)
 
An interface for classes which can visit style entity (e.g.
 
virtual bool visit(const QgsStyleEntityVisitorInterface::StyleLeaf &entity)
Called when the visitor will visit a style entity.
 
A symbol entity for QgsStyle databases.
 
static QDomElement saveSymbol(const QString &symbolName, const QgsSymbol *symbol, QDomDocument &doc, const QgsReadWriteContext &context)
Writes a symbol definition to XML.
 
static double estimateMaxSymbolBleed(QgsSymbol *symbol, const QgsRenderContext &context)
Returns the maximum estimated bleed for the symbol.
 
void stopRender(QgsRenderContext &context)
Ends the rendering process.
 
void startRender(QgsRenderContext &context, const QgsFields &fields=QgsFields())
Begins the rendering process for the symbol.
 
Contains information relating to the style entity currently being visited.