KD Chart API Documentation  3.1
KDChartMeasure.cpp
Go to the documentation of this file.
1 /****************************************************************************
2 **
3 ** This file is part of the KD Chart library.
4 **
5 ** SPDX-FileCopyrightText: 2001 Klarälvdalens Datakonsult AB, a KDAB Group company <info@kdab.com>
6 **
7 ** SPDX-License-Identifier: MIT
8 **
9 ****************************************************************************/
10 
11 #include "KDChartMeasure.h"
12 
13 #include <QWidget>
14 
15 #include <KDChartAbstractArea.h>
18 #include <KDChartFrameAttributes.h>
19 #include <KDChartTextAttributes.h>
20 
21 #include <KDABLibFakes>
22 
23 namespace KDChart {
24 
26 {
27  // this block left empty intentionally
28 }
29 
30 Measure::Measure(qreal value,
33  : mValue(value)
34  , mMode(mode)
35  , mArea(nullptr)
36  , mOrientation(orientation)
37 {
38  // this block left empty intentionally
39 }
40 
42  : mValue(r.value())
43  , mMode(r.calculationMode())
44  , mArea(r.referenceArea())
45  , mOrientation(r.referenceOrientation())
46 {
47  // this block left empty intentionally
48 }
49 
51 {
52  if (this != &r) {
53  mValue = r.value();
54  mMode = r.calculationMode();
55  mArea = r.referenceArea();
56  mOrientation = r.referenceOrientation();
57  }
58 
59  return *this;
60 }
61 
62 qreal Measure::calculatedValue(const QSizeF &autoSize,
63  KDChartEnums::MeasureOrientation autoOrientation) const
64 {
66  return mValue;
67  } else {
68  qreal value = 0.0;
69  const QObject theAutoArea;
70  const QObject *autoArea = &theAutoArea;
71  const QObject *area = mArea ? mArea : autoArea;
72  KDChartEnums::MeasureOrientation orientation = mOrientation;
73  switch (mMode) {
75  area = autoArea;
76  orientation = autoOrientation;
77  break;
79  area = autoArea;
80  break;
82  orientation = autoOrientation;
83  break;
84  case KDChartEnums::MeasureCalculationModeAbsolute: // fall through intended
86  break;
87  }
88  if (area) {
89  QSizeF size;
90  if (area == autoArea)
91  size = autoSize;
92  else
93  size = sizeOfArea(area);
94  // qDebug() << ( area == autoArea ) << "size" << size;
95  qreal referenceValue = 0;
96  switch (orientation) {
97  case KDChartEnums::MeasureOrientationAuto: // fall through intended
99  referenceValue = qMin(size.width(), size.height());
100  break;
102  referenceValue = qMax(size.width(), size.height());
103  break;
105  referenceValue = size.width();
106  break;
108  referenceValue = size.height();
109  break;
110  }
111  value = mValue / 1000.0 * referenceValue;
112  }
113  return value;
114  }
115 }
116 
117 qreal Measure::calculatedValue(const QObject *autoArea,
118  KDChartEnums::MeasureOrientation autoOrientation) const
119 {
120  return calculatedValue(sizeOfArea(autoArea), autoOrientation);
121 }
122 
123 const QSizeF Measure::sizeOfArea(const QObject *area) const
124 {
125  QSizeF size;
126  const auto *plane = dynamic_cast<const CartesianCoordinatePlane *>(area);
127  if (false) {
128  size = plane->visibleDiagramArea().size();
129  } else {
130  const auto *kdcArea = dynamic_cast<const AbstractArea *>(area);
131  if (kdcArea) {
132  size = kdcArea->geometry().size();
133  // qDebug() << "Measure::sizeOfArea() found kdcArea with size" << size;
134  } else {
135  const auto *widget = dynamic_cast<const QWidget *>(area);
136  if (widget) {
137  /* ATTENTION: Using the layout does not work: The Legend will never get the right size then!
138  const QLayout * layout = widget->layout();
139  if ( layout ) {
140  size = layout->geometry().size();
141  //qDebug() << "Measure::sizeOfArea() found widget with layout size" << size;
142  } else*/
143  {
144  size = widget->geometry().size();
145  // qDebug() << "Measure::sizeOfArea() found widget with size" << size;
146  }
147  } else if (mMode != KDChartEnums::MeasureCalculationModeAbsolute) {
148  size = QSizeF(1.0, 1.0);
149  // qDebug("Measure::sizeOfArea() got no valid area.");
150  }
151  }
152  }
153  const QPair<qreal, qreal> factors = GlobalMeasureScaling::instance()->currentFactors();
154  return QSizeF(size.width() * factors.first, size.height() * factors.second);
155 }
156 
157 bool Measure::operator==(const Measure &r) const
158 {
159  return (mValue == r.value() && mMode == r.calculationMode() && mArea == r.referenceArea() && mOrientation == r.referenceOrientation());
160 }
161 
163 {
164  mFactors.push(qMakePair(qreal(1.0), qreal(1.0)));
165 }
166 
168 {
169  // this space left empty intentionally
170 }
171 
173 {
175  return &instance;
176 }
177 
178 void GlobalMeasureScaling::setFactors(qreal factorX, qreal factorY)
179 {
180  instance()->mFactors.push(qMakePair(factorX, factorY));
181 }
182 
184 {
185  // never remove the initial (1.0. 1.0) setting
186  if (instance()->mFactors.count() > 1)
187  instance()->mFactors.pop();
188 }
189 
190 const QPair<qreal, qreal> GlobalMeasureScaling::currentFactors()
191 {
192  return instance()->mFactors.top();
193 }
194 
195 void GlobalMeasureScaling::setPaintDevice(QPaintDevice *paintDevice)
196 {
197  instance()->m_paintDevice = paintDevice;
198 }
199 
201 {
202  return instance()->m_paintDevice;
203 }
204 }
205 
206 #if !defined(QT_NO_DEBUG_STREAM)
207 QDebug operator<<(QDebug dbg, const KDChart::Measure &m)
208 {
209  dbg << "KDChart::Measure("
210  << "value=" << m.value()
211  << "calculationmode=" << m.calculationMode()
212  << "referencearea=" << m.referenceArea()
213  << "referenceorientation=" << m.referenceOrientation()
214  << ")";
215  return dbg;
216 }
217 #endif /* QT_NO_DEBUG_STREAM */
QDebug operator<<(QDebug dbg, const KDChart::Measure &m)
Declaring the class KDChart::Measure.
@ MeasureCalculationModeRelative
Definition: KDChartEnums.h:216
@ MeasureCalculationModeAutoOrientation
Definition: KDChartEnums.h:219
@ MeasureCalculationModeAbsolute
Definition: KDChartEnums.h:215
@ MeasureCalculationModeAuto
Definition: KDChartEnums.h:217
@ MeasureCalculationModeAutoArea
Definition: KDChartEnums.h:218
@ MeasureOrientationVertical
Definition: KDChartEnums.h:289
@ MeasureOrientationMinimum
Definition: KDChartEnums.h:290
@ MeasureOrientationMaximum
Definition: KDChartEnums.h:291
@ MeasureOrientationAuto
Definition: KDChartEnums.h:287
@ MeasureOrientationHorizontal
Definition: KDChartEnums.h:288
An area in the chart with a background, a frame, etc.
static const QPair< qreal, qreal > currentFactors()
static void setFactors(qreal factorX, qreal factorY)
static GlobalMeasureScaling * instance()
static void setPaintDevice(QPaintDevice *paintDevice)
static QPaintDevice * paintDevice()
Measure is used to specify relative and absolute sizes in KDChart, e.g. font sizes.
qreal calculatedValue(const QObject *autoArea, KDChartEnums::MeasureOrientation autoOrientation) const
const QObject * referenceArea() const
qreal value() const
const QSizeF sizeOfArea(const QObject *area) const
KDChartEnums::MeasureOrientation referenceOrientation() const
KDChartEnums::MeasureCalculationMode calculationMode() const
Measure & operator=(const Measure &)
bool operator==(const Measure &) const

© 2001 Klarälvdalens Datakonsult AB (KDAB)
"The Qt, C++ and OpenGL Experts"
https://www.kdab.com/
https://www.kdab.com/development-resources/qt-tools/kd-chart/
Generated by doxygen 1.9.1