Skip to content

Commit fa5eb4e

Browse files
committed
Refine QgsLayoutGuide API
1 parent db36440 commit fa5eb4e

File tree

4 files changed

+47
-3
lines changed

4 files changed

+47
-3
lines changed

python/core/layout/qgslayoutguidecollection.sip

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88

99

1010

11-
class QgsLayoutGuide
11+
class QgsLayoutGuide : QObject
1212
{
1313
%Docstring
1414
Contains the configuration for a single snap guide used by a layout.

src/core/layout/qgslayoutguidecollection.cpp

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,8 @@
2424
//
2525

2626
QgsLayoutGuide::QgsLayoutGuide( QgsLayout *layout, Orientation orientation, const QgsLayoutMeasurement &position )
27-
: mOrientation( orientation )
27+
: QObject( layout )
28+
, mOrientation( orientation )
2829
, mPosition( position )
2930
, mLayout( layout )
3031
, mLineItem( new QGraphicsLineItem() )
@@ -50,6 +51,7 @@ void QgsLayoutGuide::setPosition( const QgsLayoutMeasurement &position )
5051
{
5152
mPosition = position;
5253
update();
54+
emit positionChanged();
5355
}
5456

5557
int QgsLayoutGuide::page() const
@@ -110,6 +112,19 @@ QGraphicsLineItem *QgsLayoutGuide::item()
110112
return mLineItem.get();
111113
}
112114

115+
double QgsLayoutGuide::layoutPosition() const
116+
{
117+
switch ( mOrientation )
118+
{
119+
case Horizontal:
120+
return mLineItem->line().y1();
121+
122+
case Vertical:
123+
return mLineItem->line().x1();
124+
}
125+
return -999; // avoid warning
126+
}
127+
113128
QgsLayoutGuide::Orientation QgsLayoutGuide::orientation() const
114129
{
115130
return mOrientation;

src/core/layout/qgslayoutguidecollection.h

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,11 @@ class QGraphicsLineItem;
3131
* \brief Contains the configuration for a single snap guide used by a layout.
3232
* \since QGIS 3.0
3333
*/
34-
class CORE_EXPORT QgsLayoutGuide
34+
class CORE_EXPORT QgsLayoutGuide : public QObject
3535
{
3636

37+
Q_OBJECT
38+
3739
public:
3840

3941
//! Guide orientation
@@ -98,6 +100,18 @@ class CORE_EXPORT QgsLayoutGuide
98100
*/
99101
QGraphicsLineItem *item();
100102

103+
/**
104+
* Returns the guide's position in absolute layout units.
105+
*/
106+
double layoutPosition() const;
107+
108+
signals:
109+
110+
/**
111+
* Emitted when the guide's position is changed.
112+
*/
113+
void positionChanged();
114+
101115
private:
102116

103117
Orientation mOrientation = Vertical;

tests/src/python/test_qgslayoutguides.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
QgsLayoutItemPage)
2424
from qgis.PyQt.QtGui import (QPen,
2525
QColor)
26+
from qgis.PyQt.QtTest import QSignalSpy
2627

2728
from qgis.testing import start_app, unittest
2829

@@ -40,9 +41,11 @@ def testGuideGettersSetters(self):
4041
self.assertEqual(g.position().length(), 5.0)
4142
self.assertEqual(g.position().units(), QgsUnitTypes.LayoutCentimeters)
4243

44+
position_changed_spy = QSignalSpy(g.positionChanged)
4345
g.setPosition(QgsLayoutMeasurement(15, QgsUnitTypes.LayoutInches))
4446
self.assertEqual(g.position().length(), 15.0)
4547
self.assertEqual(g.position().units(), QgsUnitTypes.LayoutInches)
48+
self.assertEqual(len(position_changed_spy), 1)
4649

4750
g.setPage(1)
4851
self.assertEqual(g.page(), 1)
@@ -59,6 +62,7 @@ def testUpdateGuide(self):
5962
self.assertEqual(g.item().line().y1(), 50)
6063
self.assertEqual(g.item().line().x2(), 297)
6164
self.assertEqual(g.item().line().y2(), 50)
65+
self.assertEqual(g.layoutPosition(), 50)
6266

6367
g.setPosition(QgsLayoutMeasurement(15, QgsUnitTypes.LayoutMillimeters))
6468
g.update()
@@ -67,6 +71,17 @@ def testUpdateGuide(self):
6771
self.assertEqual(g.item().line().y1(), 15)
6872
self.assertEqual(g.item().line().x2(), 297)
6973
self.assertEqual(g.item().line().y2(), 15)
74+
self.assertEqual(g.layoutPosition(), 15)
75+
76+
# vertical guide
77+
g2 = QgsLayoutGuide(l, QgsLayoutGuide.Vertical, QgsLayoutMeasurement(5, QgsUnitTypes.LayoutCentimeters))
78+
g2.update()
79+
self.assertTrue(g2.item().isVisible())
80+
self.assertEqual(g2.item().line().x1(), 50)
81+
self.assertEqual(g2.item().line().y1(), 0)
82+
self.assertEqual(g2.item().line().x2(), 50)
83+
self.assertEqual(g2.item().line().y2(), 210)
84+
self.assertEqual(g2.layoutPosition(), 50)
7085

7186
g.setPage(10)
7287
g.update()

0 commit comments

Comments
 (0)