chartaxis.cpp
503 lines
| 14.0 KiB
| text/x-c
|
CppLexer
Jani Honkonen
|
r794 | /**************************************************************************** | ||
** | ||||
** Copyright (C) 2012 Digia Plc | ||||
** 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$ | ||||
** | ||||
****************************************************************************/ | ||||
Michal Klocek
|
r1006 | #include "chartaxis_p.h" | ||
Michal Klocek
|
r1541 | #include "qabstractaxis.h" | ||
#include "qabstractaxis_p.h" | ||||
Michal Klocek
|
r262 | #include "chartpresenter_p.h" | ||
Michal Klocek
|
r2105 | #include "chartlayout_p.h" | ||
Michal Klocek
|
r1698 | #include "domain_p.h" | ||
Michal Klocek
|
r1577 | #include <qmath.h> | ||
Marek Rosa
|
r1717 | #include <QDateTime> | ||
Marek Rosa
|
r1854 | #include <QValueAxis> | ||
Michal Klocek
|
r1890 | #include <QGraphicsLayout> | ||
Michal Klocek
|
r1965 | #include <QFontMetrics> | ||
Michal Klocek
|
r67 | |||
QTCOMMERCIALCHART_BEGIN_NAMESPACE | ||||
Jani Honkonen
|
r2131 | ChartAxis::ChartAxis(QAbstractAxis *axis, ChartPresenter *presenter, bool intervalAxis) | ||
: ChartElement(presenter), | ||||
m_chartAxis(axis), | ||||
m_labelsAngle(0), | ||||
m_grid(new QGraphicsItemGroup(presenter->rootItem())), | ||||
m_shades(new QGraphicsItemGroup(presenter->rootItem())), | ||||
m_labels(new QGraphicsItemGroup(presenter->rootItem())), | ||||
m_arrow(new QGraphicsItemGroup(presenter->rootItem())), | ||||
m_title(new QGraphicsSimpleTextItem(presenter->rootItem())), | ||||
m_min(0), | ||||
m_max(0), | ||||
m_animation(0), | ||||
m_labelPadding(5), | ||||
m_intervalAxis(intervalAxis) | ||||
Michal Klocek
|
r67 | { | ||
Michal Klocek
|
r145 | //initial initialization | ||
Michal Klocek
|
r1729 | m_arrow->setZValue(ChartPresenter::AxisZValue); | ||
m_arrow->setHandlesChildEvents(false); | ||||
Michal Klocek
|
r1745 | m_labels->setZValue(ChartPresenter::AxisZValue); | ||
Jani Honkonen
|
r784 | m_shades->setZValue(ChartPresenter::ShadesZValue); | ||
m_grid->setZValue(ChartPresenter::GridZValue); | ||||
Michal Klocek
|
r439 | |||
Jani Honkonen
|
r2131 | QObject::connect(m_chartAxis->d_ptr.data(), SIGNAL(updated()), this, SLOT(handleAxisUpdated())); | ||
Michal Klocek
|
r502 | |||
Michal Klocek
|
r1534 | QGraphicsSimpleTextItem item; | ||
m_font = item.font(); | ||||
Michal Klocek
|
r1837 | |||
Michal Klocek
|
r67 | } | ||
Michal Klocek
|
r1006 | ChartAxis::~ChartAxis() | ||
Michal Klocek
|
r67 | { | ||
} | ||||
Jani Honkonen
|
r2131 | void ChartAxis::setAnimation(AxisAnimation *animation) | ||
Michal Klocek
|
r176 | { | ||
Jani Honkonen
|
r2131 | m_animation = animation; | ||
Michal Klocek
|
r1241 | } | ||
Michal Klocek
|
r530 | |||
Michal Klocek
|
r1241 | void ChartAxis::setLayout(QVector<qreal> &layout) | ||
{ | ||||
Jani Honkonen
|
r2131 | m_layoutVector = layout; | ||
Michal Klocek
|
r1241 | } | ||
void ChartAxis::createItems(int count) | ||||
{ | ||||
Michal Klocek
|
r1729 | if (m_arrow->children().size() == 0) | ||
Jani Honkonen
|
r2131 | m_arrow->addToGroup(new AxisItem(this, presenter()->rootItem())); | ||
if (m_intervalAxis && m_grid->children().size() == 0) { | ||||
for (int i = 0 ; i < 2 ; i ++) | ||||
Michal Klocek
|
r2111 | m_grid->addToGroup(new QGraphicsLineItem(presenter()->rootItem())); | ||
} | ||||
Jani Honkonen
|
r2131 | |||
Michal Klocek
|
r223 | for (int i = 0; i < count; ++i) { | ||
Michal Klocek
|
r1744 | m_grid->addToGroup(new QGraphicsLineItem(presenter()->rootItem())); | ||
m_labels->addToGroup(new QGraphicsSimpleTextItem(presenter()->rootItem())); | ||||
m_arrow->addToGroup(new QGraphicsLineItem(presenter()->rootItem())); | ||||
Jani Honkonen
|
r2131 | if ((m_grid->childItems().size()) % 2 && m_grid->childItems().size() > 2) | ||
Michal Klocek
|
r2111 | m_shades->addToGroup(new QGraphicsRectItem(presenter()->rootItem())); | ||
Michal Klocek
|
r1241 | } | ||
Michal Klocek
|
r176 | } | ||
Michal Klocek
|
r1006 | void ChartAxis::deleteItems(int count) | ||
Michal Klocek
|
r176 | { | ||
Jani Honkonen
|
r784 | QList<QGraphicsItem *> lines = m_grid->childItems(); | ||
QList<QGraphicsItem *> labels = m_labels->childItems(); | ||||
QList<QGraphicsItem *> shades = m_shades->childItems(); | ||||
Michal Klocek
|
r1729 | QList<QGraphicsItem *> axis = m_arrow->childItems(); | ||
Michal Klocek
|
r176 | |||
Michal Klocek
|
r291 | for (int i = 0; i < count; ++i) { | ||
Jani Honkonen
|
r2131 | if (lines.size() % 2 && lines.size() > 1) | ||
delete(shades.takeLast()); | ||||
Michal Klocek
|
r291 | delete(lines.takeLast()); | ||
delete(labels.takeLast()); | ||||
delete(axis.takeLast()); | ||||
Michal Klocek
|
r272 | } | ||
Michal Klocek
|
r176 | } | ||
Michal Klocek
|
r1006 | void ChartAxis::updateLayout(QVector<qreal> &layout) | ||
Michal Klocek
|
r176 | { | ||
Michal Klocek
|
r1241 | int diff = m_layoutVector.size() - layout.size(); | ||
Jani Honkonen
|
r2131 | if (diff > 0) | ||
Michal Klocek
|
r1241 | deleteItems(diff); | ||
Jani Honkonen
|
r2131 | else if (diff < 0) | ||
Michal Klocek
|
r1241 | createItems(-diff); | ||
Jani Honkonen
|
r2131 | if (diff < 0) handleAxisUpdated(); | ||
Michal Klocek
|
r1241 | |||
if (m_animation) { | ||||
Jani Honkonen
|
r2131 | switch (presenter()->state()) { | ||
case ChartPresenter::ZoomInState: | ||||
m_animation->setAnimationType(AxisAnimation::ZoomInAnimation); | ||||
m_animation->setAnimationPoint(presenter()->statePoint()); | ||||
break; | ||||
case ChartPresenter::ZoomOutState: | ||||
m_animation->setAnimationType(AxisAnimation::ZoomOutAnimation); | ||||
m_animation->setAnimationPoint(presenter()->statePoint()); | ||||
break; | ||||
case ChartPresenter::ScrollUpState: | ||||
case ChartPresenter::ScrollLeftState: | ||||
m_animation->setAnimationType(AxisAnimation::MoveBackwordAnimation); | ||||
break; | ||||
case ChartPresenter::ScrollDownState: | ||||
case ChartPresenter::ScrollRightState: | ||||
m_animation->setAnimationType(AxisAnimation::MoveForwardAnimation); | ||||
break; | ||||
case ChartPresenter::ShowState: | ||||
m_animation->setAnimationType(AxisAnimation::DefaultAnimation); | ||||
break; | ||||
} | ||||
m_animation->setValues(m_layoutVector, layout); | ||||
presenter()->startAnimation(m_animation); | ||||
} else { | ||||
sauimone
|
r745 | setLayout(layout); | ||
Michal Klocek
|
r1241 | updateGeometry(); | ||
Michal Klocek
|
r530 | } | ||
Michal Klocek
|
r85 | } | ||
Michal Klocek
|
r176 | |||
Michal Klocek
|
r1729 | void ChartAxis::setArrowOpacity(qreal opacity) | ||
Michal Klocek
|
r184 | { | ||
Michal Klocek
|
r1729 | m_arrow->setOpacity(opacity); | ||
Michal Klocek
|
r184 | } | ||
Michal Klocek
|
r1729 | qreal ChartAxis::arrowOpacity() const | ||
Michal Klocek
|
r184 | { | ||
Michal Klocek
|
r1729 | return m_arrow->opacity(); | ||
} | ||||
void ChartAxis::setArrowVisibility(bool visible) | ||||
{ | ||||
m_arrow->setOpacity(visible); | ||||
Michal Klocek
|
r184 | } | ||
Michal Klocek
|
r1006 | void ChartAxis::setGridOpacity(qreal opacity) | ||
Michal Klocek
|
r176 | { | ||
Jani Honkonen
|
r784 | m_grid->setOpacity(opacity); | ||
Michal Klocek
|
r176 | } | ||
Michal Klocek
|
r85 | |||
Michal Klocek
|
r1006 | qreal ChartAxis::gridOpacity() const | ||
Michal Klocek
|
r176 | { | ||
Jani Honkonen
|
r784 | return m_grid->opacity(); | ||
Michal Klocek
|
r176 | } | ||
Michal Klocek
|
r85 | |||
Michal Klocek
|
r1729 | void ChartAxis::setGridVisibility(bool visible) | ||
{ | ||||
m_grid->setOpacity(visible); | ||||
} | ||||
Michal Klocek
|
r1006 | void ChartAxis::setLabelsOpacity(qreal opacity) | ||
Michal Klocek
|
r176 | { | ||
Jani Honkonen
|
r784 | m_labels->setOpacity(opacity); | ||
Michal Klocek
|
r176 | } | ||
Michal Klocek
|
r85 | |||
Michal Klocek
|
r1006 | qreal ChartAxis::labelsOpacity() const | ||
Michal Klocek
|
r176 | { | ||
Jani Honkonen
|
r784 | return m_labels->opacity(); | ||
Michal Klocek
|
r176 | } | ||
Michal Klocek
|
r85 | |||
Michal Klocek
|
r1729 | void ChartAxis::setLabelsVisibility(bool visible) | ||
{ | ||||
m_labels->setOpacity(visible); | ||||
} | ||||
Michal Klocek
|
r1006 | void ChartAxis::setShadesOpacity(qreal opacity) | ||
Michal Klocek
|
r176 | { | ||
Jani Honkonen
|
r784 | m_shades->setOpacity(opacity); | ||
Michal Klocek
|
r176 | } | ||
Michal Klocek
|
r85 | |||
Michal Klocek
|
r1006 | qreal ChartAxis::shadesOpacity() const | ||
Michal Klocek
|
r176 | { | ||
Jani Honkonen
|
r784 | return m_shades->opacity(); | ||
Michal Klocek
|
r176 | } | ||
Michal Klocek
|
r67 | |||
Michal Klocek
|
r1729 | void ChartAxis::setShadesVisibility(bool visible) | ||
{ | ||||
m_shades->setVisible(visible); | ||||
} | ||||
Michal Klocek
|
r1006 | void ChartAxis::setLabelsAngle(int angle) | ||
Michal Klocek
|
r176 | { | ||
Jani Honkonen
|
r2131 | foreach (QGraphicsItem *item, m_labels->childItems()) | ||
item->setRotation(angle); | ||||
Michal Klocek
|
r176 | |||
Jani Honkonen
|
r2131 | m_labelsAngle = angle; | ||
Michal Klocek
|
r67 | } | ||
Michal Klocek
|
r1006 | void ChartAxis::setLabelsPen(const QPen &pen) | ||
Michal Klocek
|
r140 | { | ||
Jani Honkonen
|
r2131 | foreach (QGraphicsItem *item , m_labels->childItems()) | ||
static_cast<QGraphicsSimpleTextItem *>(item)->setPen(pen); | ||||
Michal Klocek
|
r140 | } | ||
Michal Klocek
|
r1006 | void ChartAxis::setLabelsBrush(const QBrush &brush) | ||
Michal Klocek
|
r140 | { | ||
Jani Honkonen
|
r2131 | foreach (QGraphicsItem *item , m_labels->childItems()) | ||
static_cast<QGraphicsSimpleTextItem *>(item)->setBrush(brush); | ||||
Michal Klocek
|
r140 | } | ||
Michal Klocek
|
r1006 | void ChartAxis::setLabelsFont(const QFont &font) | ||
Michal Klocek
|
r140 | { | ||
Jani Honkonen
|
r2131 | foreach (QGraphicsItem *item , m_labels->childItems()) | ||
static_cast<QGraphicsSimpleTextItem *>(item)->setFont(font); | ||||
if (m_font != font) { | ||||
Michal Klocek
|
r1965 | m_font = font; | ||
Jani Honkonen
|
r2131 | foreach (QGraphicsItem *item , m_labels->childItems()) | ||
static_cast<QGraphicsSimpleTextItem *>(item)->setFont(font); | ||||
Michal Klocek
|
r1965 | QGraphicsLayoutItem::updateGeometry(); | ||
presenter()->layout()->invalidate(); | ||||
} | ||||
Michal Klocek
|
r140 | } | ||
Michal Klocek
|
r1006 | void ChartAxis::setShadesBrush(const QBrush &brush) | ||
Michal Klocek
|
r140 | { | ||
Jani Honkonen
|
r2131 | foreach (QGraphicsItem *item , m_shades->childItems()) | ||
static_cast<QGraphicsRectItem *>(item)->setBrush(brush); | ||||
Michal Klocek
|
r140 | } | ||
Michal Klocek
|
r1006 | void ChartAxis::setShadesPen(const QPen &pen) | ||
Michal Klocek
|
r140 | { | ||
Jani Honkonen
|
r2131 | foreach (QGraphicsItem *item , m_shades->childItems()) | ||
static_cast<QGraphicsRectItem *>(item)->setPen(pen); | ||||
Michal Klocek
|
r176 | } | ||
Michal Klocek
|
r1729 | void ChartAxis::setArrowPen(const QPen &pen) | ||
Michal Klocek
|
r184 | { | ||
Jani Honkonen
|
r2131 | foreach (QGraphicsItem *item , m_arrow->childItems()) | ||
static_cast<QGraphicsLineItem *>(item)->setPen(pen); | ||||
Michal Klocek
|
r184 | } | ||
Michal Klocek
|
r1006 | void ChartAxis::setGridPen(const QPen &pen) | ||
Michal Klocek
|
r176 | { | ||
Jani Honkonen
|
r2131 | foreach (QGraphicsItem *item , m_grid->childItems()) | ||
static_cast<QGraphicsLineItem *>(item)->setPen(pen); | ||||
Michal Klocek
|
r2105 | } | ||
void ChartAxis::setLabelPadding(int padding) | ||||
{ | ||||
Jani Honkonen
|
r2131 | m_labelPadding = padding; | ||
Michal Klocek
|
r176 | } | ||
Michal Klocek
|
r1006 | bool ChartAxis::isEmpty() | ||
Michal Klocek
|
r502 | { | ||
Michal Klocek
|
r2105 | return !m_axisRect.isValid() || m_gridRect.isEmpty() || qFuzzyIsNull(m_min - m_max); | ||
Michal Klocek
|
r291 | } | ||
Michal Klocek
|
r140 | |||
Michal Klocek
|
r1698 | void ChartAxis::handleDomainUpdated() | ||
Michal Klocek
|
r497 | { | ||
Jani Honkonen
|
r2131 | Domain *domain = qobject_cast<Domain *>(sender()); | ||
Michal Klocek
|
r1698 | qreal min(0); | ||
qreal max(0); | ||||
Jani Honkonen
|
r2131 | if (m_chartAxis->orientation() == Qt::Horizontal) { | ||
Michal Klocek
|
r1698 | min = domain->minX(); | ||
max = domain->maxX(); | ||||
Jani Honkonen
|
r2131 | } else if (m_chartAxis->orientation() == Qt::Vertical) { | ||
Michal Klocek
|
r1698 | min = domain->minY(); | ||
max = domain->maxY(); | ||||
} | ||||
Jani Honkonen
|
r2131 | if (!qFuzzyIsNull(m_min - min) || !qFuzzyIsNull(m_max - max)) { | ||
Michal Klocek
|
r1698 | m_min = min; | ||
m_max = max; | ||||
if (!isEmpty()) { | ||||
Michal Klocek
|
r1965 | |||
Michal Klocek
|
r1698 | QVector<qreal> layout = calculateLayout(); | ||
updateLayout(layout); | ||||
Michal Klocek
|
r1965 | QSizeF before = effectiveSizeHint(Qt::MinimumSize); | ||
Jani Honkonen
|
r2131 | QSizeF after = sizeHint(Qt::MinimumSize); | ||
Michal Klocek
|
r1965 | |||
Jani Honkonen
|
r2131 | if (before != after) { | ||
Michal Klocek
|
r1965 | QGraphicsLayoutItem::updateGeometry(); | ||
//we don't want to call invalidate on layout, since it will change minimum size of component, | ||||
//which we would like to avoid since it causes nasty flips when scrolling or zooming, | ||||
//instead recalculate layout and use plotArea for extra space. | ||||
presenter()->layout()->setGeometry(presenter()->layout()->geometry()); | ||||
} | ||||
Michal Klocek
|
r1698 | } | ||
} | ||||
Michal Klocek
|
r497 | } | ||
Michal Klocek
|
r1006 | void ChartAxis::handleAxisUpdated() | ||
Michal Klocek
|
r439 | { | ||
Jani Honkonen
|
r2131 | if (isEmpty()) | ||
return; | ||||
Michal Klocek
|
r1617 | |||
Michal Klocek
|
r1729 | bool visible = m_chartAxis->isVisible(); | ||
Michal Klocek
|
r1617 | |||
Marek Rosa
|
r1844 | setArrowVisibility(visible && m_chartAxis->isLineVisible()); | ||
Michal Klocek
|
r1729 | setGridVisibility(visible && m_chartAxis->isGridLineVisible()); | ||
setLabelsVisibility(visible && m_chartAxis->labelsVisible()); | ||||
setShadesVisibility(visible && m_chartAxis->shadesVisible()); | ||||
Michal Klocek
|
r439 | setLabelsAngle(m_chartAxis->labelsAngle()); | ||
Marek Rosa
|
r1844 | setArrowPen(m_chartAxis->linePen()); | ||
Michal Klocek
|
r439 | setLabelsPen(m_chartAxis->labelsPen()); | ||
setLabelsBrush(m_chartAxis->labelsBrush()); | ||||
setLabelsFont(m_chartAxis->labelsFont()); | ||||
Michal Klocek
|
r535 | setGridPen(m_chartAxis->gridLinePen()); | ||
Michal Klocek
|
r439 | setShadesPen(m_chartAxis->shadesPen()); | ||
setShadesBrush(m_chartAxis->shadesBrush()); | ||||
Michal Klocek
|
r1965 | setTitleText(m_chartAxis->title()); | ||
} | ||||
Michal Klocek
|
r452 | |||
Jani Honkonen
|
r2131 | void ChartAxis::setTitleText(const QString &title) | ||
Michal Klocek
|
r1965 | { | ||
Jani Honkonen
|
r2131 | if (m_titleText != title) { | ||
Michal Klocek
|
r1965 | m_titleText = title; | ||
Michal Klocek
|
r2105 | m_axisRect = QRect(); | ||
Michal Klocek
|
r1965 | QGraphicsLayoutItem::updateGeometry(); | ||
presenter()->layout()->invalidate(); | ||||
} | ||||
Michal Klocek
|
r439 | } | ||
Michal Klocek
|
r1729 | void ChartAxis::hide() | ||
{ | ||||
setArrowVisibility(false); | ||||
setGridVisibility(false); | ||||
setLabelsVisibility(false); | ||||
setShadesVisibility(false); | ||||
} | ||||
Michal Klocek
|
r2105 | void ChartAxis::setGeometry(const QRectF &axis, const QRectF &grid) | ||
Michal Klocek
|
r439 | { | ||
Jani Honkonen
|
r2131 | m_gridRect = grid; | ||
m_axisRect = axis; | ||||
Michal Klocek
|
r1965 | |||
Jani Honkonen
|
r2131 | if (isEmpty()) | ||
return; | ||||
Michal Klocek
|
r1965 | |||
Jani Honkonen
|
r2131 | if (!m_titleText.isNull()) { | ||
QFontMetrics fn(m_title->font()); | ||||
Michal Klocek
|
r1965 | |||
Jani Honkonen
|
r2131 | int size(0); | ||
Michal Klocek
|
r1965 | |||
Jani Honkonen
|
r2131 | if (orientation() == Qt::Horizontal) | ||
Michal Klocek
|
r2105 | size = grid.width(); | ||
Jani Honkonen
|
r2131 | else if (orientation() == Qt::Vertical) | ||
Michal Klocek
|
r2105 | size = grid.height(); | ||
Michal Klocek
|
r1965 | |||
Jani Honkonen
|
r2131 | if (fn.boundingRect(m_titleText).width() > size) { | ||
QString string = m_titleText + "..."; | ||||
while (fn.boundingRect(string).width() > size && string.length() > 3) | ||||
Michal Klocek
|
r1965 | string.remove(string.length() - 4, 1); | ||
Jani Honkonen
|
r2131 | m_title->setText(string); | ||
} else { | ||||
Michal Klocek
|
r1965 | m_title->setText(m_titleText); | ||
Jani Honkonen
|
r2131 | } | ||
Michal Klocek
|
r1965 | |||
Jani Honkonen
|
r2131 | QPointF center = grid.center() - m_title->boundingRect().center(); | ||
if (orientation() == Qt::Horizontal) { | ||||
m_title->setPos(center.x(), m_axisRect.bottom() - m_title->boundingRect().height()); | ||||
} else if (orientation() == Qt::Vertical) { | ||||
m_title->setTransformOriginPoint(m_title->boundingRect().center()); | ||||
m_title->setRotation(270); | ||||
m_title->setPos(m_axisRect.left() - m_title->boundingRect().width() / 2 + m_title->boundingRect().height() / 2, center.y()); | ||||
Jani Honkonen
|
r2097 | } | ||
Jani Honkonen
|
r2131 | } | ||
Michal Klocek
|
r1534 | |||
Jani Honkonen
|
r2131 | QVector<qreal> layout = calculateLayout(); | ||
updateLayout(layout); | ||||
Michal Klocek
|
r1534 | |||
Marek Rosa
|
r2093 | } | ||
Michal Klocek
|
r1006 | void ChartAxis::axisSelected() | ||
Michal Klocek
|
r452 | { | ||
Michal Klocek
|
r1965 | //TODO: axis clicked; | ||
Michal Klocek
|
r439 | } | ||
Michal Klocek
|
r1965 | Qt::Orientation ChartAxis::orientation() const | ||
Michal Klocek
|
r1890 | { | ||
Michal Klocek
|
r1965 | return m_chartAxis->orientation(); | ||
} | ||||
Michal Klocek
|
r1890 | |||
Michal Klocek
|
r2105 | Qt::Alignment ChartAxis::alignment() const | ||
Marek Rosa
|
r2093 | { | ||
Michal Klocek
|
r2105 | return m_chartAxis->alignment(); | ||
Marek Rosa
|
r2093 | } | ||
Michal Klocek
|
r1965 | bool ChartAxis::isVisible() | ||
{ | ||||
return m_chartAxis->isVisible(); | ||||
} | ||||
Jani Honkonen
|
r2131 | void ChartAxis::setLabels(const QStringList &labels) | ||
Michal Klocek
|
r2111 | { | ||
Jani Honkonen
|
r2131 | m_labelsList = labels; | ||
Michal Klocek
|
r2111 | } | ||
Jani Honkonen
|
r2131 | QSizeF ChartAxis::sizeHint(Qt::SizeHint which, const QSizeF &constraint) const | ||
Michal Klocek
|
r1965 | { | ||
Michal Klocek
|
r2105 | |||
Michal Klocek
|
r1965 | Q_UNUSED(constraint); | ||
QFontMetrics fn(m_title->font()); | ||||
QSizeF sh; | ||||
Jani Honkonen
|
r2131 | if (m_titleText.isNull()) | ||
return sh; | ||||
Michal Klocek
|
r1965 | |||
Jani Honkonen
|
r2131 | switch (which) { | ||
case Qt::MinimumSize: | ||||
if (orientation() == Qt::Horizontal) | ||||
sh = QSizeF(fn.boundingRect("...").width(), fn.height()); | ||||
else if (orientation() == Qt::Vertical) | ||||
sh = QSizeF(fn.height(), fn.boundingRect("...").width()); | ||||
Michal Klocek
|
r1965 | break; | ||
Jani Honkonen
|
r2131 | case Qt::MaximumSize: | ||
case Qt::PreferredSize: | ||||
if (orientation() == Qt::Horizontal) | ||||
sh = QSizeF(fn.boundingRect(m_chartAxis->title()).width(), fn.height()); | ||||
else if (orientation() == Qt::Vertical) | ||||
sh = QSizeF(fn.height(), fn.boundingRect(m_chartAxis->title()).width()); | ||||
Michal Klocek
|
r1965 | break; | ||
Jani Honkonen
|
r2131 | default: | ||
Michal Klocek
|
r1965 | break; | ||
Michal Klocek
|
r1890 | } | ||
Michal Klocek
|
r1965 | |||
return sh; | ||||
Michal Klocek
|
r1890 | } | ||
Michal Klocek
|
r2111 | QStringList ChartAxis::createValueLabels(int ticks) const | ||
{ | ||||
Jani Honkonen
|
r2131 | Q_ASSERT(m_max > m_min); | ||
Q_ASSERT(ticks > 1); | ||||
Michal Klocek
|
r2111 | |||
QStringList labels; | ||||
Jani Honkonen
|
r2131 | int n = qMax(int(-qFloor(log10((m_max - m_min) / (ticks - 1)))), 0); | ||
Michal Klocek
|
r2111 | n++; | ||
QValueAxis *axis = qobject_cast<QValueAxis *>(m_chartAxis); | ||||
QString format = axis->labelFormat(); | ||||
Jani Honkonen
|
r2131 | if (format.isNull()) { | ||
for (int i = 0; i < ticks; i++) { | ||||
qreal value = m_min + (i * (m_max - m_min) / (ticks - 1)); | ||||
labels << QString::number(value, 'f', n); | ||||
Michal Klocek
|
r2111 | } | ||
Jani Honkonen
|
r2131 | } else { | ||
Michal Klocek
|
r2111 | QByteArray array = format.toAscii(); | ||
Jani Honkonen
|
r2131 | for (int i = 0; i < ticks; i++) { | ||
qreal value = m_min + (i * (m_max - m_min) / (ticks - 1)); | ||||
Michal Klocek
|
r2111 | labels << QString().sprintf(array, value); | ||
} | ||||
} | ||||
return labels; | ||||
} | ||||
Jani Honkonen
|
r2131 | QStringList ChartAxis::createDateTimeLabels(const QString &format, int ticks) const | ||
Michal Klocek
|
r2111 | { | ||
Jani Honkonen
|
r2131 | Q_ASSERT(m_max > m_min); | ||
Q_ASSERT(ticks > 1); | ||||
Michal Klocek
|
r2111 | QStringList labels; | ||
Jani Honkonen
|
r2131 | int n = qMax(int(-floor(log10((m_max - m_min) / (ticks - 1)))), 0); | ||
Michal Klocek
|
r2111 | n++; | ||
Jani Honkonen
|
r2131 | for (int i = 0; i < ticks; i++) { | ||
qreal value = m_min + (i * (m_max - m_min) / (ticks - 1)); | ||||
Michal Klocek
|
r2111 | labels << QDateTime::fromMSecsSinceEpoch(value).toString(format); | ||
} | ||||
return labels; | ||||
} | ||||
Michal Klocek
|
r1006 | #include "moc_chartaxis_p.cpp" | ||
Michal Klocek
|
r67 | |||
QTCOMMERCIALCHART_END_NAMESPACE | ||||