QGIS API Documentation 4.0.0-Norrköping (1ddcee3d0e4)
Loading...
Searching...
No Matches
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
18
19#include "qgslayoutframe.h"
21#include "qgslayoutitemchart.h"
23#include "qgslayoutitemgroup.h"
24#include "qgslayoutitemhtml.h"
25#include "qgslayoutitemlabel.h"
26#include "qgslayoutitemlegend.h"
28#include "qgslayoutitemmap.h"
29#include "qgslayoutitemmarker.h"
30#include "qgslayoutitempage.h"
35#include "qgslayoutitemshape.h"
37
38#include <QPainter>
39#include <QString>
40
41#include "moc_qgslayoutitemregistry.cpp"
42
43using namespace Qt::StringLiterals;
44
46 : QObject( parent )
47{}
48
50{
51 qDeleteAll( mMetadata );
52 qDeleteAll( mMultiFrameMetadata );
53}
54
56{
57 if ( !mMetadata.isEmpty() )
58 return false;
59
60#if 0
61 // add temporary item to register
62 auto createTemporaryItem = []( QgsLayout * layout )->QgsLayoutItem *
63 {
64 return new TestLayoutItem( layout );
65 };
66
67 addLayoutItemType( new QgsLayoutItemMetadata( QgsLayoutItemRegistry::LayoutItem + 1002, u"temp type"_s, createTemporaryItem ) );
68#endif
69
70 addLayoutItemType( new QgsLayoutItemMetadata( LayoutGroup, QObject::tr( "Group" ), QObject::tr( "Groups" ), QgsLayoutItemGroup::create ) );
71 addLayoutItemType( new QgsLayoutItemMetadata( LayoutFrame, QObject::tr( "Frame" ), QObject::tr( "Frames" ), QgsLayoutFrame::create ) );
72 addLayoutItemType( new QgsLayoutItemMetadata( LayoutPage, QObject::tr( "Page" ), QObject::tr( "Pages" ), QgsLayoutItemPage::create ) );
73 addLayoutItemType( new QgsLayoutItemMetadata( LayoutMap, QObject::tr( "Map" ), QObject::tr( "Maps" ), QgsLayoutItemMap::create ) );
74 addLayoutItemType( new QgsLayoutItemMetadata( LayoutPicture, QObject::tr( "Picture" ), QObject::tr( "Pictures" ), QgsLayoutItemPicture::create ) );
75 addLayoutItemType( new QgsLayoutItemMetadata( LayoutLabel, QObject::tr( "Label" ), QObject::tr( "Labels" ), QgsLayoutItemLabel::create ) );
76 addLayoutItemType( new QgsLayoutItemMetadata( LayoutLegend, QObject::tr( "Legend" ), QObject::tr( "Legends" ), QgsLayoutItemLegend::create ) );
77 addLayoutItemType( new QgsLayoutItemMetadata( LayoutScaleBar, QObject::tr( "Scalebar" ), QObject::tr( "Scalebars" ), QgsLayoutItemScaleBar::create ) );
78 addLayoutItemType( new QgsLayoutItemMetadata( LayoutShape, QObject::tr( "Shape" ), QObject::tr( "Shapes" ), []( QgsLayout *layout ) {
79 QgsLayoutItemShape *shape = new QgsLayoutItemShape( layout );
81 return shape;
82 } ) );
83 addLayoutItemType( new QgsLayoutItemMetadata( LayoutMarker, QObject::tr( "Marker" ), QObject::tr( "Markers" ), QgsLayoutItemMarker::create ) );
84 addLayoutItemType( new QgsLayoutItemMetadata( LayoutPolygon, QObject::tr( "Polygon" ), QObject::tr( "Polygons" ), QgsLayoutItemPolygon::create ) );
85 addLayoutItemType( new QgsLayoutItemMetadata( LayoutPolyline, QObject::tr( "Polyline" ), QObject::tr( "Polylines" ), QgsLayoutItemPolyline::create ) );
86
87 addLayoutItemType( new QgsLayoutItemMetadata( LayoutElevationProfile, QObject::tr( "Elevation Profile" ), QObject::tr( "Elevation Profiles" ), QgsLayoutItemElevationProfile::create ) );
88 addLayoutItemType( new QgsLayoutItemMetadata( LayoutChart, QObject::tr( "Chart" ), QObject::tr( "Charts" ), QgsLayoutItemChart::create ) );
89
94
95 return true;
96}
97
99{
100 return mMetadata.value( type );
101}
102
104{
105 return mMultiFrameMetadata.value( type );
106}
107
109{
110 if ( !metadata || mMetadata.contains( metadata->type() ) )
111 return false;
112
113 mMetadata[metadata->type()] = metadata;
114 emit typeAdded( metadata->type(), metadata->visibleName() );
115 return true;
116}
117
119{
120 if ( !mMetadata.contains( typeId ) )
121 return false;
122 mMetadata.remove( typeId );
123 emit typeRemoved( typeId );
124 return true;
125}
126
131
133{
134 if ( !metadata || mMultiFrameMetadata.contains( metadata->type() ) )
135 return false;
136
137 mMultiFrameMetadata[metadata->type()] = metadata;
138 emit multiFrameTypeAdded( metadata->type(), metadata->visibleName() );
139 return true;
140}
141
143{
144 if ( !mMultiFrameMetadata.contains( typeId ) )
145 return false;
146 mMultiFrameMetadata.remove( typeId );
147 emit multiFrameTypeRemoved( typeId );
148 return true;
149}
150
155
157{
158 if ( !mMetadata.contains( type ) )
159 return nullptr;
160
161 return mMetadata[type]->createItem( layout );
162}
163
165{
166 if ( !mMultiFrameMetadata.contains( type ) )
167 return nullptr;
168
169 return mMultiFrameMetadata[type]->createMultiFrame( layout );
170}
171
172void QgsLayoutItemRegistry::resolvePaths( int type, QVariantMap &properties, const QgsPathResolver &pathResolver, bool saving ) const
173{
174 if ( mMetadata.contains( type ) )
175 {
176 mMetadata[type]->resolvePaths( properties, pathResolver, saving );
177 }
178 else if ( mMultiFrameMetadata.contains( type ) )
179 {
180 mMultiFrameMetadata[type]->resolvePaths( properties, pathResolver, saving );
181 }
182}
183
184QMap<int, QString> QgsLayoutItemRegistry::itemTypes() const
185{
186 QMap<int, QString> types;
187 for ( auto it = mMetadata.constBegin(); it != mMetadata.constEnd(); ++it )
188 {
189 types.insert( it.key(), it.value()->visibleName() );
190 }
191 for ( auto it = mMultiFrameMetadata.constBegin(); it != mMultiFrameMetadata.constEnd(); ++it )
192 {
193 types.insert( it.key(), it.value()->visibleName() );
194 }
195
196 return types;
197}
198
200#if 0
201TestLayoutItem::TestLayoutItem( QgsLayout *layout )
202 : QgsLayoutItem( layout )
203{
204 int h = static_cast< int >( 360.0 * qrand() / ( RAND_MAX + 1.0 ) );
205 int s = ( qrand() % ( 200 - 100 + 1 ) ) + 100;
206 int v = ( qrand() % ( 130 - 255 + 1 ) ) + 130;
207 mColor = QColor::fromHsv( h, s, v );
208
209 QgsStringMap properties;
210 properties.insert( u"color"_s, mColor.name() );
211 properties.insert( u"style"_s, u"solid"_s );
212 properties.insert( u"style_border"_s, u"solid"_s );
213 properties.insert( u"color_border"_s, u"black"_s );
214 properties.insert( u"width_border"_s, u"0.3"_s );
215 properties.insert( u"joinstyle"_s, u"miter"_s );
216 mShapeStyleSymbol = QgsFillSymbol::createSimple( properties );
217
218}
219
220void TestLayoutItem::draw( QgsRenderContext &context, const QStyleOptionGraphicsItem *itemStyle )
221{
222 Q_UNUSED( itemStyle )
223
224 QgsEffectStack stack;
225 stack.appendEffect( new QgsDrawSourceEffect() );
226 stack.appendEffect( new QgsInnerGlowEffect() );
227 stack.begin( context );
228
229 QPainter *painter = context.painter();
230
231 painter->save();
232 painter->setRenderHint( QPainter::Antialiasing, false );
233 painter->setPen( Qt::NoPen );
234 painter->setBrush( mColor );
235
236 double scale = context.convertToPainterUnits( 1, QgsUnitTypes::RenderMillimeters );
237
238 QPolygonF shapePolygon = QPolygonF( QRectF( 0, 0, rect().width() * scale, rect().height() * scale ) );
239 QList<QPolygonF> rings; //empty list
240
241 mShapeStyleSymbol->startRender( context );
242 mShapeStyleSymbol->renderPolygon( shapePolygon, &rings, nullptr, context );
243 mShapeStyleSymbol->stopRender( context );
244
245// painter->drawRect( r );
246 painter->restore();
247 stack.end( context );
248}
249#endif
A paint effect which draws the source picture with minor or no alterations.
A paint effect which consists of a stack of other chained paint effects.
void appendEffect(QgsPaintEffect *effect)
Appends an effect to the end of the stack.
static std::unique_ptr< QgsFillSymbol > createSimple(const QVariantMap &properties)
Create a fill symbol with one symbol layer: SimpleFill with specified properties.
A paint effect which draws a glow within a picture.
static QgsLayoutFrame * create(QgsLayout *layout)
Creates a new QgsLayoutFrame belonging to the specified layout.
Stores metadata about one layout item class.
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 item class.
static QgsLayoutItemAttributeTable * create(QgsLayout *layout)
Returns a new QgsLayoutItemAttributeTable for the specified parent layout.
static QgsLayoutItemChart * create(QgsLayout *layout)
Returns a new chart item for the specified layout.
static QgsLayoutItemElevationProfile * create(QgsLayout *layout)
Returns a new elevation profile item for the specified layout.
static QgsLayoutItemGroup * create(QgsLayout *layout)
Returns a new group item for the specified layout.
static QgsLayoutItemHtml * create(QgsLayout *layout)
Returns a new QgsLayoutItemHtml for the specified parent layout.
static QgsLayoutItemLabel * create(QgsLayout *layout)
Returns a new label item for the specified layout.
static QgsLayoutItemLegend * create(QgsLayout *layout)
Returns a new legend item for the specified layout.
static QgsLayoutItemManualTable * create(QgsLayout *layout)
Returns a new QgsLayoutItemManualTable for the specified parent layout.
static QgsLayoutItemMap * create(QgsLayout *layout)
Returns a new map item for the specified layout.
static QgsLayoutItemMarker * create(QgsLayout *layout)
Returns a new marker item for the specified layout.
Convenience metadata class that uses static functions to create layout items and their configuration ...
static QgsLayoutItemPage * create(QgsLayout *layout)
Returns a new page item for the specified layout.
static QgsLayoutItemPicture * create(QgsLayout *layout)
Returns a new picture item for the specified layout.
static QgsLayoutItemPolygon * create(QgsLayout *layout)
Returns a new polygon item for the specified layout.
static QgsLayoutItemPolyline * create(QgsLayout *layout)
Returns a new polyline item for the specified layout.
QgsLayoutItemRegistry(QObject *parent=nullptr)
Creates a new empty item registry.
void resolvePaths(int type, QVariantMap &properties, const QgsPathResolver &pathResolver, bool saving) const
Resolve paths in properties of a particular symbol layer.
bool addLayoutItemType(QgsLayoutItemAbstractMetadata *metadata)
Registers a new layout item type.
bool removeLayoutMultiFrameType(int typeId)
Unregisters a layout multiframe type.
bool removeLayoutItemType(int typeId)
Unregisters a layout item type.
void multiFrameTypeRemoved(int type)
Emitted whenever an multiframe type is removed from the registry with the specified type.
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.
QgsLayoutItemAbstractMetadata * itemMetadata(int type) const
Returns the metadata for the specified item type.
bool addLayoutMultiFrameType(QgsLayoutMultiFrameAbstractMetadata *metadata)
Registers a new layout multiframe type.
@ LayoutManualTable
Manual (fixed) table.
@ LayoutElevationProfile
Elevation profile item.
@ LayoutAttributeTable
Attribute table.
@ LayoutPolyline
Polyline shape item.
@ LayoutItem
Base class for items.
@ LayoutHtml
Html multiframe item.
@ LayoutTextTable
Preset text table.
@ LayoutFrame
Frame item, part of a QgsLayoutMultiFrame object.
@ LayoutPolygon
Polygon shape item.
QgsLayoutMultiFrameAbstractMetadata * multiFrameMetadata(int type) const
Returns the metadata for the specified multiframe type.
bool populate()
Populates the registry with standard item types.
void multiFrameTypeAdded(int type, const QString &name)
Emitted whenever a new multiframe type is added to the registry, with the specified type and visible ...
QgsLayoutItem * createItem(int type, QgsLayout *layout) const
Creates a new instance of a layout item given the item type, and target layout.
void typeRemoved(int type)
Emitted whenever an item type is removed from the registry with the specified type.
QMap< int, QString > itemTypes() const
Returns a map of available item types to translated name.
QgsLayoutMultiFrame * createMultiFrame(int type, QgsLayout *layout) const
Creates a new instance of a layout multiframe given the multiframe type, and target layout.
static QgsLayoutItemScaleBar * create(QgsLayout *layout)
Returns a new scale bar item for the specified layout.
Layout item for basic filled shapes (e.g.
void setShapeType(QgsLayoutItemShape::Shape type)
Sets the type of shape (e.g.
@ Rectangle
Rectangle shape.
static QgsLayoutItemTextTable * create(QgsLayout *layout)
Returns a new QgsLayoutItemTextTable for the specified parent layout.
Base class for graphical items within a QgsLayout.
Stores metadata about one layout multiframe class.
int type() const
Returns the unique item type code for the layout multiframe class.
QString visibleName() const
Returns a translated, user visible name for the layout multiframe class.
Convenience metadata class that uses static functions to create layout multiframes and their configur...
Abstract base class for layout items with the ability to distribute the content to several frames (Qg...
Base class for layouts, which can contain items such as maps, labels, scalebars, etc.
Definition qgslayout.h:50
virtual void begin(QgsRenderContext &context)
Begins intercepting paint operations to a render context.
virtual void end(QgsRenderContext &context)
Ends interception of paint operations to a render context, and draws the result to the render context...
Resolves relative paths into absolute paths and vice versa.
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.
QMap< QString, QString > QgsStringMap
Definition qgis.h:7475