QGIS API Documentation  3.4.15-Madeira (e83d02e274)
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.
QMap< int, QString > itemTypes() const
Returns a map of available item types to translated name.
static QgsLayoutItemHtml * create(QgsLayout *layout)
Returns a new QgsLayoutItemHtml for the specified parent layout.
Base class for graphical items within a QgsLayout.
QgsLayoutMultiFrameAbstractMetadata * multiFrameMetadata(int type) const
Returns the metadata for the specified multiframe type.
QString visibleName() const
Returns a translated, user visible name for the layout multiframe class.
static QgsLayoutItemTextTable * create(QgsLayout *layout)
Returns a new QgsLayoutItemTextTable for the specified parent layout.
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 ...
double convertToPainterUnits(double size, QgsUnitTypes::RenderUnit unit, const QgsMapUnitScale &scale=QgsMapUnitScale()) const
Converts a size from the specified units to painter units (pixels).
static QgsFillSymbol * createSimple(const QgsStringMap &properties)
Create a fill symbol with one symbol layer: SimpleFill with specified properties. ...
Definition: qgssymbol.cpp:1150
QgsLayoutItem * createItem(int type, QgsLayout *layout) const
Creates a new instance of a layout item given the item type, and target layout.
static QgsLayoutItemMap * create(QgsLayout *layout)
Returns a new map item for the specified layout.
static QgsLayoutItemLabel * create(QgsLayout *layout)
Returns a new label item for the specified layout.
void resolvePaths(int type, QVariantMap &properties, const QgsPathResolver &pathResolver, bool saving) const
Resolve paths in properties of a particular symbol layer.
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.
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:577
Abstract base class for layout items with the ability to distribute the content to several frames (Qg...
QgsLayoutItemAbstractMetadata * itemMetadata(int type) const
Returns the metadata for the specified item type.
Layout item for basic filled shapes (e.g.
int type() const
Returns the unique item type code for the layout item class.
QgsLayoutMultiFrame * createMultiFrame(int type, QgsLayout *layout) const
Creates a new instance of a layout multiframe given the multiframe type, and target layout...
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.
QString visibleName() const
Returns a translated, user visible name for the layout item class.
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.
QPainter * painter()
Returns the destination QPainter for the render operation.
static QgsLayoutItemPage * create(QgsLayout *layout)
Returns a new page item for the specified layout.
bool addLayoutItemType(QgsLayoutItemAbstractMetadata *metadata)
Registers a new layout item type.
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.
int type() const
Returns the unique item type code for the layout multiframe class.