Branch data Line data Source code
1 : : /***************************************************************************
2 : : qgsmargins.h
3 : : ------------
4 : : Date : January 2017
5 : : Copyright : (C) 2017 by Nyall Dawson
6 : : Email : nyall dot dawson at gmail dot com
7 : : ***************************************************************************
8 : : * *
9 : : * This program is free software; you can redistribute it and/or modify *
10 : : * it under the terms of the GNU General Public License as published by *
11 : : * the Free Software Foundation; either version 2 of the License, or *
12 : : * (at your option) any later version. *
13 : : * *
14 : : ***************************************************************************/
15 : :
16 : : #ifndef QGSMARGINS_H
17 : : #define QGSMARGINS_H
18 : :
19 : : #include "qgis_core.h"
20 : : #include "qgis.h"
21 : : #include <QString>
22 : :
23 : : /**
24 : : * \ingroup core
25 : : * \class QgsMargins
26 : : * \brief The QgsMargins class defines the four margins of a rectangle.
27 : : *
28 : : * QgsMargins defines a set of four margins; left, top, right and bottom, that describe the size of the borders surrounding a rectangle.
29 : : *
30 : : * The isNull() function returns TRUE only if all margins are set to zero.
31 : : * \since QGIS 3.0
32 : : */
33 : :
34 : : //This class was originally based off Qt's QgsMarginsF class
35 : : //It was forked in order to always use double values, rather than qreal values.
36 : :
37 : : class CORE_EXPORT QgsMargins
38 : : {
39 : : public:
40 : :
41 : : /**
42 : : * Constructs a margins object with all margins set to 0.
43 : : */
44 : 0 : QgsMargins() = default;
45 : :
46 : : /**
47 : : * Constructs margins with the given \a left, \a top, \a right, \a bottom
48 : : * \see setLeft()
49 : : * \see setRight()
50 : : * \see setTop()
51 : : * \see setBottom()
52 : : */
53 : 0 : QgsMargins( double left, double top, double right, double bottom )
54 : 0 : : mLeft( left )
55 : 0 : , mTop( top )
56 : 0 : , mRight( right )
57 : 0 : , mBottom( bottom )
58 : 0 : {}
59 : :
60 : : /**
61 : : * Returns \c TRUE if all margins are is 0; otherwise returns FALSE.
62 : : */
63 : 0 : bool isNull() const
64 : : {
65 : 0 : return qgsDoubleNear( mLeft, 0.0 ) && qgsDoubleNear( mTop, 0.0 ) && qgsDoubleNear( mRight, 0.0 ) && qgsDoubleNear( mBottom, 0.0 );
66 : : }
67 : :
68 : : /**
69 : : * Returns the left margin.
70 : : * \see setLeft()
71 : : */
72 : 0 : double left() const { return mLeft; }
73 : :
74 : : /**
75 : : * Returns the top margin.
76 : : * \see setTop()
77 : : */
78 : 0 : double top() const { return mTop; }
79 : :
80 : : /**
81 : : * Returns the right margin.
82 : : * \see setRight()
83 : : */
84 : 0 : double right() const { return mRight; }
85 : :
86 : : /**
87 : : * Returns the bottom margin.
88 : : * \see setBottom()
89 : : */
90 : 0 : double bottom() const { return mBottom; }
91 : :
92 : : /**
93 : : * Sets the left margin to \a left.
94 : : * \see left()
95 : : */
96 : : void setLeft( double left ) { mLeft = left; }
97 : :
98 : : /**
99 : : * Sets the top margin to \a top.
100 : : * \see top()
101 : : */
102 : : void setTop( double top ) { mTop = top; }
103 : :
104 : : /**
105 : : * Sets the right margin to \a right.
106 : : * \see right()
107 : : */
108 : : void setRight( double right ) { mRight = right; }
109 : :
110 : : /**
111 : : * Sets the bottom margin to \a bottom.
112 : : * \see bottom()
113 : : */
114 : : void setBottom( double bottom ) { mBottom = bottom; }
115 : :
116 : : /**
117 : : * Add each component of \a margins to the respective component of this object
118 : : * and returns a reference to it.
119 : : */
120 : : inline QgsMargins &operator+=( const QgsMargins &margins );
121 : :
122 : : /**
123 : : * Subtract each component of \a margins from the respective component of this object
124 : : * and returns a reference to it.
125 : : */
126 : : inline QgsMargins &operator-=( const QgsMargins &margins );
127 : :
128 : : /**
129 : : * Adds the \a addend to each component of this object and returns a reference to it.
130 : : */
131 : : inline QgsMargins &operator+=( double addend );
132 : :
133 : : /**
134 : : * Subtracts the \a subtrahend from each component of this object
135 : : * and returns a reference to it.
136 : : */
137 : : inline QgsMargins &operator-=( double subtrahend );
138 : :
139 : : /**
140 : : * Multiplies each component of this object by \a factor
141 : : * and returns a reference to it.
142 : : */
143 : : inline QgsMargins &operator*=( double factor );
144 : :
145 : : /**
146 : : * Multiplies each component of this object by \a factor
147 : : * and returns a reference to it.
148 : : */
149 : : inline QgsMargins &operator/=( double divisor );
150 : :
151 : : /**
152 : : * Returns the margins encoded to a string.
153 : : * \see fromString()
154 : : */
155 : : QString toString() const;
156 : :
157 : : /**
158 : : * Returns a QgsMargins object decoded from a string, or a null QgsMargins
159 : : * if the string could not be interpreted as margins.
160 : : * \see toString()
161 : : */
162 : : static QgsMargins fromString( const QString &string );
163 : :
164 : : private:
165 : 0 : double mLeft = 0.0;
166 : 0 : double mTop = 0.0;
167 : 0 : double mRight = 0.0;
168 : 0 : double mBottom = 0.0;
169 : : };
170 : :
171 : :
172 : : /**
173 : : * Returns \c TRUE if \a lhs and \a rhs are equal; otherwise returns \c FALSE.
174 : : */
175 : : inline bool operator==( const QgsMargins &lhs, const QgsMargins &rhs )
176 : : {
177 : : return qgsDoubleNear( lhs.left(), rhs.left() )
178 : : && qgsDoubleNear( lhs.top(), rhs.top() )
179 : : && qgsDoubleNear( lhs.right(), rhs.right() )
180 : : && qgsDoubleNear( lhs.bottom(), rhs.bottom() );
181 : : }
182 : :
183 : : /**
184 : : * Returns \c TRUE if \a lhs and \a rhs are different; otherwise returns \c FALSE.
185 : : */
186 : : inline bool operator!=( const QgsMargins &lhs, const QgsMargins &rhs )
187 : : {
188 : : return !operator==( lhs, rhs );
189 : : }
190 : :
191 : : /**
192 : : * Returns a QgsMargins object that is the sum of the given margins, \a m1
193 : : * and \a m2; each component is added separately.
194 : : */
195 : : inline QgsMargins operator+( const QgsMargins &m1, const QgsMargins &m2 )
196 : : {
197 : : return QgsMargins( m1.left() + m2.left(), m1.top() + m2.top(),
198 : : m1.right() + m2.right(), m1.bottom() + m2.bottom() );
199 : : }
200 : :
201 : : /**
202 : : * Returns a QgsMargins object that is formed by subtracting \a m2 from
203 : : * \a m1; each component is subtracted separately.
204 : : */
205 : : inline QgsMargins operator-( const QgsMargins &m1, const QgsMargins &m2 )
206 : : {
207 : : return QgsMargins( m1.left() - m2.left(), m1.top() - m2.top(),
208 : : m1.right() - m2.right(), m1.bottom() - m2.bottom() );
209 : : }
210 : :
211 : : /**
212 : : * Returns a QgsMargins object that is formed by adding \a rhs to \a lhs.
213 : : */
214 : : inline QgsMargins operator+( const QgsMargins &lhs, double rhs )
215 : : {
216 : : return QgsMargins( lhs.left() + rhs, lhs.top() + rhs,
217 : : lhs.right() + rhs, lhs.bottom() + rhs );
218 : : }
219 : :
220 : : /**
221 : : * Returns a QgsMargins object that is formed by adding \a lhs to \a rhs.
222 : : */
223 : : inline QgsMargins operator+( double lhs, const QgsMargins &rhs )
224 : : {
225 : : return QgsMargins( rhs.left() + lhs, rhs.top() + lhs,
226 : : rhs.right() + lhs, rhs.bottom() + lhs );
227 : : }
228 : :
229 : : /**
230 : : * Returns a QgsMargins object that is formed by subtracting \a rhs from \a lhs.
231 : : */
232 : : inline QgsMargins operator-( const QgsMargins &lhs, double rhs )
233 : : {
234 : : return QgsMargins( lhs.left() - rhs, lhs.top() - rhs,
235 : : lhs.right() - rhs, lhs.bottom() - rhs );
236 : : }
237 : :
238 : : /**
239 : : * Returns a QgsMargins object that is formed by multiplying each component
240 : : * of the given \a margins by \a factor.
241 : : */
242 : 0 : inline QgsMargins operator*( const QgsMargins &margins, double factor )
243 : : {
244 : 0 : return QgsMargins( margins.left() * factor, margins.top() * factor,
245 : 0 : margins.right() * factor, margins.bottom() * factor );
246 : : }
247 : :
248 : : /**
249 : : * Returns a QgsMargins object that is formed by multiplying each component
250 : : * of the given \a margins by \a factor.
251 : : */
252 : : inline QgsMargins operator*( double factor, const QgsMargins &margins )
253 : : {
254 : : return QgsMargins( margins.left() * factor, margins.top() * factor,
255 : : margins.right() * factor, margins.bottom() * factor );
256 : : }
257 : :
258 : : /**
259 : : * Returns a QgsMargins object that is formed by dividing the components of
260 : : * the given \a margins by the given \a divisor.
261 : : */
262 : : inline QgsMargins operator/( const QgsMargins &margins, double divisor )
263 : : {
264 : : return QgsMargins( margins.left() / divisor, margins.top() / divisor,
265 : : margins.right() / divisor, margins.bottom() / divisor );
266 : : }
267 : :
268 : : inline QgsMargins &QgsMargins::operator+=( const QgsMargins &margins ) SIP_SKIP
269 : : {
270 : : return *this = *this + margins;
271 : : }
272 : :
273 : : inline QgsMargins &QgsMargins::operator-=( const QgsMargins &margins ) SIP_SKIP
274 : : {
275 : : return *this = *this - margins;
276 : : }
277 : :
278 : : inline QgsMargins &QgsMargins::operator+=( double addend ) SIP_SKIP
279 : : {
280 : : mLeft += addend;
281 : : mTop += addend;
282 : : mRight += addend;
283 : : mBottom += addend;
284 : : return *this;
285 : : }
286 : :
287 : : inline QgsMargins &QgsMargins::operator-=( double subtrahend ) SIP_SKIP
288 : : {
289 : : mLeft -= subtrahend;
290 : : mTop -= subtrahend;
291 : : mRight -= subtrahend;
292 : : mBottom -= subtrahend;
293 : : return *this;
294 : : }
295 : :
296 : 0 : inline QgsMargins &QgsMargins::operator*=( double factor ) SIP_SKIP
297 : : {
298 : 0 : return *this = *this * factor;
299 : : }
300 : :
301 : : inline QgsMargins &QgsMargins::operator/=( double divisor ) SIP_SKIP
302 : : {
303 : : return *this = *this / divisor;
304 : : }
305 : :
306 : : /**
307 : : * Returns a QgsMargins object that is formed from all components of \a margins.
308 : : */
309 : : inline QgsMargins operator+( const QgsMargins &margins )
310 : : {
311 : : return margins;
312 : : }
313 : :
314 : : /**
315 : : * Returns a QgsMargins object that is formed by negating all components of \a margins.
316 : : */
317 : : inline QgsMargins operator-( const QgsMargins &margins )
318 : : {
319 : : return QgsMargins( -margins.left(), -margins.top(), -margins.right(), -margins.bottom() );
320 : : }
321 : :
322 : : Q_DECLARE_TYPEINFO( QgsMargins, Q_MOVABLE_TYPE );
323 : :
324 : : #endif // QGSMARGINS_H
|