Skip to content

Commit f0a6376

Browse files
authored
Merge pull request #4910 from nyalldawson/layout_next
Layouts, chapter III
2 parents 11dd417 + c89a15a commit f0a6376

File tree

84 files changed

+5162
-401
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

84 files changed

+5162
-401
lines changed

python/core/composer/qgscomposeritem.sip

Lines changed: 74 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -31,68 +31,87 @@ class QgsComposerItem: QgsComposerObject, QGraphicsRectItem
3131
#include <qgscomposerpolygon.h>
3232
#include <qgscomposerpolyline.h>
3333
#include <qgscomposertexttable.h>
34+
#include <qgslayoutitemshape.h>
35+
#include <qgslayoutitempage.h>
3436
%End
3537

3638
%ConvertToSubClassCode
3739
// the conversions have to be static, because they're using multiple inheritance
3840
// (seen in PyQt4 .sip files for some QGraphicsItem classes)
39-
switch ( sipCpp->type() )
41+
if ( dynamic_cast< QgsComposerItem * >( sipCpp ) )
4042
{
41-
case QgsComposerItem::ComposerItem:
42-
sipType = sipType_QgsComposerItem;
43-
*sipCppRet = static_cast<QgsComposerItem *>( sipCpp );
44-
break;
45-
case QgsComposerItem::ComposerArrow:
46-
sipType = sipType_QgsComposerArrow;
47-
*sipCppRet = static_cast<QgsComposerArrow *>( sipCpp );
48-
break;
49-
case QgsComposerItem::ComposerItemGroup:
50-
sipType = sipType_QgsComposerItemGroup;
51-
*sipCppRet = static_cast<QgsComposerItemGroup *>( sipCpp );
52-
break;
53-
case QgsComposerItem::ComposerLabel:
54-
sipType = sipType_QgsComposerLabel;
55-
*sipCppRet = static_cast<QgsComposerLabel *>( sipCpp );
56-
break;
57-
case QgsComposerItem::ComposerLegend:
58-
sipType = sipType_QgsComposerLegend;
59-
*sipCppRet = static_cast<QgsComposerLegend *>( sipCpp );
60-
break;
61-
case QgsComposerItem::ComposerMap:
62-
sipType = sipType_QgsComposerMap;
63-
*sipCppRet = static_cast<QgsComposerMap *>( sipCpp );
64-
break;
65-
case QgsComposerItem::ComposerPaper:
66-
sipType = sipType_QgsPaperItem;
67-
*sipCppRet = static_cast<QgsPaperItem *>( sipCpp );
68-
break;
69-
case QgsComposerItem::ComposerPicture:
70-
sipType = sipType_QgsComposerPicture;
71-
*sipCppRet = static_cast<QgsComposerPicture *>( sipCpp );
72-
break;
73-
case QgsComposerItem::ComposerScaleBar:
74-
sipType = sipType_QgsComposerScaleBar;
75-
*sipCppRet = static_cast<QgsComposerScaleBar *>( sipCpp );
76-
break;
77-
case QgsComposerItem::ComposerShape:
78-
sipType = sipType_QgsComposerShape;
79-
*sipCppRet = static_cast<QgsComposerShape *>( sipCpp );
80-
break;
81-
case QgsComposerItem::ComposerPolygon:
82-
sipType = sipType_QgsComposerPolygon;
83-
*sipCppRet = static_cast<QgsComposerPolygon *>( sipCpp );
84-
break;
85-
case QgsComposerItem::ComposerPolyline:
86-
sipType = sipType_QgsComposerPolyline;
87-
*sipCppRet = static_cast<QgsComposerPolyline *>( sipCpp );
88-
break;
89-
case QgsComposerItem::ComposerFrame:
90-
sipType = sipType_QgsComposerFrame;
91-
*sipCppRet = static_cast<QgsComposerFrame *>( sipCpp );
92-
break;
93-
default:
94-
sipType = 0;
43+
switch ( sipCpp->type() )
44+
{
45+
case QgsComposerItem::ComposerItem:
46+
sipType = sipType_QgsComposerItem;
47+
*sipCppRet = static_cast<QgsComposerItem *>( sipCpp );
48+
break;
49+
case QgsComposerItem::ComposerArrow:
50+
sipType = sipType_QgsComposerArrow;
51+
*sipCppRet = static_cast<QgsComposerArrow *>( sipCpp );
52+
break;
53+
case QgsComposerItem::ComposerItemGroup:
54+
sipType = sipType_QgsComposerItemGroup;
55+
*sipCppRet = static_cast<QgsComposerItemGroup *>( sipCpp );
56+
break;
57+
case QgsComposerItem::ComposerLabel:
58+
sipType = sipType_QgsComposerLabel;
59+
*sipCppRet = static_cast<QgsComposerLabel *>( sipCpp );
60+
break;
61+
case QgsComposerItem::ComposerLegend:
62+
sipType = sipType_QgsComposerLegend;
63+
*sipCppRet = static_cast<QgsComposerLegend *>( sipCpp );
64+
break;
65+
case QgsComposerItem::ComposerMap:
66+
sipType = sipType_QgsComposerMap;
67+
*sipCppRet = static_cast<QgsComposerMap *>( sipCpp );
68+
break;
69+
case QgsComposerItem::ComposerPaper:
70+
sipType = sipType_QgsPaperItem;
71+
*sipCppRet = static_cast<QgsPaperItem *>( sipCpp );
72+
break;
73+
case QgsComposerItem::ComposerPicture:
74+
sipType = sipType_QgsComposerPicture;
75+
*sipCppRet = static_cast<QgsComposerPicture *>( sipCpp );
76+
break;
77+
case QgsComposerItem::ComposerScaleBar:
78+
sipType = sipType_QgsComposerScaleBar;
79+
*sipCppRet = static_cast<QgsComposerScaleBar *>( sipCpp );
80+
break;
81+
case QgsComposerItem::ComposerShape:
82+
sipType = sipType_QgsComposerShape;
83+
*sipCppRet = static_cast<QgsComposerShape *>( sipCpp );
84+
break;
85+
case QgsComposerItem::ComposerPolygon:
86+
sipType = sipType_QgsComposerPolygon;
87+
*sipCppRet = static_cast<QgsComposerPolygon *>( sipCpp );
88+
break;
89+
case QgsComposerItem::ComposerPolyline:
90+
sipType = sipType_QgsComposerPolyline;
91+
*sipCppRet = static_cast<QgsComposerPolyline *>( sipCpp );
92+
break;
93+
case QgsComposerItem::ComposerFrame:
94+
sipType = sipType_QgsComposerFrame;
95+
*sipCppRet = static_cast<QgsComposerFrame *>( sipCpp );
96+
break;
97+
default:
98+
sipType = 0;
99+
}
95100
}
101+
else
102+
{
103+
switch ( sipCpp->type() )
104+
{
105+
// really, these *should* use the constants from QgsLayoutItemRegistry, but sip doesn't like that!
106+
case QGraphicsItem::UserType + 101:
107+
sipType = sipType_QgsLayoutItemPage;
108+
*sipCppRet = static_cast<QgsLayoutItemPage *>( sipCpp );
109+
break;
110+
default:
111+
sipType = 0;
112+
}
113+
}
114+
96115
%End
97116
public:
98117

