1 /***************************************************************************
2 qgsscalebarsettings.cpp
3 -----------------------
4 begin : January 2020
5 copyright : (C) 2020 by Nyall Dawson
6 email : nyall dot dawson at gmail dot com
7 ***************************************************************************/
8 /***************************************************************************
9 * *
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
14 * *
15 ***************************************************************************/
16
17 #include "qgsscalebarsettings.h"
18 #include "qgsapplication.h"
19 #include "qgsnumericformat.h"
20 #include "qgsbasicnumericformat.h"
21 #include "qgslinesymbollayer.h"
22 #include "qgssymbol.h"
23 #include "qgsfillsymbollayer.h"
24 #include "qgslinesymbol.h"
25 #include "qgsfillsymbol.h"
26
QgsScaleBarSettings()27 QgsScaleBarSettings::QgsScaleBarSettings()
28 {
29 mTextFormat.setSize( 12.0 );
30 mTextFormat.setSizeUnit( QgsUnitTypes::RenderPoints );
31 mTextFormat.setColor( QColor( 0, 0, 0 ) );
32
33 mNumericFormat = std::make_unique< QgsBasicNumericFormat >();
34
35 mLineSymbol = std::make_unique< QgsLineSymbol >();
36 mLineSymbol->setColor( QColor( 0, 0, 0 ) );
37 mLineSymbol->setWidth( 0.3 );
38 if ( QgsSimpleLineSymbolLayer *line = dynamic_cast< QgsSimpleLineSymbolLayer * >( mLineSymbol->symbolLayer( 0 ) ) )
39 {
40 line->setPenJoinStyle( Qt::MiterJoin );
41 line->setPenCapStyle( Qt::SquareCap );
42 }
43 mLineSymbol->setOutputUnit( QgsUnitTypes::RenderMillimeters );
44 mDivisionLineSymbol.reset( mLineSymbol->clone() );
45 mSubdivisionLineSymbol.reset( mLineSymbol->clone() );
46
47 mFillSymbol = std::make_unique< QgsFillSymbol >();
48 mFillSymbol->setColor( QColor( 0, 0, 0 ) );
49 if ( QgsSimpleFillSymbolLayer *fill = dynamic_cast< QgsSimpleFillSymbolLayer * >( mFillSymbol->symbolLayer( 0 ) ) )
50 {
51 fill->setStrokeStyle( Qt::NoPen );
52 }
53 mAlternateFillSymbol = std::make_unique< QgsFillSymbol >();
54 mAlternateFillSymbol->setColor( QColor( 255, 255, 255 ) );
55 if ( QgsSimpleFillSymbolLayer *fill = dynamic_cast< QgsSimpleFillSymbolLayer * >( mAlternateFillSymbol->symbolLayer( 0 ) ) )
56 {
57 fill->setStrokeStyle( Qt::NoPen );
58 }
59 }
60
QgsScaleBarSettings(const QgsScaleBarSettings & other)61 QgsScaleBarSettings::QgsScaleBarSettings( const QgsScaleBarSettings &other )
62 : mNumSegments( other.mNumSegments )
63 , mNumSegmentsLeft( other.mNumSegmentsLeft )
64 , mNumSubdivisions( other.mNumSubdivisions )
65 , mSubdivisionsHeight( other.mSubdivisionsHeight )
66 , mNumUnitsPerSegment( other.mNumUnitsPerSegment )
67 , mNumMapUnitsPerScaleBarUnit( other.mNumMapUnitsPerScaleBarUnit )
68 , mSegmentSizeMode( other.mSegmentSizeMode )
69 , mMinBarWidth( other.mMinBarWidth )
70 , mMaxBarWidth( other.mMaxBarWidth )
71 , mUnitLabeling( other.mUnitLabeling )
72 , mTextFormat( other.mTextFormat )
73 , mHeight( other.mHeight )
74 , mLineSymbol( other.mLineSymbol->clone() )
75 , mDivisionLineSymbol( other.mDivisionLineSymbol->clone() )
76 , mSubdivisionLineSymbol( other.mSubdivisionLineSymbol->clone() )
77 , mFillSymbol( other.mFillSymbol->clone() )
78 , mAlternateFillSymbol( other.mAlternateFillSymbol->clone() )
79 , mLabelBarSpace( other.mLabelBarSpace )
80 , mLabelVerticalPlacement( other.mLabelVerticalPlacement )
81 , mLabelHorizontalPlacement( other.mLabelHorizontalPlacement )
82 , mBoxContentSpace( other.mBoxContentSpace )
83 , mAlignment( other.mAlignment )
84 , mUnits( other.mUnits )
85 , mNumericFormat( other.mNumericFormat->clone() )
86 {
87
88 }
89
operator =(const QgsScaleBarSettings & other)90 QgsScaleBarSettings &QgsScaleBarSettings::operator=( const QgsScaleBarSettings &other )
91 {
92 mNumSegments = other.mNumSegments;
93 mNumSegmentsLeft = other.mNumSegmentsLeft;
94 mNumSubdivisions = other.mNumSubdivisions;
95 mSubdivisionsHeight = other.mSubdivisionsHeight;
96 mNumUnitsPerSegment = other.mNumUnitsPerSegment;
97 mNumMapUnitsPerScaleBarUnit = other.mNumMapUnitsPerScaleBarUnit;
98 mSegmentSizeMode = other.mSegmentSizeMode;
99 mMinBarWidth = other.mMinBarWidth;
100 mMaxBarWidth = other.mMaxBarWidth;
101 mUnitLabeling = other.mUnitLabeling;
102 mTextFormat = other.mTextFormat;
103 mLineSymbol.reset( other.mLineSymbol->clone() );
104 mDivisionLineSymbol.reset( other.mDivisionLineSymbol->clone() );
105 mSubdivisionLineSymbol.reset( other.mSubdivisionLineSymbol->clone() );
106 mFillSymbol.reset( other.mFillSymbol->clone() );
107 mAlternateFillSymbol.reset( other.mAlternateFillSymbol->clone() );
108 mHeight = other.mHeight;
109 mLabelBarSpace = other.mLabelBarSpace;
110 mLabelVerticalPlacement = other.mLabelVerticalPlacement;
111 mLabelHorizontalPlacement = other.mLabelHorizontalPlacement;
112 mBoxContentSpace = other.mBoxContentSpace;
113 mAlignment = other.mAlignment;
114 mUnits = other.mUnits;
115 mNumericFormat.reset( other.mNumericFormat->clone() );
116 return *this;
117 }
118
fillColor() const119 QColor QgsScaleBarSettings::fillColor() const
120 {
121 return mFillSymbol->color();
122 }
123
setFillColor(const QColor & color)124 void QgsScaleBarSettings::setFillColor( const QColor &color )
125 {
126 mFillSymbol->setColor( color );
127 }
128
fillColor2() const129 QColor QgsScaleBarSettings::fillColor2() const
130 {
131 return mAlternateFillSymbol->color();
132 }
133
setFillColor2(const QColor & color)134 void QgsScaleBarSettings::setFillColor2( const QColor &color )
135 {
136 mAlternateFillSymbol->setColor( color );
137 }
138
lineColor() const139 QColor QgsScaleBarSettings::lineColor() const
140 {
141 return mLineSymbol->color();
142 }
143
setLineColor(const QColor & color)144 void QgsScaleBarSettings::setLineColor( const QColor &color )
145 {
146 for ( QgsLineSymbol *symbol : { mLineSymbol.get(), mDivisionLineSymbol.get(), mSubdivisionLineSymbol.get() } )
147 {
148 symbol->setColor( color );
149 }
150 }
151
lineWidth() const152 double QgsScaleBarSettings::lineWidth() const
153 {
154 return mLineSymbol->width();
155 }
156
setLineWidth(double width)157 void QgsScaleBarSettings::setLineWidth( double width )
158 {
159 for ( QgsLineSymbol *symbol : { mLineSymbol.get(), mDivisionLineSymbol.get(), mSubdivisionLineSymbol.get() } )
160 {
161 symbol->setWidth( width );
162 symbol->setOutputUnit( QgsUnitTypes::RenderMillimeters );
163 }
164 }
165
pen() const166 QPen QgsScaleBarSettings::pen() const
167 {
168 QPen pen( mLineSymbol->color() );
169 if ( QgsSimpleLineSymbolLayer *line = dynamic_cast< QgsSimpleLineSymbolLayer * >( mLineSymbol->symbolLayer( 0 ) ) )
170 {
171 pen.setJoinStyle( line->penJoinStyle() );
172 pen.setCapStyle( line->penCapStyle() );
173 }
174 pen.setWidthF( mLineSymbol->width() );
175 return pen;
176 }
177
setPen(const QPen & pen)178 void QgsScaleBarSettings::setPen( const QPen &pen )
179 {
180 for ( QgsLineSymbol *symbol : { mLineSymbol.get(), mDivisionLineSymbol.get(), mSubdivisionLineSymbol.get() } )
181 {
182 symbol->setColor( pen.color() );
183 symbol->setWidth( pen.widthF() );
184 symbol->setOutputUnit( QgsUnitTypes::RenderMillimeters );
185 if ( QgsSimpleLineSymbolLayer *line = dynamic_cast< QgsSimpleLineSymbolLayer * >( symbol->symbolLayer( 0 ) ) )
186 {
187 line->setPenJoinStyle( pen.joinStyle() );
188 line->setPenCapStyle( pen.capStyle() );
189 }
190 }
191 }
192
lineSymbol() const193 QgsLineSymbol *QgsScaleBarSettings::lineSymbol() const
194 {
195 return mLineSymbol.get();
196 }
197
setLineSymbol(QgsLineSymbol * symbol)198 void QgsScaleBarSettings::setLineSymbol( QgsLineSymbol *symbol )
199 {
200 mLineSymbol.reset( symbol );
201 }
202
divisionLineSymbol() const203 QgsLineSymbol *QgsScaleBarSettings::divisionLineSymbol() const
204 {
205 return mDivisionLineSymbol.get();
206 }
207
setDivisionLineSymbol(QgsLineSymbol * symbol)208 void QgsScaleBarSettings::setDivisionLineSymbol( QgsLineSymbol *symbol )
209 {
210 mDivisionLineSymbol.reset( symbol );
211 }
212
subdivisionLineSymbol() const213 QgsLineSymbol *QgsScaleBarSettings::subdivisionLineSymbol() const
214 {
215 return mSubdivisionLineSymbol.get();
216 }
217
setSubdivisionLineSymbol(QgsLineSymbol * symbol)218 void QgsScaleBarSettings::setSubdivisionLineSymbol( QgsLineSymbol *symbol )
219 {
220 mSubdivisionLineSymbol.reset( symbol );
221 }
222
fillSymbol() const223 QgsFillSymbol *QgsScaleBarSettings::fillSymbol() const
224 {
225 return mFillSymbol.get();
226 }
227
setFillSymbol(QgsFillSymbol * symbol)228 void QgsScaleBarSettings::setFillSymbol( QgsFillSymbol *symbol )
229 {
230 mFillSymbol.reset( symbol );
231 }
232
alternateFillSymbol() const233 QgsFillSymbol *QgsScaleBarSettings::alternateFillSymbol() const
234 {
235 return mAlternateFillSymbol.get();
236 }
237
setAlternateFillSymbol(QgsFillSymbol * symbol)238 void QgsScaleBarSettings::setAlternateFillSymbol( QgsFillSymbol *symbol )
239 {
240 mAlternateFillSymbol.reset( symbol );
241 }
242
brush() const243 QBrush QgsScaleBarSettings::brush() const
244 {
245 QBrush b;
246 b.setColor( mFillSymbol->color() );
247 if ( QgsSimpleFillSymbolLayer *fill = dynamic_cast< QgsSimpleFillSymbolLayer * >( mFillSymbol->symbolLayer( 0 ) ) )
248 {
249 b.setStyle( fill->brushStyle() );
250 }
251
252 return b;
253 }
254
setBrush(const QBrush & brush)255 void QgsScaleBarSettings::setBrush( const QBrush &brush )
256 {
257 mFillSymbol->setColor( brush.color() );
258 if ( QgsSimpleFillSymbolLayer *fill = dynamic_cast< QgsSimpleFillSymbolLayer * >( mFillSymbol->symbolLayer( 0 ) ) )
259 {
260 fill->setBrushStyle( brush.style() );
261 }
262 }
263
brush2() const264 QBrush QgsScaleBarSettings::brush2() const
265 {
266 QBrush b;
267 b.setColor( mAlternateFillSymbol->color() );
268 if ( QgsSimpleFillSymbolLayer *fill = dynamic_cast< QgsSimpleFillSymbolLayer * >( mAlternateFillSymbol->symbolLayer( 0 ) ) )
269 {
270 b.setStyle( fill->brushStyle() );
271 }
272
273 return b;
274 }
275
setBrush2(const QBrush & brush)276 void QgsScaleBarSettings::setBrush2( const QBrush &brush )
277 {
278 mAlternateFillSymbol->setColor( brush.color() );
279 if ( QgsSimpleFillSymbolLayer *fill = dynamic_cast< QgsSimpleFillSymbolLayer * >( mAlternateFillSymbol->symbolLayer( 0 ) ) )
280 {
281 fill->setBrushStyle( brush.style() );
282 }
283 }
284
lineJoinStyle() const285 Qt::PenJoinStyle QgsScaleBarSettings::lineJoinStyle() const
286 {
287 if ( QgsSimpleLineSymbolLayer *line = dynamic_cast< QgsSimpleLineSymbolLayer * >( mLineSymbol->symbolLayer( 0 ) ) )
288 {
289 return line->penJoinStyle();
290 }
291 return Qt::MiterJoin;
292 }
293
setLineJoinStyle(Qt::PenJoinStyle style)294 void QgsScaleBarSettings::setLineJoinStyle( Qt::PenJoinStyle style )
295 {
296 for ( QgsLineSymbol *symbol : { mLineSymbol.get(), mDivisionLineSymbol.get(), mSubdivisionLineSymbol.get() } )
297 {
298 if ( QgsSimpleLineSymbolLayer *line = dynamic_cast< QgsSimpleLineSymbolLayer * >( symbol->symbolLayer( 0 ) ) )
299 {
300 line->setPenJoinStyle( style );
301 }
302 }
303 }
304
lineCapStyle() const305 Qt::PenCapStyle QgsScaleBarSettings::lineCapStyle() const
306 {
307 if ( QgsSimpleLineSymbolLayer *line = dynamic_cast< QgsSimpleLineSymbolLayer * >( mLineSymbol->symbolLayer( 0 ) ) )
308 {
309 return line->penCapStyle();
310 }
311 return Qt::FlatCap;
312 }
313
setLineCapStyle(Qt::PenCapStyle style)314 void QgsScaleBarSettings::setLineCapStyle( Qt::PenCapStyle style )
315 {
316 for ( QgsLineSymbol *symbol : { mLineSymbol.get(), mDivisionLineSymbol.get(), mSubdivisionLineSymbol.get() } )
317 {
318 if ( QgsSimpleLineSymbolLayer *line = dynamic_cast< QgsSimpleLineSymbolLayer * >( symbol->symbolLayer( 0 ) ) )
319 {
320 line->setPenCapStyle( style );
321 }
322 }
323 }
324
numericFormat() const325 const QgsNumericFormat *QgsScaleBarSettings::numericFormat() const
326 {
327 return mNumericFormat.get();
328 }
329
setNumericFormat(QgsNumericFormat * format)330 void QgsScaleBarSettings::setNumericFormat( QgsNumericFormat *format )
331 {
332 mNumericFormat.reset( format );
333 }
334
335 QgsScaleBarSettings::~QgsScaleBarSettings() = default;
336
337