##// END OF EJS Templates
Optimize polar chart radius calculation a bit....
Optimize polar chart radius calculation a bit. Current algorithm still results in an occasional extra unneeded iteration, as it uses only crude approximation for radius reduction. However, any speedup gained by accurately calculating needed reduction would be very minor compared to approximations used, so it doesn't seem worth the effort to figure out the complex math. Change-Id: If670a1b058a85cd0305b93f62e6388b463bafd0d Reviewed-by: Tomi Korpipää <tomi.korpipaa@digia.com>

File last commit:

r2539:74f3dbde7a75
r2542:189023d9a551
Show More
chartlogvalueaxisy.cpp
137 lines | 4.6 KiB | text/x-c | CppLexer
/ src / axis / logvalueaxis / chartlogvalueaxisy.cpp
Marek Rosa
QLogValueAxis added. Log domain missing
r2274 /****************************************************************************
**
Miikka Heikkinen
Fixed the copyright year 2012 -> 2013
r2432 ** Copyright (C) 2013 Digia Plc
Marek Rosa
QLogValueAxis added. Log domain missing
r2274 ** All rights reserved.
** For any questions to Digia, please use contact form at http://qt.digia.com
**
** This file is part of the Qt Commercial Charts Add-on.
**
** $QT_BEGIN_LICENSE$
** Licensees holding valid Qt Commercial licenses may use this file in
** accordance with the Qt Commercial License Agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and Digia.
**
** If you have questions regarding the use of this file, please use
** contact form at http://qt.digia.com
** $QT_END_LICENSE$
**
****************************************************************************/
#include "chartlogvalueaxisy_p.h"
#include "chartpresenter_p.h"
#include "qlogvalueaxis.h"
Miikka Heikkinen
Add Polar chart support...
r2483 #include "abstractchartlayout_p.h"
Marek Rosa
QLogValueAxis added. Log domain missing
r2274 #include <QGraphicsLayout>
#include <qmath.h>
Marek Rosa
QLogValueAxis number of labels calculation fixed
r2370 #include <QDebug>
Marek Rosa
QLogValueAxis added. Log domain missing
r2274
QTCOMMERCIALCHART_BEGIN_NAMESPACE
Miikka Heikkinen
Add Polar chart support...
r2483 ChartLogValueAxisY::ChartLogValueAxisY(QLogValueAxis *axis, QGraphicsItem *item)
Marek Rosa
QLogValueAxis added. Log domain missing
r2274 : VerticalAxis(axis, item),
m_axis(axis)
{
Miikka Heikkinen
Add Polar chart support...
r2483 QObject::connect(m_axis, SIGNAL(baseChanged(qreal)), this, SLOT(handleBaseChanged(qreal)));
QObject::connect(m_axis, SIGNAL(labelFormatChanged(QString)), this, SLOT(handleLabelFormatChanged(QString)));
Marek Rosa
QLogValueAxis added. Log domain missing
r2274 }
ChartLogValueAxisY::~ChartLogValueAxisY()
{
}
QVector<qreal> ChartLogValueAxisY::calculateLayout() const
{
QVector<qreal> points;
qreal logMax = log10(m_axis->max()) / log10(m_axis->base());
qreal logMin = log10(m_axis->min()) / log10(m_axis->base());
Marek Rosa
Domains added
r2275 qreal leftEdge = logMin < logMax ? logMin : logMax;
qreal ceilEdge = ceil(leftEdge);
Marek Rosa
QSplineSeries calculateControlPoints moved to splinechartitem. This way we don't need to deal with controlPoints on logaritmic scale
r2372 int tickCount = qAbs(ceil(logMax) - ceil(logMin));
Marek Rosa
QLogValueAxis added. Log domain missing
r2274
points.resize(tickCount);
const QRectF &gridRect = gridGeometry();
const qreal deltaY = gridRect.height() / qAbs(logMax - logMin);
for (int i = 0; i < tickCount; ++i)
Miikka Heikkinen
Add Polar chart support...
r2483 points[i] = (ceilEdge + qreal(i)) * -deltaY - leftEdge * -deltaY + gridRect.bottom();
Marek Rosa
QLogValueAxis added. Log domain missing
r2274
return points;
}
void ChartLogValueAxisY::updateGeometry()
{
Miikka Heikkinen
Add Polar chart support...
r2483 const QVector<qreal> &layout = ChartAxisElement::layout();
Marek Rosa
QLogValueAxis added. Log domain missing
r2274 if (layout.isEmpty())
return;
setLabels(createLogValueLabels(m_axis->min(), m_axis->max(), m_axis->base(), layout.size(), m_axis->labelFormat()));
VerticalAxis::updateGeometry();
}
Marek Rosa
Fixed: chart not redrawing when logaxis's logBase value changed
r2322 void ChartLogValueAxisY::handleBaseChanged(qreal base)
{
Q_UNUSED(base);
Michal Klocek
Fixes missing layout updated on ticks,base and format calls
r2333 QGraphicsLayoutItem::updateGeometry();
Marek Rosa
Fixed: chart not redrawing when logaxis's logBase value changed
r2322 if(presenter()) presenter()->layout()->invalidate();
}
Marek Rosa
QLogValueAxis added. Log domain missing
r2274
Marek Rosa
Fixed: axis not redrawing when labelFormat changed
r2323 void ChartLogValueAxisY::handleLabelFormatChanged(const QString &format)
{
Q_UNUSED(format);
Michal Klocek
Fixes missing layout updated on ticks,base and format calls
r2333 QGraphicsLayoutItem::updateGeometry();
Marek Rosa
Fixed: axis not redrawing when labelFormat changed
r2323 if(presenter()) presenter()->layout()->invalidate();
}
Marek Rosa
QLogValueAxis added. Log domain missing
r2274 QSizeF ChartLogValueAxisY::sizeHint(Qt::SizeHint which, const QSizeF &constraint) const
{
Q_UNUSED(constraint)
QSizeF sh;
QSizeF base = VerticalAxis::sizeHint(which, constraint);
QStringList ticksList;
qreal logMax = log10(m_axis->max()) / log10(m_axis->base());
qreal logMin = log10(m_axis->min()) / log10(m_axis->base());
Marek Rosa
QLogValueAxis number of labels calculation fixed
r2370 int tickCount = qAbs(ceil(logMax) - ceil(logMin));
Miikka Heikkinen
Fix sizeHint for logvalue axes that have only single tick...
r2460 if (m_axis->max() > m_axis->min() && tickCount > 0)
Marek Rosa
QLogValueAxis added. Log domain missing
r2274 ticksList = createLogValueLabels(m_axis->min(), m_axis->max(), m_axis->base(), tickCount, m_axis->labelFormat());
else
ticksList.append(QString(" "));
qreal width = 0;
Miikka Heikkinen
Fix vanishing labels for first and last ticks....
r2443 // Height of vertical axis sizeHint indicates the maximum distance labels can extend past
// first and last ticks. Base height is irrelevant.
Marek Rosa
QLogValueAxis added. Log domain missing
r2274 qreal height = 0;
switch (which) {
case Qt::MinimumSize: {
Miikka Heikkinen
Added HTML support for various text items...
r2539 QRectF boundingRect = ChartPresenter::textBoundingRect(axis()->labelsFont(), "...", axis()->labelsAngle());
Miikka Heikkinen
Fix multiline axis label positioning....
r2534 width = boundingRect.width() + labelPadding() + base.width() + 1.0;
Miikka Heikkinen
Fix vanishing labels for first and last ticks....
r2443 height = boundingRect.height() / 2.0;
Miikka Heikkinen
Fix axis sizehints when labels are angled...
r2412 sh = QSizeF(width, height);
Marek Rosa
QLogValueAxis added. Log domain missing
r2274 break;
}
case Qt::PreferredSize: {
Miikka Heikkinen
Fix multiline axis label positioning....
r2534 qreal labelWidth = 0.0;
qreal firstHeight = -1.0;
Miikka Heikkinen
Fix axis sizehints when labels are angled...
r2412 foreach (const QString& s, ticksList) {
Miikka Heikkinen
Added HTML support for various text items...
r2539 QRectF rect = ChartPresenter::textBoundingRect(axis()->labelsFont(), s, axis()->labelsAngle());
Miikka Heikkinen
Fix axis sizehints when labels are angled...
r2412 labelWidth = qMax(rect.width(), labelWidth);
Miikka Heikkinen
Fix vanishing labels for first and last ticks....
r2443 height = rect.height();
Miikka Heikkinen
Fix multiline axis label positioning....
r2534 if (firstHeight < 0.0)
Miikka Heikkinen
Fix vanishing labels for first and last ticks....
r2443 firstHeight = height;
Miikka Heikkinen
Fix axis sizehints when labels are angled...
r2412 }
Miikka Heikkinen
Fix multiline axis label positioning....
r2534 width = labelWidth + labelPadding() + base.width() + 2.0; //two pixels of tolerance
height = qMax(height, firstHeight) / 2.0;
Miikka Heikkinen
Fix axis sizehints when labels are angled...
r2412 sh = QSizeF(width, height);
Marek Rosa
QLogValueAxis added. Log domain missing
r2274 break;
}
default:
break;
}
return sh;
}
Marek Rosa
Fixed: chart not redrawing when logaxis's logBase value changed
r2322 #include "moc_chartlogvalueaxisy_p.cpp"
Marek Rosa
QLogValueAxis added. Log domain missing
r2274 QTCOMMERCIALCHART_END_NAMESPACE