python/core/core_auto.sip

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -382,8 +382,10 @@
382382
%Include layout/qgslayout.sip
383383
%Include layout/qgslayoutitem.sip
384384
%Include layout/qgslayoutitemmap.sip
385+
%Include layout/qgslayoutitempage.sip
385386
%Include layout/qgslayoutitemregistry.sip
386387
%Include layout/qgslayoutitemshape.sip
388+
%Include layout/qgslayoutpagecollection.sip
387389
%Include layout/qgslayoutobject.sip
388390
%Include symbology-ng/qgscptcityarchive.sip
389391
%Include symbology-ng/qgssvgcache.sip

python/core/layout/qgslayout.sip

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,23 @@ class QgsLayout : QGraphicsScene, QgsExpressionContextGenerator
2222

2323
enum ZValues
2424
{
25+
ZPage,
2526
ZMapTool,
2627
};
2728

2829
QgsLayout( QgsProject *project );
2930
%Docstring
3031
Construct a new layout linked to the specified ``project``.
32+
33+
If the layout is a "new" layout (as opposed to a layout which will
34+
restore a previous state from XML) then initializeDefaults() should be
35+
called on the new layout.
36+
%End
37+
38+
void initializeDefaults();
39+
%Docstring
40+
Initializes an empty layout, e.g. by adding a default page to the layout. This should be called after creating
41+
a new layout.
3142
%End
3243

