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