Skip to content

Commit 935dfa3

Browse files
committedJan 5, 2018
Add reprt iteration test
1 parent cdf5cf2 commit 935dfa3

File tree

4 files changed

+152
-6
lines changed

4 files changed

+152
-6
lines changed
 

‎python/core/layout/qgsabstractreportsection.sip

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,12 @@ implementations.
5454
virtual bool endRender();
5555

5656

57+
virtual QgsLayout *nextBody();
58+
%Docstring
59+
Returns the next body layout to export, or a None if
60+
no body layouts remain for this section.
61+
%End
62+
5763
bool headerEnabled() const;
5864
%Docstring
5965
Returns true if the header for the section is enabled.
@@ -217,6 +223,7 @@ Removes the child section at the specified ``index``, deleting it.
217223
{
218224
Header,
219225
Body,
226+
Children,
220227
Footer,
221228
End,
222229
};
@@ -263,7 +270,7 @@ is transferred to the report section.
263270

264271
virtual bool beginRender();
265272

266-
virtual bool next();
273+
virtual QgsLayout *nextBody();
267274

268275

269276
};

‎src/core/layout/qgsabstractreportsection.cpp

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,19 @@ bool QgsAbstractReportSection::next()
7777

7878
case Body:
7979
{
80+
// if we have a body, use it
81+
if ( QgsLayout *body = nextBody() )
82+
{
83+
mCurrentLayout = body;
84+
return true;
85+
}
8086

87+
mNextSection = Children;
88+
FALLTHROUGH;
89+
}
90+
91+
case Children:
92+
{
8193
// we iterate through all the section's children...
8294
while ( mNextChild < mChildren.count() )
8395
{
@@ -227,15 +239,15 @@ bool QgsReportSectionLayout::beginRender()
227239
return QgsAbstractReportSection::beginRender();
228240
}
229241

230-
bool QgsReportSectionLayout::next()
242+
QgsLayout *QgsReportSectionLayout::nextBody()
231243
{
232-
if ( !mExportedBody )
244+
if ( !mExportedBody && mBody )
233245
{
234246
mExportedBody = true;
235-
return true;
247+
return mBody.get();
236248
}
237249
else
238250
{
239-
return false;
251+
return nullptr;
240252
}
241253
}

‎src/core/layout/qgsabstractreportsection.h

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,12 @@ class CORE_EXPORT QgsAbstractReportSection : public QgsAbstractLayoutIterator
6767
bool next() override;
6868
bool endRender() override;
6969

70+
/**
71+
* Returns the next body layout to export, or a nullptr if
72+
* no body layouts remain for this section.
73+
*/
74+
virtual QgsLayout *nextBody() { return nullptr; }
75+
7076
/**
7177
* Returns true if the header for the section is enabled.
7278
* \see setHeaderEnabled()
@@ -194,6 +200,7 @@ class CORE_EXPORT QgsAbstractReportSection : public QgsAbstractLayoutIterator
194200
{
195201
Header, //!< Header for section
196202
Body, //!< Body of section
203+
Children, //!< Child sections
197204
Footer, //!< Footer for section
198205
End, //!< End of section (i.e. past all available content)
199206
};
@@ -248,7 +255,7 @@ class CORE_EXPORT QgsReportSectionLayout : public QgsAbstractReportSection
248255

249256
QgsReportSectionLayout *clone() const override SIP_FACTORY;
250257
bool beginRender() override;
251-
bool next() override;
258+
QgsLayout *nextBody() override;
252259

253260
private:
254261

‎tests/src/python/test_qgsreport.py

Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,126 @@ def testReportSectionLayout(self):
131131
r.setBody(body)
132132
self.assertEqual(r.body(), body)
133133

134+
def testIteration(self):
135+
p = QgsProject()
136+
r = QgsReport()
137+
138+
# empty report
139+
self.assertTrue(r.beginRender())
140+
self.assertFalse(r.next())
141+
142+
# add a header
143+
r.setHeaderEnabled(True)
144+
report_header = QgsLayout(p)
145+
r.setHeader(report_header)
146+
147+
self.assertTrue(r.beginRender())
148+
self.assertTrue(r.next())
149+
self.assertEqual(r.layout(), report_header)
150+
self.assertFalse(r.next())
151+
152+
# add a footer
153+
r.setFooterEnabled(True)
154+
report_footer = QgsLayout(p)
155+
r.setFooter(report_footer)
156+
157+
self.assertTrue(r.beginRender())
158+
self.assertTrue(r.next())
159+
self.assertEqual(r.layout(), report_header)
160+
self.assertTrue(r.next())
161+
self.assertEqual(r.layout(), report_footer)
162+
self.assertFalse(r.next())
163+
164+
# add a child
165+
child1 = QgsReportSectionLayout()
166+
child1_body = QgsLayout(p)
167+
child1.setBody(child1_body)
168+
r.appendChild(child1)
169+
self.assertTrue(r.beginRender())
170+
self.assertTrue(r.next())
171+
self.assertEqual(r.layout(), report_header)
172+
self.assertTrue(r.next())
173+
self.assertEqual(r.layout(), child1_body)
174+
self.assertTrue(r.next())
175+
self.assertEqual(r.layout(), report_footer)
176+
self.assertFalse(r.next())
177+
178+
# header and footer on child
179+
child1_header = QgsLayout(p)
180+
child1.setHeader(child1_header)
181+
child1.setHeaderEnabled(True)
182+
child1_footer = QgsLayout(p)
183+
child1.setFooter(child1_footer)
184+
child1.setFooterEnabled(True)
185+
self.assertTrue(r.beginRender())
186+
self.assertTrue(r.next())
187+
self.assertEqual(r.layout(), report_header)
188+
self.assertTrue(r.next())
189+
self.assertEqual(r.layout(), child1_header)
190+
self.assertTrue(r.next())
191+
self.assertEqual(r.layout(), child1_body)
192+
self.assertTrue(r.next())
193+
self.assertEqual(r.layout(), child1_footer)
194+
self.assertTrue(r.next())
195+
self.assertEqual(r.layout(), report_footer)
196+
self.assertFalse(r.next())
197+
198+
# add another child
199+
child2 = QgsReportSectionLayout()
200+
child2_header = QgsLayout(p)
201+
child2.setHeader(child2_header)
202+
child2.setHeaderEnabled(True)
203+
child2_footer = QgsLayout(p)
204+
child2.setFooter(child2_footer)
205+
child2.setFooterEnabled(True)
206+
r.appendChild(child2)
207+
self.assertTrue(r.beginRender())
208+
self.assertTrue(r.next())
209+
self.assertEqual(r.layout(), report_header)
210+
self.assertTrue(r.next())
211+
self.assertEqual(r.layout(), child1_header)
212+
self.assertTrue(r.next())
213+
self.assertEqual(r.layout(), child1_body)
214+
self.assertTrue(r.next())
215+
self.assertEqual(r.layout(), child1_footer)
216+
self.assertTrue(r.next())
217+
self.assertEqual(r.layout(), child2_header)
218+
self.assertTrue(r.next())
219+
self.assertEqual(r.layout(), child2_footer)
220+
self.assertTrue(r.next())
221+
self.assertEqual(r.layout(), report_footer)
222+
self.assertFalse(r.next())
223+
224+
# add a child to child2
225+
child2a = QgsReportSectionLayout()
226+
child2a_header = QgsLayout(p)
227+
child2a.setHeader(child2a_header)
228+
child2a.setHeaderEnabled(True)
229+
child2a_footer = QgsLayout(p)
230+
child2a.setFooter(child2a_footer)
231+
child2a.setFooterEnabled(True)
232+
child2.appendChild(child2a)
233+
self.assertTrue(r.beginRender())
234+
self.assertTrue(r.next())
235+
self.assertEqual(r.layout(), report_header)
236+
self.assertTrue(r.next())
237+
self.assertEqual(r.layout(), child1_header)
238+
self.assertTrue(r.next())
239+
self.assertEqual(r.layout(), child1_body)
240+
self.assertTrue(r.next())
241+
self.assertEqual(r.layout(), child1_footer)
242+
self.assertTrue(r.next())
243+
self.assertEqual(r.layout(), child2_header)
244+
self.assertTrue(r.next())
245+
self.assertEqual(r.layout(), child2a_header)
246+
self.assertTrue(r.next())
247+
self.assertEqual(r.layout(), child2a_footer)
248+
self.assertTrue(r.next())
249+
self.assertEqual(r.layout(), child2_footer)
250+
self.assertTrue(r.next())
251+
self.assertEqual(r.layout(), report_footer)
252+
self.assertFalse(r.next())
253+
134254

135255
if __name__ == '__main__':
136256
unittest.main()

0 commit comments

Comments
 (0)
Please sign in to comment.