3344
QgsProject *project() const;
@@ -183,6 +194,36 @@ class QgsLayout : QGraphicsScene, QgsExpressionContextGenerator
183194

184195
void setReferenceMap( QgsLayoutItemMap *map );
185196

197+
QgsLayoutPageCollection *pageCollection();
198+
%Docstring
199+
Returns a pointer to the layout's page collection, which stores and manages
200+
page items in the layout.
201+
:rtype: QgsLayoutPageCollection
202+
%End
203+
204+
QRectF layoutBounds( bool ignorePages = false, double margin = 0.0 ) const;
205+
%Docstring
206+
Calculates the bounds of all non-gui items in the layout. Ignores snap lines, mouse handles
207+
and other cosmetic items.
208+
\param ignorePages set to true to ignore page items
209+
\param margin optional marginal (in percent, e.g., 0.05 = 5% ) to add around items
210+
:return: layout bounds, in layout units.
211+
:rtype: QRectF
212+
%End
213+
214+
void addLayoutItem( QgsLayoutItem *item /Transfer/ );
215+
%Docstring
216+
Adds an ``item`` to the layout. This should be called instead of the base class addItem()
217+
method. Ownership of the item is transferred to the layout.
218+
%End
219+
220+
public slots:
221+
222+
void updateBounds();
223+
%Docstring
224+
Updates the scene bounds of the layout.
225+
%End
226+
186227
signals:
187228

188229
void variablesChanged();

python/core/layout/qgslayoutcontext.sip

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,12 @@ class QgsLayoutContext
6767
:rtype: bool
6868
%End
6969

70+
QgsRenderContext::Flags renderContextFlags() const;
71+
%Docstring
72+
Returns the combination of render context flags matched to the layout context's settings.
73+
:rtype: QgsRenderContext.Flags
74+
%End
75+
7076
void setFeature( const QgsFeature &feature );
7177
%Docstring
7278
Sets the current ``feature`` for evaluating the layout. This feature may

python/core/layout/qgslayoutitem.sip

Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,24 @@ class QgsLayoutItem : QgsLayoutObject, QGraphicsRectItem
1818

1919
%TypeHeaderCode
2020
#include "qgslayoutitem.h"
21+
22+
#include <qgslayoutitemshape.h>
23+
#include <qgslayoutitempage.h>
24+
%End
25+
26+
%ConvertToSubClassCode
27+
// the conversions have to be static, because they're using multiple inheritance
28+
// (seen in PyQt4 .sip files for some QGraphicsItem classes)
29+
switch ( sipCpp->type() )
30+
{
31+
// really, these *should* use the constants from QgsLayoutItemRegistry, but sip doesn't like that!
32+
case QGraphicsItem::UserType + 101:
33+
sipType = sipType_QgsLayoutItemPage;
34+
*sipCppRet = static_cast<QgsLayoutItemPage *>( sipCpp );
35+
break;
36+
default:
37+
sipType = 0;
38+
}
2139
%End
2240
public:
2341

@@ -39,6 +57,51 @@ class QgsLayoutItem : QgsLayoutObject, QGraphicsRectItem
3957
Constructor for QgsLayoutItem, with the specified parent ``layout``.
4058
%End
4159

