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