Main Page · Class Overview · Hierarchy · All Classes
axis.h
1 /***************************************************************************
2 ** **
3 ** QCustomPlot, an easy to use, modern plotting widget for Qt **
4 ** Copyright (C) 2011, 2012, 2013 Emanuel Eichhammer **
5 ** **
6 ** This program is free software: you can redistribute it and/or modify **
7 ** it under the terms of the GNU General Public License as published by **
8 ** the Free Software Foundation, either version 3 of the License, or **
9 ** (at your option) any later version. **
10 ** **
11 ** This program is distributed in the hope that it will be useful, **
12 ** but WITHOUT ANY WARRANTY; without even the implied warranty of **
13 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the **
14 ** GNU General Public License for more details. **
15 ** **
16 ** You should have received a copy of the GNU General Public License **
17 ** along with this program. If not, see http://www.gnu.org/licenses/. **
18 ** **
19 ****************************************************************************
20 ** Author: Emanuel Eichhammer **
21 ** Website/Contact: http://www.qcustomplot.com/ **
22 ** Date: 09.12.13 **
23 ** Version: 1.1.1 **
24 ****************************************************************************/
25 
26 #ifndef QCP_AXIS_H
27 #define QCP_AXIS_H
28 
29 #include "global.h"
30 #include "range.h"
31 #include "layer.h"
32 #include "layout.h"
33 #include "lineending.h"
34 
35 class QCPPainter;
36 class QCustomPlot;
37 class QCPAxis;
38 class QCPAxisRect;
40 class QCPGraph;
41 class QCPAbstractItem;
42 
43 class QCP_LIB_DECL QCPGrid :public QCPLayerable
44 {
45  Q_OBJECT
47  Q_PROPERTY(bool subGridVisible READ subGridVisible WRITE setSubGridVisible)
48  Q_PROPERTY(bool antialiasedSubGrid READ antialiasedSubGrid WRITE setAntialiasedSubGrid)
49  Q_PROPERTY(bool antialiasedZeroLine READ antialiasedZeroLine WRITE setAntialiasedZeroLine)
50  Q_PROPERTY(QPen pen READ pen WRITE setPen)
51  Q_PROPERTY(QPen subGridPen READ subGridPen WRITE setSubGridPen)
52  Q_PROPERTY(QPen zeroLinePen READ zeroLinePen WRITE setZeroLinePen)
54 public:
55  QCPGrid(QCPAxis *parentAxis);
56 
57  // getters:
58  bool subGridVisible() const { return mSubGridVisible; }
59  bool antialiasedSubGrid() const { return mAntialiasedSubGrid; }
60  bool antialiasedZeroLine() const { return mAntialiasedZeroLine; }
61  QPen pen() const { return mPen; }
62  QPen subGridPen() const { return mSubGridPen; }
63  QPen zeroLinePen() const { return mZeroLinePen; }
64 
65  // setters:
66  void setSubGridVisible(bool visible);
67  void setAntialiasedSubGrid(bool enabled);
68  void setAntialiasedZeroLine(bool enabled);
69  void setPen(const QPen &pen);
70  void setSubGridPen(const QPen &pen);
71  void setZeroLinePen(const QPen &pen);
72 
73 protected:
74  // property members:
75  bool mSubGridVisible;
76  bool mAntialiasedSubGrid, mAntialiasedZeroLine;
77  QPen mPen, mSubGridPen, mZeroLinePen;
78  // non-property members:
79  QCPAxis *mParentAxis;
80 
81  // reimplemented virtual methods:
82  virtual void applyDefaultAntialiasingHint(QCPPainter *painter) const;
83  virtual void draw(QCPPainter *painter);
84 
85  // non-virtual methods:
86  void drawGridLines(QCPPainter *painter) const;
87  void drawSubGridLines(QCPPainter *painter) const;
88 
89  friend class QCPAxis;
90 };
91 
92 
93 class QCP_LIB_DECL QCPAxis : public QCPLayerable
94 {
95  Q_OBJECT
97  Q_PROPERTY(AxisType axisType READ axisType)
98  Q_PROPERTY(QCPAxisRect* axisRect READ axisRect)
99  Q_PROPERTY(ScaleType scaleType READ scaleType WRITE setScaleType)
100  Q_PROPERTY(double scaleLogBase READ scaleLogBase WRITE setScaleLogBase)
101  Q_PROPERTY(QCPRange range READ range WRITE setRange)
102  Q_PROPERTY(bool rangeReversed READ rangeReversed WRITE setRangeReversed)
103  Q_PROPERTY(bool autoTicks READ autoTicks WRITE setAutoTicks)
104  Q_PROPERTY(int autoTickCount READ autoTickCount WRITE setAutoTickCount)
105  Q_PROPERTY(bool autoTickLabels READ autoTickLabels WRITE setAutoTickLabels)
106  Q_PROPERTY(bool autoTickStep READ autoTickStep WRITE setAutoTickStep)
107  Q_PROPERTY(bool autoSubTicks READ autoSubTicks WRITE setAutoSubTicks)
108  Q_PROPERTY(bool ticks READ ticks WRITE setTicks)
109  Q_PROPERTY(bool tickLabels READ tickLabels WRITE setTickLabels)
110  Q_PROPERTY(int tickLabelPadding READ tickLabelPadding WRITE setTickLabelPadding)
111  Q_PROPERTY(LabelType tickLabelType READ tickLabelType WRITE setTickLabelType)
112  Q_PROPERTY(QFont tickLabelFont READ tickLabelFont WRITE setTickLabelFont)
113  Q_PROPERTY(QColor tickLabelColor READ tickLabelColor WRITE setTickLabelColor)
114  Q_PROPERTY(double tickLabelRotation READ tickLabelRotation WRITE setTickLabelRotation)
115  Q_PROPERTY(QString dateTimeFormat READ dateTimeFormat WRITE setDateTimeFormat)
116  Q_PROPERTY(Qt::TimeSpec dateTimeSpec READ dateTimeSpec WRITE setDateTimeSpec)
117  Q_PROPERTY(QString numberFormat READ numberFormat WRITE setNumberFormat)
118  Q_PROPERTY(int numberPrecision READ numberPrecision WRITE setNumberPrecision)
119  Q_PROPERTY(double tickStep READ tickStep WRITE setTickStep)
120  Q_PROPERTY(QVector<double> tickVector READ tickVector WRITE setTickVector)
121  Q_PROPERTY(QVector<QString> tickVectorLabels READ tickVectorLabels WRITE setTickVectorLabels)
122  Q_PROPERTY(int tickLengthIn READ tickLengthIn WRITE setTickLengthIn)
123  Q_PROPERTY(int tickLengthOut READ tickLengthOut WRITE setTickLengthOut)
124  Q_PROPERTY(int subTickCount READ subTickCount WRITE setSubTickCount)
125  Q_PROPERTY(int subTickLengthIn READ subTickLengthIn WRITE setSubTickLengthIn)
126  Q_PROPERTY(int subTickLengthOut READ subTickLengthOut WRITE setSubTickLengthOut)
127  Q_PROPERTY(QPen basePen READ basePen WRITE setBasePen)
128  Q_PROPERTY(QPen tickPen READ tickPen WRITE setTickPen)
129  Q_PROPERTY(QPen subTickPen READ subTickPen WRITE setSubTickPen)
130  Q_PROPERTY(QFont labelFont READ labelFont WRITE setLabelFont)
131  Q_PROPERTY(QColor labelColor READ labelColor WRITE setLabelColor)
132  Q_PROPERTY(QString label READ label WRITE setLabel)
133  Q_PROPERTY(int labelPadding READ labelPadding WRITE setLabelPadding)
134  Q_PROPERTY(int padding READ padding WRITE setPadding)
135  Q_PROPERTY(int offset READ offset WRITE setOffset)
136  Q_PROPERTY(SelectableParts selectedParts READ selectedParts WRITE setSelectedParts)
137  Q_PROPERTY(SelectableParts selectableParts READ selectableParts WRITE setSelectableParts)
138  Q_PROPERTY(QFont selectedTickLabelFont READ selectedTickLabelFont WRITE setSelectedTickLabelFont)
139  Q_PROPERTY(QFont selectedLabelFont READ selectedLabelFont WRITE setSelectedLabelFont)
140  Q_PROPERTY(QColor selectedTickLabelColor READ selectedTickLabelColor WRITE setSelectedTickLabelColor)
141  Q_PROPERTY(QColor selectedLabelColor READ selectedLabelColor WRITE setSelectedLabelColor)
142  Q_PROPERTY(QPen selectedBasePen READ selectedBasePen WRITE setSelectedBasePen)
143  Q_PROPERTY(QPen selectedTickPen READ selectedTickPen WRITE setSelectedTickPen)
144  Q_PROPERTY(QPen selectedSubTickPen READ selectedSubTickPen WRITE setSelectedSubTickPen)
145  Q_PROPERTY(QCPLineEnding lowerEnding READ lowerEnding WRITE setLowerEnding)
146  Q_PROPERTY(QCPLineEnding upperEnding READ upperEnding WRITE setUpperEnding)
147  Q_PROPERTY(QCPGrid* grid READ grid)
149 public:
154  enum AxisType { atLeft = 0x01
155  ,atRight = 0x02
156  ,atTop = 0x04
157  ,atBottom = 0x08
158  };
159  Q_FLAGS(AxisType AxisTypes)
160  Q_DECLARE_FLAGS(AxisTypes, AxisType)
167  enum LabelType { ltNumber
168  ,ltDateTime
169  };
170  Q_ENUMS(LabelType)
175  enum ScaleType { stLinear
176  ,stLogarithmic
177  };
178  Q_ENUMS(ScaleType)
183  enum SelectablePart { spNone = 0
184  ,spAxis = 0x001
185  ,spTickLabels = 0x002
186  ,spAxisLabel = 0x004
187  };
188  Q_FLAGS(SelectablePart SelectableParts)
189  Q_DECLARE_FLAGS(SelectableParts, SelectablePart)
190 
191  explicit QCPAxis(QCPAxisRect *parent, AxisType type);
192 
193  // getters:
194  AxisType axisType() const { return mAxisType; }
195  QCPAxisRect *axisRect() const { return mAxisRect; }
196  ScaleType scaleType() const { return mScaleType; }
197  double scaleLogBase() const { return mScaleLogBase; }
198  const QCPRange range() const { return mRange; }
199  bool rangeReversed() const { return mRangeReversed; }
200  bool autoTicks() const { return mAutoTicks; }
201  int autoTickCount() const { return mAutoTickCount; }
202  bool autoTickLabels() const { return mAutoTickLabels; }
203  bool autoTickStep() const { return mAutoTickStep; }
204  bool autoSubTicks() const { return mAutoSubTicks; }
205  bool ticks() const { return mTicks; }
206  bool tickLabels() const { return mTickLabels; }
207  int tickLabelPadding() const { return mTickLabelPadding; }
208  LabelType tickLabelType() const { return mTickLabelType; }
209  QFont tickLabelFont() const { return mTickLabelFont; }
210  QColor tickLabelColor() const { return mTickLabelColor; }
211  double tickLabelRotation() const { return mTickLabelRotation; }
212  QString dateTimeFormat() const { return mDateTimeFormat; }
213  Qt::TimeSpec dateTimeSpec() const { return mDateTimeSpec; }
214  QString numberFormat() const;
215  int numberPrecision() const { return mNumberPrecision; }
216  double tickStep() const { return mTickStep; }
217  QVector<double> tickVector() const { return mTickVector; }
218  QVector<QString> tickVectorLabels() const { return mTickVectorLabels; }
219  int tickLengthIn() const { return mTickLengthIn; }
220  int tickLengthOut() const { return mTickLengthOut; }
221  int subTickCount() const { return mSubTickCount; }
222  int subTickLengthIn() const { return mSubTickLengthIn; }
223  int subTickLengthOut() const { return mSubTickLengthOut; }
224  QPen basePen() const { return mBasePen; }
225  QPen tickPen() const { return mTickPen; }
226  QPen subTickPen() const { return mSubTickPen; }
227  QFont labelFont() const { return mLabelFont; }
228  QColor labelColor() const { return mLabelColor; }
229  QString label() const { return mLabel; }
230  int labelPadding() const { return mLabelPadding; }
231  int padding() const { return mPadding; }
232  int offset() const { return mOffset; }
233  SelectableParts selectedParts() const { return mSelectedParts; }
234  SelectableParts selectableParts() const { return mSelectableParts; }
235  QFont selectedTickLabelFont() const { return mSelectedTickLabelFont; }
236  QFont selectedLabelFont() const { return mSelectedLabelFont; }
237  QColor selectedTickLabelColor() const { return mSelectedTickLabelColor; }
238  QColor selectedLabelColor() const { return mSelectedLabelColor; }
239  QPen selectedBasePen() const { return mSelectedBasePen; }
240  QPen selectedTickPen() const { return mSelectedTickPen; }
241  QPen selectedSubTickPen() const { return mSelectedSubTickPen; }
242  QCPLineEnding lowerEnding() const { return mLowerEnding; }
243  QCPLineEnding upperEnding() const { return mUpperEnding; }
244  QCPGrid *grid() const { return mGrid; }
245 
246  // setters:
247  void setScaleType(ScaleType type);
248  void setScaleLogBase(double base);
249  Q_SLOT void setRange(const QCPRange &range);
250  void setRange(double lower, double upper);
251  void setRange(double position, double size, Qt::AlignmentFlag alignment);
252  void setRangeLower(double lower);
253  void setRangeUpper(double upper);
254  void setRangeReversed(bool reversed);
255  void setAutoTicks(bool on);
256  void setAutoTickCount(int approximateCount);
257  void setAutoTickLabels(bool on);
258  void setAutoTickStep(bool on);
259  void setAutoSubTicks(bool on);
260  void setTicks(bool show);
261  void setTickLabels(bool show);
262  void setTickLabelPadding(int padding);
263  void setTickLabelType(LabelType type);
264  void setTickLabelFont(const QFont &font);
265  void setTickLabelColor(const QColor &color);
266  void setTickLabelRotation(double degrees);
267  void setDateTimeFormat(const QString &format);
268  void setDateTimeSpec(const Qt::TimeSpec &timeSpec);
269  void setNumberFormat(const QString &formatCode);
270  void setNumberPrecision(int precision);
271  void setTickStep(double step);
272  void setTickVector(const QVector<double> &vec);
273  void setTickVectorLabels(const QVector<QString> &vec);
274  void setTickLength(int inside, int outside=0);
275  void setTickLengthIn(int inside);
276  void setTickLengthOut(int outside);
277  void setSubTickCount(int count);
278  void setSubTickLength(int inside, int outside=0);
279  void setSubTickLengthIn(int inside);
280  void setSubTickLengthOut(int outside);
281  void setBasePen(const QPen &pen);
282  void setTickPen(const QPen &pen);
283  void setSubTickPen(const QPen &pen);
284  void setLabelFont(const QFont &font);
285  void setLabelColor(const QColor &color);
286  void setLabel(const QString &str);
287  void setLabelPadding(int padding);
288  void setPadding(int padding);
289  void setOffset(int offset);
290  void setSelectedTickLabelFont(const QFont &font);
291  void setSelectedLabelFont(const QFont &font);
292  void setSelectedTickLabelColor(const QColor &color);
293  void setSelectedLabelColor(const QColor &color);
294  void setSelectedBasePen(const QPen &pen);
295  void setSelectedTickPen(const QPen &pen);
296  void setSelectedSubTickPen(const QPen &pen);
297  Q_SLOT void setSelectableParts(const QCPAxis::SelectableParts &selectableParts);
298  Q_SLOT void setSelectedParts(const QCPAxis::SelectableParts &selectedParts);
299  void setLowerEnding(const QCPLineEnding &ending);
300  void setUpperEnding(const QCPLineEnding &ending);
301 
302  // reimplemented virtual methods:
303  virtual double selectTest(const QPointF &pos, bool onlySelectable, QVariant *details=0) const;
304 
305  // non-virtual methods:
306  Qt::Orientation orientation() const { return mOrientation; }
307  void moveRange(double diff);
308  void scaleRange(double factor, double center);
309  void setScaleRatio(const QCPAxis *otherAxis, double ratio=1.0);
310  void rescale(bool onlyVisiblePlottables=false);
311  double pixelToCoord(double value) const;
312  double coordToPixel(double value) const;
313  SelectablePart getPartAt(const QPointF &pos) const;
314  QList<QCPAbstractPlottable*> plottables() const;
315  QList<QCPGraph*> graphs() const;
316  QList<QCPAbstractItem*> items() const;
317 
318  static AxisType marginSideToAxisType(QCP::MarginSide side);
319 
320 signals:
321  void ticksRequest();
322  void rangeChanged(const QCPRange &newRange);
323  void rangeChanged(const QCPRange &newRange, const QCPRange &oldRange);
324  void selectionChanged(const QCPAxis::SelectableParts &parts);
325 
326 protected:
327  struct CachedLabel
328  {
329  QPointF offset;
330  QPixmap pixmap;
331  };
332  struct TickLabelData
333  {
334  QString basePart, expPart;
335  QRect baseBounds, expBounds, totalBounds, rotatedTotalBounds;
336  QFont baseFont, expFont;
337  };
338 
339  // property members:
340  // axis base:
341  AxisType mAxisType;
342  QCPAxisRect *mAxisRect;
343  int mOffset, mPadding;
344  Qt::Orientation mOrientation;
345  SelectableParts mSelectableParts, mSelectedParts;
346  QPen mBasePen, mSelectedBasePen;
347  QCPLineEnding mLowerEnding, mUpperEnding;
348  // axis label:
349  int mLabelPadding;
350  QString mLabel;
351  QFont mLabelFont, mSelectedLabelFont;
352  QColor mLabelColor, mSelectedLabelColor;
353  // tick labels:
354  int mTickLabelPadding;
355  bool mTickLabels, mAutoTickLabels;
356  double mTickLabelRotation;
357  LabelType mTickLabelType;
358  QFont mTickLabelFont, mSelectedTickLabelFont;
359  QColor mTickLabelColor, mSelectedTickLabelColor;
360  QString mDateTimeFormat;
361  Qt::TimeSpec mDateTimeSpec;
362  int mNumberPrecision;
363  char mNumberFormatChar;
364  bool mNumberBeautifulPowers;
365  bool mNumberMultiplyCross;
366  // ticks and subticks:
367  bool mTicks;
368  double mTickStep;
369  int mSubTickCount, mAutoTickCount;
370  bool mAutoTicks, mAutoTickStep, mAutoSubTicks;
371  int mTickLengthIn, mTickLengthOut, mSubTickLengthIn, mSubTickLengthOut;
372  QPen mTickPen, mSelectedTickPen;
373  QPen mSubTickPen, mSelectedSubTickPen;
374  // scale and range:
375  QCPRange mRange;
376  bool mRangeReversed;
377  ScaleType mScaleType;
378  double mScaleLogBase, mScaleLogBaseLogInv;
379 
380  // non-property members:
381  QCPGrid *mGrid;
382  QCache<QString, CachedLabel> mLabelCache;
383  int mLowestVisibleTick, mHighestVisibleTick;
384  QChar mExponentialChar, mPositiveSignChar;
385  QVector<double> mTickVector;
386  QVector<QString> mTickVectorLabels;
387  QVector<double> mSubTickVector;
388  QRect mAxisSelectionBox, mTickLabelsSelectionBox, mLabelSelectionBox;
389  bool mCachedMarginValid;
390  int mCachedMargin;
391 
392  // introduced virtual methods:
393  virtual void setupTickVectors();
394  virtual void generateAutoTicks();
395  virtual int calculateAutoSubTickCount(double tickStep) const;
396  virtual int calculateMargin();
397  // tick label drawing/caching:
398  virtual void placeTickLabel(QCPPainter *painter, double position, int distanceToAxis, const QString &text, QSize *tickLabelsSize);
399  virtual void drawTickLabel(QCPPainter *painter, double x, double y, const TickLabelData &labelData) const;
400  virtual TickLabelData getTickLabelData(const QFont &font, const QString &text) const;
401  virtual QPointF getTickLabelDrawOffset(const TickLabelData &labelData) const;
402  virtual void getMaxTickLabelSize(const QFont &font, const QString &text, QSize *tickLabelsSize) const;
403 
404  // reimplemented virtual methods:
405  virtual void applyDefaultAntialiasingHint(QCPPainter *painter) const;
406  virtual void draw(QCPPainter *painter);
407  virtual QCP::Interaction selectionCategory() const;
408  // events:
409  virtual void selectEvent(QMouseEvent *event, bool additive, const QVariant &details, bool *selectionStateChanged);
410  virtual void deselectEvent(bool *selectionStateChanged);
411 
412  // non-virtual methods:
413  void visibleTickBounds(int &lowIndex, int &highIndex) const;
414  double baseLog(double value) const;
415  double basePow(double value) const;
416  QPen getBasePen() const;
417  QPen getTickPen() const;
418  QPen getSubTickPen() const;
419  QFont getTickLabelFont() const;
420  QFont getLabelFont() const;
421  QColor getTickLabelColor() const;
422  QColor getLabelColor() const;
423 
424 private:
425  Q_DISABLE_COPY(QCPAxis)
426 
427  friend class QCustomPlot;
428  friend class QCPGrid;
429  friend class QCPAxisRect;
430 };
431 Q_DECLARE_OPERATORS_FOR_FLAGS(QCPAxis::SelectableParts)
432 Q_DECLARE_OPERATORS_FOR_FLAGS(QCPAxis::AxisTypes)
433 Q_DECLARE_METATYPE(QCPAxis::SelectablePart)
434 
435 #endif // QCP_AXIS_H