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