Branch data Line data Source code
1 : : /*************************************************************************** 2 : : qgslayoutpoint.h 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 : : * * 11 : : * This program is free software; you can redistribute it and/or modify * 12 : : * it under the terms of the GNU General Public License as published by * 13 : : * the Free Software Foundation; either version 2 of the License, or * 14 : : * (at your option) any later version. * 15 : : * * 16 : : ***************************************************************************/ 17 : : 18 : : #ifndef QGSLAYOUTPOINT_H 19 : : #define QGSLAYOUTPOINT_H 20 : : 21 : : #include "qgis_core.h" 22 : : #include "qgsunittypes.h" 23 : : #include <QPointF> 24 : : 25 : : /** 26 : : * \ingroup core 27 : : * \class QgsLayoutPoint 28 : : * \brief This class provides a method of storing points, consisting of an x and y coordinate, 29 : : * for use in QGIS layouts. Measurement units are stored alongside the position. 30 : : * 31 : : * \see QgsLayoutMeasurementConverter 32 : : * \note This class does not inherit from QPointF since QPointF includes methods which should not apply 33 : : * to positions with units. For instance, the + and - operators would mislead users of this class 34 : : * to believe that addition of two QgsLayoutPoints with different unit types would automatically convert 35 : : * units. Instead, all unit conversion must be handled by a QgsLayoutMeasurementConverter so that 36 : : * conversion between paper and screen units can be correctly performed. 37 : : * \since QGIS 3.0 38 : : */ 39 : : class CORE_EXPORT QgsLayoutPoint 40 : : { 41 : : public: 42 : : 43 : : /** 44 : : * Constructor for QgsLayoutPoint. 45 : : */ 46 : : QgsLayoutPoint( double x, double y, QgsUnitTypes::LayoutUnit units = QgsUnitTypes::LayoutMillimeters ); 47 : : 48 : : /** 49 : : * Constructor for QgsLayoutPoint. 50 : : */ 51 : : explicit QgsLayoutPoint( QPointF point, QgsUnitTypes::LayoutUnit units = QgsUnitTypes::LayoutMillimeters ); 52 : : 53 : : /** 54 : : * Constructor for an empty point, where both x and y are set to 0. 55 : : * \param units units for measurement 56 : : */ 57 : : explicit QgsLayoutPoint( QgsUnitTypes::LayoutUnit units = QgsUnitTypes::LayoutMillimeters ); 58 : : 59 : : /** 60 : : * Sets new x and y coordinates for the point. 61 : : * \see setX() 62 : : * \see setY() 63 : : * \see setUnits() 64 : : */ 65 : 0 : void setPoint( const double x, const double y ) { mX = x; mY = y; } 66 : : 67 : : /** 68 : : * Returns x coordinate of point. 69 : : * \see setX() 70 : : * \see y() 71 : : */ 72 : 0 : double x() const { return mX; } 73 : : 74 : : /** 75 : : * Sets the x coordinate of point. 76 : : * \see x() 77 : : * \see setY() 78 : : */ 79 : 0 : void setX( const double x ) { mX = x; } 80 : : 81 : : /** 82 : : * Returns y coordinate of point. 83 : : * \see setY() 84 : : * \see x() 85 : : */ 86 : 0 : double y() const { return mY; } 87 : : 88 : : /** 89 : : * Sets y coordinate of point. 90 : : * \see y() 91 : : * \see setX() 92 : : */ 93 : 0 : void setY( const double y ) { mY = y; } 94 : : 95 : : /** 96 : : * Returns the units for the point. 97 : : * \see setUnits() 98 : : */ 99 : 0 : QgsUnitTypes::LayoutUnit units() const { return mUnits; } 100 : : 101 : : /** 102 : : * Sets the \a units for the point. Does not alter the stored coordinates, 103 : : * ie. no conversion is done. 104 : : * \see units() 105 : : */ 106 : 0 : void setUnits( const QgsUnitTypes::LayoutUnit units ) { mUnits = units; } 107 : : 108 : : /** 109 : : * Tests whether the position is null, ie both its x and y coordinates 110 : : * are zero. 111 : : * \returns TRUE if point is null 112 : : */ 113 : : bool isNull() const; 114 : : 115 : : /** 116 : : * Converts the layout point to a QPointF. The unit information is discarded 117 : : * during this operation. 118 : : * \returns QPointF with same x and y coordinates as layout point 119 : : */ 120 : : QPointF toQPointF() const; 121 : : 122 : : /** 123 : : * Encodes the layout point to a string 124 : : * \see decodePoint() 125 : : */ 126 : : QString encodePoint() const; 127 : : 128 : : /** 129 : : * Decodes a point from a \a string. 130 : : * \see encodePoint() 131 : : */ 132 : : static QgsLayoutPoint decodePoint( const QString &string ); 133 : : 134 : : bool operator==( const QgsLayoutPoint &other ) const; 135 : : bool operator!=( const QgsLayoutPoint &other ) const; 136 : : 137 : : /** 138 : : * Multiplies the x and y by a scalar value. 139 : : */ 140 : : QgsLayoutPoint operator*( double v ) const; 141 : : 142 : : /** 143 : : * Multiplies the x and y by a scalar value. 144 : : */ 145 : : QgsLayoutPoint operator*=( double v ); 146 : : 147 : : /** 148 : : * Divides the x and y by a scalar value. 149 : : */ 150 : : QgsLayoutPoint operator/( double v ) const; 151 : : 152 : : /** 153 : : * Divides the x and y by a scalar value. 154 : : */ 155 : : QgsLayoutPoint operator/=( double v ); 156 : : 157 : : #ifdef SIP_RUN 158 : : SIP_PYOBJECT __repr__(); 159 : : % MethodCode 160 : : QString str = QStringLiteral( "<QgsLayoutPoint: %1, %2 %3 >" ).arg( sipCpp->x() ).arg( sipCpp->y() ).arg( QgsUnitTypes::toAbbreviatedString( sipCpp->units() ) ); 161 : : sipRes = PyUnicode_FromString( str.toUtf8().constData() ); 162 : : % End 163 : : #endif 164 : : 165 : : private: 166 : : 167 : : double mX = 0.0; 168 : : double mY = 0.0; 169 : : QgsUnitTypes::LayoutUnit mUnits = QgsUnitTypes::LayoutMillimeters; 170 : : 171 : : }; 172 : : 173 : : #endif // QGSLAYOUTPOINT_H