QGIS API Documentation  3.12.1-BucureČ™ti (121cc00ff0)
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"
31 #include "qgslayoutitemtexttable.h"
32 #include "qgslayoutframe.h"
33 #include "qgsgloweffect.h"
34 #include "qgseffectstack.h"
35 #include "qgsvectorlayer.h"
36 
37 #include <QPainter>
38 
40  : QObject( parent )
41 {
42 }
43 
45 {
46  qDeleteAll( mMetadata );
47  qDeleteAll( mMultiFrameMetadata );
48 }
49 
51 {
52  if ( !mMetadata.isEmpty() )
53  return false;
54 
55 #if 0
56  // add temporary item to register
57  auto createTemporaryItem = []( QgsLayout * layout )->QgsLayoutItem *
58  {
59  return new TestLayoutItem( layout );
60  };
61 
62  addLayoutItemType( new QgsLayoutItemMetadata( QgsLayoutItemRegistry::LayoutItem + 1002, QStringLiteral( "temp type" ), createTemporaryItem ) );
63 #endif
64 
65  addLayoutItemType( new QgsLayoutItemMetadata( LayoutGroup, QObject::tr( "Group" ), QObject::tr( "Groups" ), QgsLayoutItemGroup::create ) );
66  addLayoutItemType( new QgsLayoutItemMetadata( LayoutFrame, QObject::tr( "Frame" ), QObject::tr( "Frames" ), QgsLayoutFrame::create ) );
67  addLayoutItemType( new QgsLayoutItemMetadata( LayoutPage, QObject::tr( "Page" ), QObject::tr( "Pages" ), QgsLayoutItemPage::create ) );
68  addLayoutItemType( new QgsLayoutItemMetadata( LayoutMap, QObject::tr( "Map" ), QObject::tr( "Maps" ), QgsLayoutItemMap::create ) );
69  addLayoutItemType( new QgsLayoutItemMetadata( LayoutPicture, QObject::tr( "Picture" ), QObject::tr( "Pictures" ), QgsLayoutItemPicture::create ) );
70  addLayoutItemType( new QgsLayoutItemMetadata( LayoutLabel, QObject::tr( "Label" ), QObject::tr( "Labels" ), QgsLayoutItemLabel::create ) );
71  addLayoutItemType( new QgsLayoutItemMetadata( LayoutLegend, QObject::tr( "Legend" ), QObject::tr( "Legends" ), QgsLayoutItemLegend::create ) );
72  addLayoutItemType( new QgsLayoutItemMetadata( LayoutScaleBar, QObject::tr( "Scalebar" ), QObject::tr( "Scalebars" ), QgsLayoutItemScaleBar::create ) );
73  addLayoutItemType( new QgsLayoutItemMetadata( LayoutShape, QObject::tr( "Shape" ), QObject::tr( "Shapes" ), []( QgsLayout * layout )
74  {
75  QgsLayoutItemShape *shape = new QgsLayoutItemShape( layout );
77  return shape;
78  } ) );
79  addLayoutItemType( new QgsLayoutItemMetadata( LayoutPolygon, QObject::tr( "Polygon" ), QObject::tr( "Polygons" ), QgsLayoutItemPolygon::create ) );
80  addLayoutItemType( new QgsLayoutItemMetadata( LayoutPolyline, QObject::tr( "Polyline" ), QObject::tr( "Polylines" ), QgsLayoutItemPolyline::create ) );
81 
86 
87  return true;
88 }
89 
91 {
92  return mMetadata.value( type );
93 }
94 
96 {
97  return mMultiFrameMetadata.value( type );
98 }
99 
101 {
102  if ( !metadata || mMetadata.contains( metadata->type() ) )
103  return false;
104 
105  mMetadata[metadata->type()] = metadata;
106  emit typeAdded( metadata->type(), metadata->visibleName() );
107  return true;
108 }
109 
111 {
112  if ( !metadata || mMultiFrameMetadata.contains( metadata->type() ) )
113  return false;
114 
115  mMultiFrameMetadata[metadata->type()] = metadata;
116  emit multiFrameTypeAdded( metadata->type(), metadata->visibleName() );
117  return true;
118 }
119 
121 {
122  if ( !mMetadata.contains( type ) )
123  return nullptr;
124 
125  return mMetadata[type]->createItem( layout );
126 }
127 
129 {
130  if ( !mMultiFrameMetadata.contains( type ) )
131  return nullptr;
132 
133  return mMultiFrameMetadata[type]->createMultiFrame( layout );
134 }
135 
136 void QgsLayoutItemRegistry::resolvePaths( int type, QVariantMap &properties, const QgsPathResolver &pathResolver, bool saving ) const
137 {
138  if ( mMetadata.contains( type ) )
139  {
140  mMetadata[type]->resolvePaths( properties, pathResolver, saving );
141  }
142  else if ( mMultiFrameMetadata.contains( type ) )
143  {
144  mMultiFrameMetadata[type]->resolvePaths( properties, pathResolver, saving );
145  }
146 }
147 
148 QMap<int, QString> QgsLayoutItemRegistry::itemTypes() const
149 {
150  QMap<int, QString> types;
151  for ( auto it = mMetadata.constBegin(); it != mMetadata.constEnd(); ++it )
152  {
153  types.insert( it.key(), it.value()->visibleName() );
154  }
155  for ( auto it = mMultiFrameMetadata.constBegin(); it != mMultiFrameMetadata.constEnd(); ++it )
156  {
157  types.insert( it.key(), it.value()->visibleName() );
158  }
159 
160  return types;
161 }
162 
164 #if 0
165 TestLayoutItem::TestLayoutItem( QgsLayout *layout )
166  : QgsLayoutItem( layout )
167 {
168  int h = static_cast< int >( 360.0 * qrand() / ( RAND_MAX + 1.0 ) );
169  int s = ( qrand() % ( 200 - 100 + 1 ) ) + 100;
170  int v = ( qrand() % ( 130 - 255 + 1 ) ) + 130;
171  mColor = QColor::fromHsv( h, s, v );
172 
173  QgsStringMap properties;
174  properties.insert( QStringLiteral( "color" ), mColor.name() );
175  properties.insert( QStringLiteral( "style" ), QStringLiteral( "solid" ) );
176  properties.insert( QStringLiteral( "style_border" ), QStringLiteral( "solid" ) );
177  properties.insert( QStringLiteral( "color_border" ), QStringLiteral( "black" ) );
178  properties.insert( QStringLiteral( "width_border" ), QStringLiteral( "0.3" ) );
179  properties.insert( QStringLiteral( "joinstyle" ), QStringLiteral( "miter" ) );
180  mShapeStyleSymbol = QgsFillSymbol::createSimple( properties );
181 
182 }
183 
184 void TestLayoutItem::draw( QgsRenderContext &context, const QStyleOptionGraphicsItem *itemStyle )
185 {
186  Q_UNUSED( itemStyle )
187 
188  QgsEffectStack stack;
189  stack.appendEffect( new QgsDrawSourceEffect() );
190  stack.appendEffect( new QgsInnerGlowEffect() );
191  stack.begin( context );
192 
193  QPainter *painter = context.painter();
194 
195  painter->save();
196  painter->setRenderHint( QPainter::Antialiasing, false );
197  painter->setPen( Qt::NoPen );
198  painter->setBrush( mColor );
199 
200  double scale = context.convertToPainterUnits( 1, QgsUnitTypes::RenderMillimeters );
201 
202  QPolygonF shapePolygon = QPolygonF( QRectF( 0, 0, rect().width() * scale, rect().height() * scale ) );
203  QList<QPolygonF> rings; //empty list
204 
205  mShapeStyleSymbol->startRender( context );
206  mShapeStyleSymbol->renderPolygon( shapePolygon, &rings, nullptr, context );
207  mShapeStyleSymbol->stopRender( context );
208 
209 // painter->drawRect( r );
210  painter->restore();
211  stack.end( context );
212 }
213 #endif
214 
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:1310
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:694
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 QgsLayoutItemManualTable * create(QgsLayout *layout)
Returns a new QgsLayoutItemManualTable for the specified parent 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.