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