60+
virtual int type() const = 0;
61+
%Docstring
62+
Return correct graphics item type
63+
.. seealso:: stringType()
64+
:rtype: int
65+
%End
66+
67+
virtual QString stringType() const = 0;
68+
%Docstring
69+
Return the item type as a string.
70+
71+
This string must be a unique, single word, character only representation of the item type, eg "LayoutScaleBar"
72+
.. seealso:: type()
73+
:rtype: str
74+
%End
75+
76+
QString uuid() const;
77+
%Docstring
78+
Returns the item identification string. This is a unique random string set for the item
79+
upon creation.
80+
.. note::
81+
82+
There is no corresponding setter for the uuid - it's created automatically.
83+
.. seealso:: id()
84+
.. seealso:: setId()
85+
:rtype: str
86+
%End
87+
88+
QString id() const;
89+
%Docstring
90+
Returns the item's ID name. This is not necessarily unique, and duplicate ID names may exist
91+
for a layout.
92+
.. seealso:: setId()
93+
.. seealso:: uuid()
94+
:rtype: str
95+
%End
96+
97+
virtual void setId( const QString &id );
98+
%Docstring
99+
Set the item's ``id`` name. This is not necessarily unique, and duplicate ID names may exist
100+
for a layout.
101+
.. seealso:: id()
102+
.. seealso:: uuid()
103+
%End
104+
42105
virtual void paint( QPainter *painter, const QStyleOptionGraphicsItem *itemStyle, QWidget *pWidget );
43106

44107
%Docstring
@@ -130,6 +193,32 @@ class QgsLayoutItem : QgsLayoutObject, QGraphicsRectItem
130193
:rtype: float
131194
%End
132195

196+
virtual bool writeXml( QDomElement &parentElement, QDomDocument &document, const QgsReadWriteContext &context ) const;
197+
%Docstring
198+
Stores the item state in a DOM element.
199+
\param parentElement parent DOM element (e.g. 'Layout' element)
200+
\param document DOM document
201+
\param context read write context
202+
.. seealso:: readXml()
203+
.. note::
204+
205+
Subclasses should ensure that they call writePropertiesToElement() in their implementation.
206+
:rtype: bool
207+
%End
208+
209+
virtual bool readXml( const QDomElement &itemElement, const QDomDocument &document, const QgsReadWriteContext &context );
210+
%Docstring
211+
Sets the item state from a DOM element.
212+
\param itemElement is the DOM node corresponding to item (e.g. 'LayoutItem' element)
213+
\param document DOM document
214+
\param context read write context
215+
.. seealso:: writeXml()
216+
.. note::
217+
218+
Subclasses should ensure that they call readPropertiesFromElement() in their implementation.
219+
:rtype: bool
220+
%End
221+
133222
public slots:
134223

135224
virtual void refresh();
@@ -230,6 +319,34 @@ class QgsLayoutItem : QgsLayoutObject, QGraphicsRectItem
230319
:rtype: QPointF
231320
%End
232321

322+
virtual bool writePropertiesToElement( QDomElement &element, QDomDocument &document, const QgsReadWriteContext &context ) const;
323+
%Docstring
324+
Stores item state within an XML DOM element.
325+
\param element is the DOM element to store the item's properties in
326+
\param document DOM document
327+
\param context read write context
328+
.. seealso:: writeXml()
329+
.. seealso:: readPropertiesFromElement()
330+
.. note::
331+
332+
derived classes must call this base implementation when overriding this method
333+
:rtype: bool
334+
%End
335+
336+
virtual bool readPropertiesFromElement( const QDomElement &element, const QDomDocument &document, const QgsReadWriteContext &context );
337+
%Docstring
338+
Sets item state from a DOM element.
339+
\param element is the DOM element for the item
340+
\param document DOM document
341+
\param context read write context
342+
.. seealso:: writePropertiesToElement()
343+
.. seealso:: readXml()
344+
.. note::
345+
346+
derived classes must call this base implementation when overriding this method
347+
:rtype: bool
348+
%End
349+
233350
};
234351

235352

python/core/layout/qgslayoutitemmap.sip

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ class QgsLayoutItemMap : QgsLayoutItem
2424
%Docstring
2525
Constructor for QgsLayoutItemMap, with the specified parent ``layout``.
2626
%End
27+
virtual int type() const;
28+
virtual QString stringType() const;
2729

2830
protected:
2931

0 commit comments

Comments
 (0)