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