File indexing completed on 2024-05-12 04:20:36
0001 /* 0002 * SPDX-FileCopyrightText: 2001-2015 Klaralvdalens Datakonsult AB. All rights reserved. 0003 * 0004 * This file is part of the KD Chart library. 0005 * 0006 * SPDX-License-Identifier: GPL-2.0-or-later 0007 */ 0008 0009 #include "KChartRulerAttributes.h" 0010 0011 #include "KChartMath_p.h" 0012 0013 #include <QPen> 0014 #include <QDebug> 0015 0016 #define d d_func() 0017 0018 using namespace KChart; 0019 0020 class Q_DECL_HIDDEN RulerAttributes::Private 0021 { 0022 friend class RulerAttributes; 0023 public: 0024 Private(); 0025 private: 0026 QPen tickMarkPen; 0027 QPen majorTickMarkPen; 0028 QPen minorTickMarkPen; 0029 QPen rulerLinePen; 0030 0031 bool majorTickMarkPenIsSet : 1; 0032 bool minorTickMarkPenIsSet : 1; 0033 0034 bool showMajorTickMarks : 1; 0035 bool showMinorTickMarks : 1; 0036 0037 bool showRulerLine : 1; 0038 0039 bool majorTickLengthIsSet : 1; 0040 bool minorTickLengthIsSet : 1; 0041 0042 bool showFirstTick : 1; 0043 0044 int labelMargin; 0045 int majorTickLength; 0046 int minorTickLength; 0047 0048 RulerAttributes::TickMarkerPensMap customTickMarkPens; 0049 }; 0050 0051 RulerAttributes::Private::Private() 0052 : tickMarkPen( Qt::black ) 0053 , majorTickMarkPen( Qt::black ) 0054 , minorTickMarkPen( Qt::black ) 0055 , majorTickMarkPenIsSet( false ) 0056 , minorTickMarkPenIsSet( false ) 0057 , showMajorTickMarks( true ) 0058 , showMinorTickMarks( true ) 0059 , showRulerLine( false ) 0060 , majorTickLengthIsSet( false ) 0061 , minorTickLengthIsSet( false ) 0062 , showFirstTick( true ) 0063 , labelMargin( -1 ) 0064 , majorTickLength( 3 ) 0065 , minorTickLength( 2 ) 0066 { 0067 tickMarkPen.setCapStyle( Qt::FlatCap ); 0068 majorTickMarkPen.setCapStyle( Qt::FlatCap ); 0069 minorTickMarkPen.setCapStyle( Qt::FlatCap ); 0070 } 0071 0072 RulerAttributes::RulerAttributes() 0073 : _d( new Private() ) 0074 { 0075 // this block left empty intentionally 0076 } 0077 0078 RulerAttributes::RulerAttributes( const RulerAttributes& r ) 0079 : _d( new Private( *r.d ) ) 0080 { 0081 } 0082 0083 void RulerAttributes::setTickMarkPen( const QPen& pen ) 0084 { 0085 d->tickMarkPen = pen; 0086 } 0087 0088 QPen RulerAttributes::tickMarkPen() const 0089 { 0090 return d->tickMarkPen; 0091 } 0092 0093 void RulerAttributes::setMajorTickMarkPen( const QPen& pen ) 0094 { 0095 d->majorTickMarkPen = pen; 0096 d->majorTickMarkPenIsSet = true; 0097 } 0098 0099 bool RulerAttributes::majorTickMarkPenIsSet() const 0100 { 0101 return d->majorTickMarkPenIsSet; 0102 } 0103 0104 QPen RulerAttributes::majorTickMarkPen() const 0105 { 0106 return d->majorTickMarkPenIsSet ? d->majorTickMarkPen : d->tickMarkPen; 0107 } 0108 0109 void RulerAttributes::setMinorTickMarkPen( const QPen& pen ) 0110 { 0111 d->minorTickMarkPen = pen; 0112 d->minorTickMarkPenIsSet = true; 0113 } 0114 0115 bool RulerAttributes::minorTickMarkPenIsSet() const 0116 { 0117 return d->minorTickMarkPenIsSet; 0118 } 0119 0120 QPen RulerAttributes::minorTickMarkPen() const 0121 { 0122 return d->minorTickMarkPenIsSet ? d->minorTickMarkPen : d->tickMarkPen; 0123 } 0124 0125 void RulerAttributes::setTickMarkPen( qreal value, const QPen& pen ) 0126 { 0127 if ( !d->customTickMarkPens.contains( value ) ) 0128 d->customTickMarkPens.insert( value, pen ); 0129 } 0130 0131 QPen RulerAttributes::tickMarkPen( qreal value ) const 0132 { 0133 QMapIterator<qreal, QPen> it( d->customTickMarkPens ); 0134 while ( it.hasNext() ) { 0135 it.next(); 0136 if ( qAbs( value - it.key() ) < std::numeric_limits< float >::epsilon() ) 0137 return it.value(); 0138 } 0139 return d->tickMarkPen; 0140 } 0141 0142 RulerAttributes::TickMarkerPensMap RulerAttributes::tickMarkPens() const 0143 { 0144 return d->customTickMarkPens; 0145 } 0146 0147 bool RulerAttributes::hasTickMarkPenAt( qreal value ) const 0148 { 0149 QMapIterator<qreal, QPen> it( d->customTickMarkPens ); 0150 while ( it.hasNext() ) { 0151 it.next(); 0152 if ( qAbs( value - it.key() ) < std::numeric_limits< float >::epsilon() ) 0153 return true; 0154 } 0155 return false; 0156 } 0157 0158 void RulerAttributes::setTickMarkColor( const QColor& color ) 0159 { 0160 d->tickMarkPen.setColor( color ); 0161 } 0162 0163 QColor RulerAttributes::tickMarkColor() const 0164 { 0165 return d->tickMarkPen.color(); 0166 } 0167 0168 void RulerAttributes::setShowMajorTickMarks( bool show ) 0169 { 0170 d->showMajorTickMarks = show; 0171 } 0172 0173 bool RulerAttributes::showMajorTickMarks() const 0174 { 0175 return d->showMajorTickMarks; 0176 } 0177 0178 void RulerAttributes::setShowMinorTickMarks( bool show ) 0179 { 0180 d->showMinorTickMarks = show; 0181 } 0182 0183 bool RulerAttributes::showMinorTickMarks() const 0184 { 0185 return d->showMinorTickMarks; 0186 } 0187 0188 void RulerAttributes::setLabelMargin(int margin) 0189 { 0190 d->labelMargin = margin; 0191 } 0192 0193 int RulerAttributes::labelMargin() const 0194 { 0195 return d->labelMargin; 0196 } 0197 0198 void RulerAttributes::setMajorTickMarkLength( int length ) 0199 { 0200 d->majorTickLength = length; 0201 d->majorTickLengthIsSet = true; 0202 } 0203 0204 int RulerAttributes::majorTickMarkLength() const 0205 { 0206 return d->majorTickLength; 0207 } 0208 0209 bool RulerAttributes::majorTickMarkLengthIsSet() const 0210 { 0211 return d->majorTickLengthIsSet; 0212 } 0213 0214 void RulerAttributes::setMinorTickMarkLength( int length ) 0215 { 0216 d->minorTickLength = length; 0217 d->minorTickLengthIsSet = true; 0218 } 0219 0220 int RulerAttributes::minorTickMarkLength() const 0221 { 0222 return d->minorTickLength; 0223 } 0224 0225 bool RulerAttributes::minorTickMarkLengthIsSet() const 0226 { 0227 return d->minorTickLengthIsSet; 0228 } 0229 0230 void RulerAttributes::setShowFirstTick( bool show ) 0231 { 0232 d->showFirstTick = show; 0233 } 0234 0235 bool RulerAttributes::showFirstTick() const 0236 { 0237 return d->showFirstTick; 0238 } 0239 0240 RulerAttributes & RulerAttributes::operator=( const RulerAttributes& r ) 0241 { 0242 if ( this == &r ) 0243 return *this; 0244 0245 *d = *r.d; 0246 0247 return *this; 0248 } 0249 0250 RulerAttributes::~RulerAttributes() 0251 { 0252 delete _d; _d = nullptr; 0253 } 0254 0255 bool RulerAttributes::operator==( const RulerAttributes& r ) const 0256 { 0257 bool isEqual = tickMarkPen() == r.tickMarkPen() && 0258 majorTickMarkPen() == r.majorTickMarkPen() && 0259 minorTickMarkPen() == r.minorTickMarkPen() && 0260 majorTickMarkPenIsSet() == r.majorTickMarkPenIsSet() && 0261 minorTickMarkPenIsSet() == r.minorTickMarkPenIsSet() && 0262 showMajorTickMarks() == r.showMajorTickMarks() && 0263 showMinorTickMarks() == r.showMinorTickMarks() && 0264 rulerLinePen() == r.rulerLinePen() && 0265 showRulerLine() == r.showRulerLine() && 0266 majorTickMarkLengthIsSet() == r.majorTickMarkLengthIsSet() && 0267 minorTickMarkLengthIsSet() == r.minorTickMarkLengthIsSet() && 0268 showFirstTick() == r.showFirstTick() && 0269 d->customTickMarkPens.size() == r.d->customTickMarkPens.size(); 0270 if ( !isEqual ) { 0271 return false; 0272 } 0273 QMap< qreal, QPen >::ConstIterator it = d->customTickMarkPens.constBegin(); 0274 QMap< qreal, QPen >::ConstIterator it2 = r.d->customTickMarkPens.constBegin(); 0275 for ( ; it != d->customTickMarkPens.constEnd(); ++it, ++it2 ) { 0276 if ( it.key() != it2.key() || it.value() != it2.value() ) { 0277 return false; 0278 } 0279 } 0280 return true; 0281 } 0282 0283 void RulerAttributes::setRulerLinePen(const QPen &pen) 0284 { 0285 d->rulerLinePen = pen; 0286 } 0287 0288 QPen RulerAttributes::rulerLinePen() const 0289 { 0290 return d->rulerLinePen; 0291 } 0292 0293 void RulerAttributes::setShowRulerLine( bool show ) 0294 { 0295 d->showRulerLine = show; 0296 } 0297 0298 bool RulerAttributes::showRulerLine() const 0299 { 0300 return d->showRulerLine; 0301 } 0302 0303 #if !defined( QT_NO_DEBUG_STREAM ) 0304 QDebug operator << ( QDebug dbg, const KChart::RulerAttributes& a ) 0305 { 0306 dbg << "KChart::RulerAttributes(" 0307 << "tickMarkPen=" << a.tickMarkPen() 0308 << "majorTickMarkPen=" << a.majorTickMarkPen() 0309 << "minorTickMarkPen=" << a.minorTickMarkPen(); 0310 const RulerAttributes::TickMarkerPensMap pens( a.tickMarkPens() ); 0311 QMapIterator<qreal, QPen> it( pens ); 0312 while ( it.hasNext() ) { 0313 it.next(); 0314 dbg << "customTickMarkPen=(" << it.value() << " : " << it.key() << ")"; 0315 } 0316 dbg << ")"; 0317 return dbg; 0318 } 0319 #endif /* QT_NO_DEBUG_STREAM */ 0320