QGIS API Documentation  3.8.0-Zanzibar (11aff65)
qgslayoutitemregistry.cpp
Go to the documentation of this file.
1 /***************************************************************************
2  qgslayoutitemregistry.cpp
3  -------------------------
4  begin : June 2017
5  copyright : (C) 2017 by Nyall Dawson
6  email : nyall dot dawson at gmail dot com
7  ***************************************************************************/
8 /***************************************************************************
9  * *
10  * This program is free software; you can redistribute it and/or modify *
11  * it under the terms of the GNU General Public License as published by *
12  * the Free Software Foundation; either version 2 of the License, or *
13  * (at your option) any later version. *
14  * *
15  ***************************************************************************/
16 
17 #include "qgslayoutitemregistry.h"
18 #include "qgslayoutitemshape.h"
19 #include "qgslayoutitemmap.h"
20 #include "qgslayoutitemlabel.h"
21 #include "qgslayoutitemlegend.h"
22 #include "qgslayoutitempolygon.h"
23 #include "qgslayoutitempolyline.h"
24 #include "qgslayoutitempage.h"
25 #include "qgslayoutitempicture.h"
26 #include "qgslayoutitemgroup.h"
27 #include "qgslayoutitemhtml.h"
28 #include "qgslayoutitemscalebar.h"
30 #include "qgslayoutitemtexttable.h"
31 #include "qgslayoutframe.h"
32 #include "qgsgloweffect.h"
33 #include "qgseffectstack.h"
34 #include "qgsvectorlayer.h"
35 
36 #include <QPainter>
37 
39  : QObject( parent )
40 {
41 }
42 
44 {
45  qDeleteAll( mMetadata );
46  qDeleteAll( mMultiFrameMetadata );
47 }
48 
50 {
51  if ( !mMetadata.isEmpty() )
52  return false;
53 
54 #if 0
55  // add temporary item to register
56  auto createTemporaryItem = []( QgsLayout * layout )->QgsLayoutItem *
57  {
58  return new TestLayoutItem( layout );
59  };
60 
61  addLayoutItemType( new QgsLayoutItemMetadata( QgsLayoutItemRegistry::LayoutItem + 1002, QStringLiteral( "temp type" ), createTemporaryItem ) );
62 #endif
63 
72  addLayoutItemType( new QgsLayoutItemMetadata( LayoutShape, QObject::tr( "Shape" ), []( QgsLayout * layout )
73  {
74  QgsLayoutItemShape *shape = new QgsLayoutItemShape( layout );
76  return shape;
77  } ) );
80 
84 
85  return true;
86 }
87 
89 {
90  return mMetadata.value( type );
91 }
92 
94 {
95  return mMultiFrameMetadata.value( type );
96 }
97 
99 {
100  if ( !metadata || mMetadata.contains( metadata->type() ) )
101  return false;
102 
103  mMetadata[metadata->type()] = metadata;
104  emit typeAdded( metadata->type(), metadata->visibleName() );
105  return true;
106 }
107 
109 {
110  if ( !metadata || mMultiFrameMetadata.contains( metadata->type() ) )
111  return false;
112 
113  mMultiFrameMetadata[metadata->type()] = metadata;
114  emit multiFrameTypeAdded( metadata->type(), metadata->visibleName() );
115  return true;
116 }
117 
119 {
120  if ( !mMetadata.contains( type ) )
121  return nullptr;
122 
123  return mMetadata[type]->createItem( layout );
124 }
125 
127 {
128  if ( !mMultiFrameMetadata.contains( type ) )
129  return nullptr;
130 
131  return mMultiFrameMetadata[type]->createMultiFrame( layout );
132 }
133 
134 void QgsLayoutItemRegistry::resolvePaths( int type, QVariantMap &properties, const QgsPathResolver &pathResolver, bool saving ) const
135 {
136  if ( mMetadata.contains( type ) )
137  {
138  mMetadata[type]->resolvePaths( properties, pathResolver, saving );
139  }
140  else if ( mMultiFrameMetadata.contains( type ) )
141  {
142  mMultiFrameMetadata[type]->resolvePaths( properties, pathResolver, saving );
143  }
144 }
145 
146 QMap<int, QString> QgsLayoutItemRegistry::itemTypes() const
147 {
148  QMap<int, QString> types;
149  for ( auto it = mMetadata.constBegin(); it != mMetadata.constEnd(); ++it )
150  {
151  types.insert( it.key(), it.value()->visibleName() );
152  }
153  for ( auto it = mMultiFrameMetadata.constBegin(); it != mMultiFrameMetadata.constEnd(); ++it )
154  {
155  types.insert( it.key(), it.value()->visibleName() );
156  }
157 
158  return types;
159 }
160 
162 #if 0
163 TestLayoutItem::TestLayoutItem( QgsLayout *layout )
164  : QgsLayoutItem( layout )
165 {
166  int h = static_cast< int >( 360.0 * qrand() / ( RAND_MAX + 1.0 ) );
167  int s = ( qrand() % ( 200 - 100 + 1 ) ) + 100;
168  int v = ( qrand() % ( 130 - 255 + 1 ) ) + 130;
169  mColor = QColor::fromHsv( h, s, v );
170 
171  QgsStringMap properties;
172  properties.insert( QStringLiteral( "color" ), mColor.name() );
173  properties.insert( QStringLiteral( "style" ), QStringLiteral( "solid" ) );
174  properties.insert( QStringLiteral( "style_border" ), QStringLiteral( "solid" ) );
175  properties.insert( QStringLiteral( "color_border" ), QStringLiteral( "black" ) );
176  properties.insert( QStringLiteral( "width_border" ), QStringLiteral( "0.3" ) );
177  properties.insert( QStringLiteral( "joinstyle" ), QStringLiteral( "miter" ) );
178  mShapeStyleSymbol = QgsFillSymbol::createSimple( properties );
179 
180 }
181 
182 void TestLayoutItem::draw( QgsRenderContext &context, const QStyleOptionGraphicsItem *itemStyle )
183 {
184  Q_UNUSED( itemStyle )
185 
186  QgsEffectStack stack;
187  stack.appendEffect( new QgsDrawSourceEffect() );
188  stack.appendEffect( new QgsInnerGlowEffect() );
189  stack.begin( context );
190 
191  QPainter *painter = context.painter();
192 
193  painter->save();
194  painter->setRenderHint( QPainter::Antialiasing, false );
195  painter->setPen( Qt::NoPen );
196  painter->setBrush( mColor );
197 
198  double scale = context.convertToPainterUnits( 1, QgsUnitTypes::RenderMillimeters );
199 
200  QPolygonF shapePolygon = QPolygonF( QRectF( 0, 0, rect().width() * scale, rect().height() * scale ) );
201  QList<QPolygonF> rings; //empty list
202 
203  mShapeStyleSymbol->startRender( context );
204  mShapeStyleSymbol->renderPolygon( shapePolygon, &rings, nullptr, context );
205  mShapeStyleSymbol->stopRender( context );
206 
207 // painter->drawRect( r );
208  painter->restore();
209  stack.end( context );
210 }
211 #endif
212 
void setShapeType(QgsLayoutItemShape::Shape type)
Sets the type of shape (e.g.
void resolvePaths(int type, QVariantMap &properties, const QgsPathResolver &pathResolver, bool saving) const
Resolve paths in properties of a particular symbol layer.
static QgsLayoutItemHtml * create(QgsLayout *layout)
Returns a new QgsLayoutItemHtml for the specified parent layout.
QgsLayoutItem * createItem(int type, QgsLayout *layout) const
Creates a new instance of a layout item given the item type, and target layout.
Base class for graphical items within a QgsLayout.
static QgsLayoutItemTextTable * create(QgsLayout *layout)
Returns a new QgsLayoutItemTextTable for the specified parent layout.
int type() const
Returns the unique item type code for the layout item class.
static QgsLayoutItemGroup * create(QgsLayout *layout)
Returns a new group item for the specified layout.
bool addLayoutMultiFrameType(QgsLayoutMultiFrameAbstractMetadata *metadata)
Registers a new layout multiframe type.
static QgsLayoutItemPolygon * create(QgsLayout *layout)
Returns a new polygon item for the specified layout.
Convenience metadata class that uses static functions to create layout items and their configuration ...
static QgsFillSymbol * createSimple(const QgsStringMap &properties)
Create a fill symbol with one symbol layer: SimpleFill with specified properties. ...
Definition: qgssymbol.cpp:1184
static QgsLayoutItemMap * create(QgsLayout *layout)
Returns a new map item for the specified layout.
QgsLayoutItemAbstractMetadata * itemMetadata(int type) const
Returns the metadata for the specified item type.
static QgsLayoutItemLabel * create(QgsLayout *layout)
Returns a new label item for the specified layout.
void multiFrameTypeAdded(int type, const QString &name)
Emitted whenever a new multiframe type is added to the registry, with the specified type and visible ...
static QgsLayoutItemPicture * create(QgsLayout *layout)
Returns a new picture item for the specified layout.
Stores metadata about one layout item class.
bool populate()
Populates the registry with standard item types.
QString visibleName() const
Returns a translated, user visible name for the layout multiframe class.
Stores metadata about one layout multiframe class.
Convenience metadata class that uses static functions to create layout multiframes and their configur...
QgsLayoutItemRegistry(QObject *parent=nullptr)
Creates a new empty item registry.
QMap< QString, QString > QgsStringMap
Definition: qgis.h:587
Abstract base class for layout items with the ability to distribute the content to several frames (Qg...
QgsLayoutMultiFrameAbstractMetadata * multiFrameMetadata(int type) const
Returns the metadata for the specified multiframe type.
Layout item for basic filled shapes (e.g.
A paint effect which consists of a stack of other chained paint effects.
Base class for layouts, which can contain items such as maps, labels, scalebars, etc.
Definition: qgslayout.h:49
void appendEffect(QgsPaintEffect *effect)
Appends an effect to the end of the stack.
Frame item, part of a QgsLayoutMultiFrame object.
static QgsLayoutItemAttributeTable * create(QgsLayout *layout)
Returns a new QgsLayoutItemAttributeTable for the specified parent layout.
static QgsLayoutItemPolyline * create(QgsLayout *layout)
Returns a new polyline item for the specified layout.
static QgsLayoutItemLegend * create(QgsLayout *layout)
Returns a new legend item for the specified layout.
Contains information about the context of a rendering operation.
double convertToPainterUnits(double size, QgsUnitTypes::RenderUnit unit, const QgsMapUnitScale &scale=QgsMapUnitScale()) const
Converts a size from the specified units to painter units (pixels).
QPainter * painter()
Returns the destination QPainter for the render operation.
QgsLayoutMultiFrame * createMultiFrame(int type, QgsLayout *layout) const
Creates a new instance of a layout multiframe given the multiframe type, and target layout...
static QgsLayoutItemPage * create(QgsLayout *layout)
Returns a new page item for the specified layout.
bool addLayoutItemType(QgsLayoutItemAbstractMetadata *metadata)
Registers a new layout item type.
QString visibleName() const
Returns a translated, user visible name for the layout item class.
int type() const
Returns the unique item type code for the layout multiframe class.
QMap< int, QString > itemTypes() const
Returns a map of available item types to translated name.
A paint effect which draws a glow within a picture.
A paint effect which draws the source picture with minor or no alterations.
Resolves relative paths into absolute paths and vice versa.
virtual void end(QgsRenderContext &context)
Ends interception of paint operations to a render context, and draws the result to the render context...
virtual void begin(QgsRenderContext &context)
Begins intercepting paint operations to a render context.
static QgsLayoutFrame * create(QgsLayout *layout)
Creates a new QgsLayoutFrame belonging to the specified layout.
void typeAdded(int type, const QString &name)
Emitted whenever a new item type is added to the registry, with the specified type and visible name...
static QgsLayoutItemScaleBar * create(QgsLayout *layout)
Returns a new scale bar item for the specified layout.