From 74f3dbde7a75433409005225082962ba658e5442 2013-05-30 04:46:50 From: Miikka Heikkinen Date: 2013-05-30 04:46:50 Subject: [PATCH] Added HTML support for various text items - HTML tags can now be used in chart titles, legends, and labels - '\n' does no longer cause line break in multi-line text items. HTML tag
can be used for line break now. - Setting pen for axis titles and labels is deprecated - When setting brush for titles and labels, only the color is relevant - Logic for identifying label format specifiers was improved, so adding additional information to labels via label format string is now more viable. Task-number: QTRD-1912 Change-Id: I8fa56df56fd656e2a3e427eff4abf3481435eec7 Reviewed-by: Mika Salmela --- diff --git a/src/axis/barcategoryaxis/chartbarcategoryaxisx.cpp b/src/axis/barcategoryaxis/chartbarcategoryaxisx.cpp index f4f8bc6..49c5af6 100644 --- a/src/axis/barcategoryaxis/chartbarcategoryaxisx.cpp +++ b/src/axis/barcategoryaxis/chartbarcategoryaxisx.cpp @@ -112,7 +112,7 @@ QSizeF ChartBarCategoryAxisX::sizeHint(Qt::SizeHint which, const QSizeF &constra switch (which) { case Qt::MinimumSize: { - QRectF boundingRect = textBoundingRect(axis()->labelsFont(), "...", axis()->labelsAngle()); + QRectF boundingRect = ChartPresenter::textBoundingRect(axis()->labelsFont(), "...", axis()->labelsAngle()); height = boundingRect.height() + labelPadding() + base.height() + 1.0; sh = QSizeF(width, height); break; @@ -120,7 +120,7 @@ QSizeF ChartBarCategoryAxisX::sizeHint(Qt::SizeHint which, const QSizeF &constra case Qt::PreferredSize:{ qreal labelHeight = 0.0; foreach (const QString& s, ticksList) { - QRectF rect = textBoundingRect(axis()->labelsFont(), s, axis()->labelsAngle()); + QRectF rect = ChartPresenter::textBoundingRect(axis()->labelsFont(), s, axis()->labelsAngle()); labelHeight = qMax(rect.height(), labelHeight); } height = labelHeight + labelPadding() + base.height() + 1.0; diff --git a/src/axis/barcategoryaxis/chartbarcategoryaxisy.cpp b/src/axis/barcategoryaxis/chartbarcategoryaxisy.cpp index 6d44546..db60f34 100644 --- a/src/axis/barcategoryaxis/chartbarcategoryaxisy.cpp +++ b/src/axis/barcategoryaxis/chartbarcategoryaxisy.cpp @@ -110,7 +110,7 @@ QSizeF ChartBarCategoryAxisY::sizeHint(Qt::SizeHint which, const QSizeF &constra switch (which) { case Qt::MinimumSize: { - QRectF boundingRect = textBoundingRect(axis()->labelsFont(), "...", axis()->labelsAngle()); + QRectF boundingRect = ChartPresenter::textBoundingRect(axis()->labelsFont(), "...", axis()->labelsAngle()); width = boundingRect.width() + labelPadding() + base.width() + 1.0; if (base.width() > 0.0) width += labelPadding(); @@ -120,7 +120,7 @@ QSizeF ChartBarCategoryAxisY::sizeHint(Qt::SizeHint which, const QSizeF &constra case Qt::PreferredSize:{ qreal labelWidth = 0.0; foreach (const QString& s, ticksList) { - QRectF rect = textBoundingRect(axis()->labelsFont(), s, axis()->labelsAngle()); + QRectF rect = ChartPresenter::textBoundingRect(axis()->labelsFont(), s, axis()->labelsAngle()); labelWidth = qMax(rect.width(), labelWidth); } width = labelWidth + labelPadding() + base.width() + 1.0; diff --git a/src/axis/cartesianchartaxis.cpp b/src/axis/cartesianchartaxis.cpp index 8597820..efc1839 100644 --- a/src/axis/cartesianchartaxis.cpp +++ b/src/axis/cartesianchartaxis.cpp @@ -61,18 +61,16 @@ void CartesianChartAxis::createItems(int count) for (int i = 0; i < count; ++i) { QGraphicsLineItem *arrow = new QGraphicsLineItem(this); QGraphicsLineItem *grid = new QGraphicsLineItem(this); - QGraphicsSimpleTextItem *label = new QGraphicsSimpleTextItem(this); - QGraphicsSimpleTextItem *title = titleItem(); + QGraphicsTextItem *label = new QGraphicsTextItem(this); + QGraphicsTextItem *title = titleItem(); arrow->setPen(axis()->linePen()); grid->setPen(axis()->gridLinePen()); label->setFont(axis()->labelsFont()); - label->setPen(axis()->labelsPen()); - label->setBrush(axis()->labelsBrush()); + label->setDefaultTextColor(axis()->labelsBrush().color()); label->setRotation(axis()->labelsAngle()); title->setFont(axis()->titleFont()); - title->setPen(axis()->titlePen()); - title->setBrush(axis()->titleBrush()); - title->setText(axis()->titleText()); + title->setDefaultTextColor(axis()->titleBrush().color()); + title->setHtml(axis()->titleText()); arrowGroup()->addToGroup(arrow); gridGroup()->addToGroup(grid); labelGroup()->addToGroup(label); diff --git a/src/axis/categoryaxis/chartcategoryaxisx.cpp b/src/axis/categoryaxis/chartcategoryaxisx.cpp index 8c83812..8e06748 100644 --- a/src/axis/categoryaxis/chartcategoryaxisx.cpp +++ b/src/axis/categoryaxis/chartcategoryaxisx.cpp @@ -85,7 +85,7 @@ QSizeF ChartCategoryAxisX::sizeHint(Qt::SizeHint which, const QSizeF &constraint switch (which) { case Qt::MinimumSize: { - QRectF boundingRect = textBoundingRect(axis()->labelsFont(), "...", axis()->labelsAngle()); + QRectF boundingRect = ChartPresenter::textBoundingRect(axis()->labelsFont(), "...", axis()->labelsAngle()); height = boundingRect.height() + labelPadding() + base.height() + 1.0; sh = QSizeF(width, height); break; @@ -93,7 +93,7 @@ QSizeF ChartCategoryAxisX::sizeHint(Qt::SizeHint which, const QSizeF &constraint case Qt::PreferredSize: { qreal labelHeight = 0.0; foreach (const QString& s, ticksList) { - QRectF rect = textBoundingRect(axis()->labelsFont(), s, axis()->labelsAngle()); + QRectF rect = ChartPresenter::textBoundingRect(axis()->labelsFont(), s, axis()->labelsAngle()); labelHeight = qMax(rect.height(), labelHeight); } height = labelHeight + labelPadding() + base.height() + 1.0; diff --git a/src/axis/categoryaxis/chartcategoryaxisy.cpp b/src/axis/categoryaxis/chartcategoryaxisy.cpp index f38400b..2533369 100644 --- a/src/axis/categoryaxis/chartcategoryaxisy.cpp +++ b/src/axis/categoryaxis/chartcategoryaxisy.cpp @@ -85,7 +85,7 @@ QSizeF ChartCategoryAxisY::sizeHint(Qt::SizeHint which, const QSizeF &constraint switch (which) { case Qt::MinimumSize: { - QRectF boundingRect = textBoundingRect(axis()->labelsFont(), "...", axis()->labelsAngle()); + QRectF boundingRect = ChartPresenter::textBoundingRect(axis()->labelsFont(), "...", axis()->labelsAngle()); width = boundingRect.width() + labelPadding() + base.width() + 1.0; sh = QSizeF(width, height); break; @@ -93,7 +93,7 @@ QSizeF ChartCategoryAxisY::sizeHint(Qt::SizeHint which, const QSizeF &constraint case Qt::PreferredSize: { qreal labelWidth = 0.0; foreach (const QString& s, ticksList) { - QRectF rect = textBoundingRect(axis()->labelsFont(), s, axis()->labelsAngle()); + QRectF rect = ChartPresenter::textBoundingRect(axis()->labelsFont(), s, axis()->labelsAngle()); labelWidth = qMax(rect.width(), labelWidth); } width = labelWidth + labelPadding() + base.width() + 1.0; diff --git a/src/axis/chartaxiselement.cpp b/src/axis/chartaxiselement.cpp index f5e019d..1840723 100644 --- a/src/axis/chartaxiselement.cpp +++ b/src/axis/chartaxiselement.cpp @@ -27,14 +27,15 @@ QTCOMMERCIALCHART_BEGIN_NAMESPACE -QGraphicsSimpleTextItem *dummyTextItem = 0; -class StaticDeleter +static const char *labelFormatMatchString = "%[\\-\\+#\\s\\d\\.lhjztL]*([dicuoxfegXFEG])"; +static QRegExp *labelFormatMatcher = 0; +class StaticLabelFormatMatcherDeleter { public: - StaticDeleter() {} - ~StaticDeleter() { delete dummyTextItem; } + StaticLabelFormatMatcherDeleter() {} + ~StaticLabelFormatMatcherDeleter() { delete labelFormatMatcher; } }; -StaticDeleter staticDeleter; +StaticLabelFormatMatcherDeleter staticLabelFormatMatcherDeleter; ChartAxisElement::ChartAxisElement(QAbstractAxis *axis, QGraphicsItem *item, bool intervalAxis) : ChartElement(item), @@ -44,13 +45,11 @@ ChartAxisElement::ChartAxisElement(QAbstractAxis *axis, QGraphicsItem *item, boo m_arrow(new QGraphicsItemGroup(item)), m_shades(new QGraphicsItemGroup(item)), m_labels(new QGraphicsItemGroup(item)), - m_title(new QGraphicsSimpleTextItem(item)), + m_title(new QGraphicsTextItem(item)), m_intervalAxis(intervalAxis) { //initial initialization - if (!dummyTextItem) - dummyTextItem = new QGraphicsSimpleTextItem; m_arrow->setHandlesChildEvents(false); m_arrow->setZValue(ChartPresenter::AxisZValue); m_labels->setZValue(ChartPresenter::AxisZValue); @@ -130,20 +129,19 @@ void ChartAxisElement::handleLabelsAngleChanged(int angle) void ChartAxisElement::handleLabelsPenChanged(const QPen &pen) { - foreach (QGraphicsItem *item, m_labels->childItems()) - static_cast(item)->setPen(pen); + Q_UNUSED(pen) } void ChartAxisElement::handleLabelsBrushChanged(const QBrush &brush) { foreach (QGraphicsItem *item, m_labels->childItems()) - static_cast(item)->setBrush(brush); + static_cast(item)->setDefaultTextColor(brush.color()); } void ChartAxisElement::handleLabelsFontChanged(const QFont &font) { foreach (QGraphicsItem *item, m_labels->childItems()) - static_cast(item)->setFont(font); + static_cast(item)->setFont(font); QGraphicsLayoutItem::updateGeometry(); presenter()->layout()->invalidate(); } @@ -152,17 +150,17 @@ void ChartAxisElement::handleTitleTextChanged(const QString &title) { QGraphicsLayoutItem::updateGeometry(); presenter()->layout()->invalidate(); - m_title->setText(title); + m_title->setHtml(title); } void ChartAxisElement::handleTitlePenChanged(const QPen &pen) { - m_title->setPen(pen); + Q_UNUSED(pen) } void ChartAxisElement::handleTitleBrushChanged(const QBrush &brush) { - m_title->setBrush(brush); + m_title->setDefaultTextColor(brush.color()); } void ChartAxisElement::handleTitleFontChanged(const QFont &font) @@ -194,44 +192,6 @@ void ChartAxisElement::handleVisibleChanged(bool visible) if (presenter()) presenter()->layout()->invalidate(); } -QRectF ChartAxisElement::textBoundingRect(const QFont &font, const QString &text, qreal angle) const -{ - dummyTextItem->setFont(font); - dummyTextItem->setText(text); - QRectF boundingRect = dummyTextItem->boundingRect(); - - // Take rotation into account - if (angle) { - QTransform transform; - transform.rotate(angle); - boundingRect = transform.mapRect(boundingRect); - } - - return boundingRect; -} - -// boundingRect parameter returns the rotated bounding rect of the text -QString ChartAxisElement::truncatedText(const QFont &font, const QString &text, qreal angle, - qreal maxSize, Qt::Orientation constraintOrientation, - QRectF &boundingRect) const -{ - QString truncatedString(text); - boundingRect = textBoundingRect(font, truncatedString, angle); - qreal checkDimension = ((constraintOrientation == Qt::Horizontal) - ? boundingRect.width() : boundingRect.height()); - if (checkDimension > maxSize) { - truncatedString.append("..."); - while (checkDimension > maxSize && truncatedString.length() > 3) { - truncatedString.remove(truncatedString.length() - 4, 1); - boundingRect = textBoundingRect(font, truncatedString, angle); - checkDimension = ((constraintOrientation == Qt::Horizontal) - ? boundingRect.width() : boundingRect.height()); - } - } - - return truncatedString; -} - void ChartAxisElement::handleRangeChanged(qreal min, qreal max) { Q_UNUSED(min); @@ -270,6 +230,32 @@ qreal ChartAxisElement::max() const return m_axis->d_ptr->max(); } +static void appendFormattedLabel(const QString &capStr, const QByteArray &array, + QStringList &labels, qreal value) +{ + if (capStr.isEmpty()) { + labels << QString(); + } else if (capStr.at(0) == QLatin1Char('d') + || capStr.at(0) == QLatin1Char('i') + || capStr.at(0) == QLatin1Char('c')) { + labels << QString().sprintf(array, (qint64)value); + } else if (capStr.at(0) == QLatin1Char('u') + || capStr.at(0) == QLatin1Char('o') + || capStr.at(0) == QLatin1Char('x') + || capStr.at(0) == QLatin1Char('X')) { + labels << QString().sprintf(array, (quint64)value); + } else if (capStr.at(0) == QLatin1Char('f') + || capStr.at(0) == QLatin1Char('F') + || capStr.at(0) == QLatin1Char('e') + || capStr.at(0) == QLatin1Char('E') + || capStr.at(0) == QLatin1Char('g') + || capStr.at(0) == QLatin1Char('G')) { + labels << QString().sprintf(array, value); + } else { + labels << QString(); + } +} + QStringList ChartAxisElement::createValueLabels(qreal min, qreal max, int ticks, const QString &format) { QStringList labels; @@ -287,23 +273,14 @@ QStringList ChartAxisElement::createValueLabels(qreal min, qreal max, int ticks, } } else { QByteArray array = format.toLatin1(); + QString capStr; + if (!labelFormatMatcher) + labelFormatMatcher = new QRegExp(labelFormatMatchString); + if (labelFormatMatcher->indexIn(format, 0) != -1) + capStr = labelFormatMatcher->cap(1); for (int i = 0; i < ticks; i++) { qreal value = min + (i * (max - min) / (ticks - 1)); - if (format.contains("d") - || format.contains("i") - || format.contains("c")) { - labels << QString().sprintf(array, (qint64)value); - } else if (format.contains("u") - || format.contains("o") - || format.contains("x", Qt::CaseInsensitive)) { - labels << QString().sprintf(array, (quint64)value); - } else if (format.contains("f", Qt::CaseInsensitive) - || format.contains("e", Qt::CaseInsensitive) - || format.contains("g", Qt::CaseInsensitive)) { - labels << QString().sprintf(array, value); - } else { - labels << QString(); - } + appendFormattedLabel(capStr, array, labels, value); } } @@ -335,23 +312,14 @@ QStringList ChartAxisElement::createLogValueLabels(qreal min, qreal max, qreal b } } else { QByteArray array = format.toLatin1(); + QString capStr; + if (!labelFormatMatcher) + labelFormatMatcher = new QRegExp(labelFormatMatchString); + if (labelFormatMatcher->indexIn(format, 0) != -1) + capStr = labelFormatMatcher->cap(1); for (int i = firstTick; i < ticks + firstTick; i++) { qreal value = qPow(base, i); - if (format.contains("d") - || format.contains("i") - || format.contains("c")) { - labels << QString().sprintf(array, (qint64)value); - } else if (format.contains("u") - || format.contains("o") - || format.contains("x", Qt::CaseInsensitive)) { - labels << QString().sprintf(array, (quint64)value); - } else if (format.contains("f", Qt::CaseInsensitive) - || format.contains("e", Qt::CaseInsensitive) - || format.contains("g", Qt::CaseInsensitive)) { - labels << QString().sprintf(array, value); - } else { - labels << QString(); - } + appendFormattedLabel(capStr, array, labels, value); } } diff --git a/src/axis/chartaxiselement_p.h b/src/axis/chartaxiselement_p.h index 83e3e4e..46dac33 100644 --- a/src/axis/chartaxiselement_p.h +++ b/src/axis/chartaxiselement_p.h @@ -70,10 +70,6 @@ public: QRectF axisGeometry() const { return m_axisRect; } void setAxisGeometry(const QRectF &axisGeometry) { m_axisRect = axisGeometry; } - QRectF textBoundingRect(const QFont &font, const QString &text, qreal angle = 0.0) const; - QString truncatedText(const QFont &font, const QString &text, qreal angle, qreal maxSize, - Qt::Orientation constraintOrientation, QRectF &boundingRect) const; - void axisSelected(); //this flag indicates that axis is used to show intervals it means labels are in between ticks @@ -102,7 +98,7 @@ protected: QList labelItems() { return m_labels->childItems(); } QList shadeItems() { return m_shades->childItems(); } QList arrowItems() { return m_arrow->childItems(); } - QGraphicsSimpleTextItem *titleItem() const { return m_title.data(); } + QGraphicsTextItem *titleItem() const { return m_title.data(); } QGraphicsItemGroup *gridGroup() { return m_grid.data(); } QGraphicsItemGroup *labelGroup() { return m_labels.data(); } QGraphicsItemGroup *shadeGroup() { return m_shades.data(); } @@ -144,7 +140,7 @@ private: QScopedPointer m_arrow; QScopedPointer m_shades; QScopedPointer m_labels; - QScopedPointer m_title; + QScopedPointer m_title; bool m_intervalAxis; }; diff --git a/src/axis/datetimeaxis/chartdatetimeaxisx.cpp b/src/axis/datetimeaxis/chartdatetimeaxisx.cpp index a746ec9..e99c531 100644 --- a/src/axis/datetimeaxis/chartdatetimeaxisx.cpp +++ b/src/axis/datetimeaxis/chartdatetimeaxisx.cpp @@ -98,7 +98,7 @@ QSizeF ChartDateTimeAxisX::sizeHint(Qt::SizeHint which, const QSizeF &constraint switch (which) { case Qt::MinimumSize: { - QRectF boundingRect = textBoundingRect(axis()->labelsFont(), "...", axis()->labelsAngle()); + QRectF boundingRect = ChartPresenter::textBoundingRect(axis()->labelsFont(), "...", axis()->labelsAngle()); width = boundingRect.width() / 2.0; height = boundingRect.height() + labelPadding() + base.height() + 1.0; sh = QSizeF(width, height); @@ -108,7 +108,7 @@ QSizeF ChartDateTimeAxisX::sizeHint(Qt::SizeHint which, const QSizeF &constraint qreal labelHeight = 0.0; qreal firstWidth = -1.0; foreach (const QString& s, ticksList) { - QRectF rect = textBoundingRect(axis()->labelsFont(), s, axis()->labelsAngle()); + QRectF rect = ChartPresenter::textBoundingRect(axis()->labelsFont(), s, axis()->labelsAngle()); labelHeight = qMax(rect.height(), labelHeight); width = rect.width(); if (firstWidth < 0.0) diff --git a/src/axis/datetimeaxis/chartdatetimeaxisy.cpp b/src/axis/datetimeaxis/chartdatetimeaxisy.cpp index 49a57f2..c407b60 100644 --- a/src/axis/datetimeaxis/chartdatetimeaxisy.cpp +++ b/src/axis/datetimeaxis/chartdatetimeaxisy.cpp @@ -99,7 +99,7 @@ QSizeF ChartDateTimeAxisY::sizeHint(Qt::SizeHint which, const QSizeF &constraint switch (which) { case Qt::MinimumSize: { - QRectF boundingRect = textBoundingRect(axis()->labelsFont(), "...", axis()->labelsAngle()); + QRectF boundingRect = ChartPresenter::textBoundingRect(axis()->labelsFont(), "...", axis()->labelsAngle()); width = boundingRect.width() + labelPadding() + base.width() + 1.0; height = boundingRect.height() / 2.0; sh = QSizeF(width, height); @@ -109,7 +109,7 @@ QSizeF ChartDateTimeAxisY::sizeHint(Qt::SizeHint which, const QSizeF &constraint qreal labelWidth = 0.0; qreal firstHeight = -1.0; foreach (const QString& s, ticksList) { - QRectF rect = textBoundingRect(axis()->labelsFont(), s, axis()->labelsAngle()); + QRectF rect = ChartPresenter::textBoundingRect(axis()->labelsFont(), s, axis()->labelsAngle()); labelWidth = qMax(rect.width(), labelWidth); height = rect.height(); if (firstHeight < 0.0) diff --git a/src/axis/horizontalaxis.cpp b/src/axis/horizontalaxis.cpp index 2a4a4eb..2f00150 100644 --- a/src/axis/horizontalaxis.cpp +++ b/src/axis/horizontalaxis.cpp @@ -20,6 +20,7 @@ #include "horizontalaxis_p.h" #include "qabstractaxis_p.h" +#include "chartpresenter_p.h" #include #include @@ -47,7 +48,7 @@ void HorizontalAxis::updateGeometry() QList labels = labelItems(); QList shades = shadeItems(); QList arrow = arrowItems(); - QGraphicsSimpleTextItem *title = titleItem(); + QGraphicsTextItem *title = titleItem(); Q_ASSERT(labels.size() == labelList.size()); Q_ASSERT(layout.size() == labelList.size()); @@ -70,7 +71,7 @@ void HorizontalAxis::updateGeometry() QRectF titleBoundingRect; QString titleText = axis()->titleText(); if (!titleText.isEmpty() && titleItem()->isVisible()) { - title->setText(truncatedText(axis()->titleFont(), titleText, 0.0, gridRect.width(), Qt::Horizontal, QRectF())); + title->setHtml(ChartPresenter::truncatedText(axis()->titleFont(), titleText, qreal(0.0), gridRect.width(), Qt::Horizontal, QRectF())); titlePad = titlePadding(); titleBoundingRect = title->boundingRect(); @@ -87,7 +88,7 @@ void HorizontalAxis::updateGeometry() //items QGraphicsLineItem *gridItem = static_cast(lines.at(i)); QGraphicsLineItem *tickItem = static_cast(arrow.at(i + 1)); - QGraphicsSimpleTextItem *labelItem = static_cast(labels.at(i)); + QGraphicsTextItem *labelItem = static_cast(labels.at(i)); //grid line gridItem->setLine(layout[i], gridRect.top(), layout[i], gridRect.bottom()); @@ -96,8 +97,8 @@ void HorizontalAxis::updateGeometry() QString text = labelList.at(i); QRectF boundingRect; qreal size = axisRect.bottom() - axisRect.top() - labelPadding() - titleBoundingRect.height() - (titlePad * 2); - labelItem->setText(truncatedText(axis()->labelsFont(), text, axis()->labelsAngle(), - size, Qt::Vertical, boundingRect)); + labelItem->setHtml(ChartPresenter::truncatedText(axis()->labelsFont(), text, axis()->labelsAngle(), + size, Qt::Vertical, boundingRect)); //label transformation origin point const QRectF& rect = labelItem->boundingRect(); @@ -185,13 +186,13 @@ QSizeF HorizontalAxis::sizeHint(Qt::SizeHint which, const QSizeF &constraint) co switch (which) { case Qt::MinimumSize: { - QRectF titleRect = textBoundingRect(axis()->titleFont(), "..."); + QRectF titleRect = ChartPresenter::textBoundingRect(axis()->titleFont(), "..."); sh = QSizeF(titleRect.width(), titleRect.height() + (titlePadding() * 2)); break; } case Qt::MaximumSize: case Qt::PreferredSize: { - QRectF titleRect = textBoundingRect(axis()->titleFont(), axis()->titleText()); + QRectF titleRect = ChartPresenter::textBoundingRect(axis()->titleFont(), axis()->titleText()); sh = QSizeF(titleRect.width(), titleRect.height() + (titlePadding() * 2)); break; } diff --git a/src/axis/logvalueaxis/chartlogvalueaxisx.cpp b/src/axis/logvalueaxis/chartlogvalueaxisx.cpp index d7c6b69..af5747f 100644 --- a/src/axis/logvalueaxis/chartlogvalueaxisx.cpp +++ b/src/axis/logvalueaxis/chartlogvalueaxisx.cpp @@ -104,7 +104,7 @@ QSizeF ChartLogValueAxisX::sizeHint(Qt::SizeHint which, const QSizeF &constraint switch (which) { case Qt::MinimumSize:{ - QRectF boundingRect = textBoundingRect(axis()->labelsFont(), "...", axis()->labelsAngle()); + QRectF boundingRect = ChartPresenter::textBoundingRect(axis()->labelsFont(), "...", axis()->labelsAngle()); width = boundingRect.width() / 2.0; height = boundingRect.height() + labelPadding() + base.height() + 1.0; sh = QSizeF(width, height); @@ -114,7 +114,7 @@ QSizeF ChartLogValueAxisX::sizeHint(Qt::SizeHint which, const QSizeF &constraint qreal labelHeight = 0.0; qreal firstWidth = -1.0; foreach (const QString& s, ticksList) { - QRectF rect = textBoundingRect(axis()->labelsFont(), s, axis()->labelsAngle()); + QRectF rect = ChartPresenter::textBoundingRect(axis()->labelsFont(), s, axis()->labelsAngle()); labelHeight = qMax(rect.height(), labelHeight); width = rect.width(); if (firstWidth < 0.0) diff --git a/src/axis/logvalueaxis/chartlogvalueaxisy.cpp b/src/axis/logvalueaxis/chartlogvalueaxisy.cpp index 38a68ff..81c641f 100644 --- a/src/axis/logvalueaxis/chartlogvalueaxisy.cpp +++ b/src/axis/logvalueaxis/chartlogvalueaxisy.cpp @@ -104,7 +104,7 @@ QSizeF ChartLogValueAxisY::sizeHint(Qt::SizeHint which, const QSizeF &constraint switch (which) { case Qt::MinimumSize: { - QRectF boundingRect = textBoundingRect(axis()->labelsFont(), "...", axis()->labelsAngle()); + QRectF boundingRect = ChartPresenter::textBoundingRect(axis()->labelsFont(), "...", axis()->labelsAngle()); width = boundingRect.width() + labelPadding() + base.width() + 1.0; height = boundingRect.height() / 2.0; sh = QSizeF(width, height); @@ -114,7 +114,7 @@ QSizeF ChartLogValueAxisY::sizeHint(Qt::SizeHint which, const QSizeF &constraint qreal labelWidth = 0.0; qreal firstHeight = -1.0; foreach (const QString& s, ticksList) { - QRectF rect = textBoundingRect(axis()->labelsFont(), s, axis()->labelsAngle()); + QRectF rect = ChartPresenter::textBoundingRect(axis()->labelsFont(), s, axis()->labelsAngle()); labelWidth = qMax(rect.width(), labelWidth); height = rect.height(); if (firstHeight < 0.0) diff --git a/src/axis/polarchartaxisangular.cpp b/src/axis/polarchartaxisangular.cpp index a7f6994..23aeede 100644 --- a/src/axis/polarchartaxisangular.cpp +++ b/src/axis/polarchartaxisangular.cpp @@ -51,7 +51,7 @@ void PolarChartAxisAngular::updateGeometry() QList gridItemList = gridItems(); QList labelItemList = labelItems(); QList shadeItemList = shadeItems(); - QGraphicsSimpleTextItem *title = titleItem(); + QGraphicsTextItem *title = titleItem(); QGraphicsEllipseItem *axisLine = static_cast(arrowItemList.at(0)); axisLine->setRect(axisGeometry()); @@ -73,7 +73,7 @@ void PolarChartAxisAngular::updateGeometry() QGraphicsLineItem *gridLineItem = static_cast(gridItemList.at(i)); QGraphicsLineItem *tickItem = static_cast(arrowItemList.at(i + 1)); - QGraphicsSimpleTextItem *labelItem = static_cast(labelItemList.at(i)); + QGraphicsTextItem *labelItem = static_cast(labelItemList.at(i)); QGraphicsPathItem *shadeItem = 0; if (i == 0) shadeItem = static_cast(shadeItemList.at(0)); @@ -118,11 +118,11 @@ void PolarChartAxisAngular::updateGeometry() // Angular axis label if (axis()->labelsVisible() && labelVisible) { - labelItem->setText(labelList.at(i)); + labelItem->setHtml(labelList.at(i)); const QRectF &rect = labelItem->boundingRect(); QPointF labelCenter = rect.center(); labelItem->setTransformOriginPoint(labelCenter.x(), labelCenter.y()); - QRectF boundingRect = textBoundingRect(axis()->labelsFont(), labelList.at(i), axis()->labelsAngle()); + QRectF boundingRect = ChartPresenter::textBoundingRect(axis()->labelsFont(), labelList.at(i), axis()->labelsAngle()); boundingRect.moveCenter(labelCenter); QPointF positionDiff(rect.topLeft() - boundingRect.topLeft()); @@ -219,7 +219,7 @@ void PolarChartAxisAngular::updateGeometry() // Title, centered above the chart QString titleText = axis()->titleText(); if (!titleText.isEmpty() && axis()->isTitleVisible()) { - title->setText(truncatedText(axis()->titleFont(), titleText, 0.0, axisGeometry().width(), Qt::Horizontal, QRectF())); + title->setHtml(ChartPresenter::truncatedText(axis()->titleFont(), titleText, qreal(0.0), axisGeometry().width(), Qt::Horizontal, QRectF())); QRectF titleBoundingRect = title->boundingRect(); QPointF titleCenter = center - titleBoundingRect.center(); @@ -245,18 +245,16 @@ void PolarChartAxisAngular::createItems(int count) for (int i = 0; i < count; ++i) { QGraphicsLineItem *arrow = new QGraphicsLineItem(presenter()->rootItem()); QGraphicsLineItem *grid = new QGraphicsLineItem(presenter()->rootItem()); - QGraphicsSimpleTextItem *label = new QGraphicsSimpleTextItem(presenter()->rootItem()); - QGraphicsSimpleTextItem *title = titleItem(); + QGraphicsTextItem *label = new QGraphicsTextItem(presenter()->rootItem()); + QGraphicsTextItem *title = titleItem(); arrow->setPen(axis()->linePen()); grid->setPen(axis()->gridLinePen()); label->setFont(axis()->labelsFont()); - label->setPen(axis()->labelsPen()); - label->setBrush(axis()->labelsBrush()); + label->setDefaultTextColor(axis()->labelsBrush().color()); label->setRotation(axis()->labelsAngle()); title->setFont(axis()->titleFont()); - title->setPen(axis()->titlePen()); - title->setBrush(axis()->titleBrush()); - title->setText(axis()->titleText()); + title->setDefaultTextColor(axis()->titleBrush().color()); + title->setHtml(axis()->titleText()); arrowGroup()->addToGroup(arrow); gridGroup()->addToGroup(grid); labelGroup()->addToGroup(label); @@ -355,7 +353,7 @@ qreal PolarChartAxisAngular::preferredAxisRadius(const QSizeF &maxSize) continue; } - QRectF boundingRect = textBoundingRect(axis()->labelsFont(), labelList.at(i), axis()->labelsAngle()); + QRectF boundingRect = ChartPresenter::textBoundingRect(axis()->labelsFont(), labelList.at(i), axis()->labelsAngle()); QPointF labelPoint = QLineF::fromPolar(radius + tickWidth(), 90.0 - labelCoordinate).p2(); boundingRect = moveLabelToPosition(labelCoordinate, labelPoint, boundingRect); @@ -370,7 +368,7 @@ qreal PolarChartAxisAngular::preferredAxisRadius(const QSizeF &maxSize) } if (!axis()->titleText().isEmpty() && axis()->isTitleVisible()) { - QRectF titleRect = textBoundingRect(axis()->titleFont(), axis()->titleText()); + QRectF titleRect = ChartPresenter::textBoundingRect(axis()->titleFont(), axis()->titleText()); radius -= titlePadding() + (titleRect.height() / 2.0); if (radius < 1.0) // safeguard diff --git a/src/axis/polarchartaxisradial.cpp b/src/axis/polarchartaxisradial.cpp index 8b818af..0a38e06 100644 --- a/src/axis/polarchartaxisradial.cpp +++ b/src/axis/polarchartaxisradial.cpp @@ -48,7 +48,7 @@ void PolarChartAxisRadial::updateGeometry() QList gridItemList = gridItems(); QList labelItemList = labelItems(); QList shadeItemList = shadeItems(); - QGraphicsSimpleTextItem* title = titleItem(); + QGraphicsTextItem* title = titleItem(); qreal radius = axisGeometry().height() / 2.0; QLineF line(center, center + QPointF(0, -radius)); @@ -66,7 +66,7 @@ void PolarChartAxisRadial::updateGeometry() QGraphicsEllipseItem *gridItem = static_cast(gridItemList.at(i)); QGraphicsLineItem *tickItem = static_cast(arrowItemList.at(i + 1)); - QGraphicsSimpleTextItem *labelItem = static_cast(labelItemList.at(i)); + QGraphicsTextItem *labelItem = static_cast(labelItemList.at(i)); QGraphicsPathItem *shadeItem = 0; if (i == 0) shadeItem = static_cast(shadeItemList.at(0)); @@ -106,11 +106,11 @@ void PolarChartAxisRadial::updateGeometry() // Radial axis label if (axis()->labelsVisible() && labelVisible) { - labelItem->setText(labelList.at(i)); + labelItem->setHtml(labelList.at(i)); QRectF labelRect = labelItem->boundingRect(); QPointF labelCenter = labelRect.center(); labelItem->setTransformOriginPoint(labelCenter.x(), labelCenter.y()); - QRectF boundingRect = textBoundingRect(axis()->labelsFont(), labelList.at(i), axis()->labelsAngle()); + QRectF boundingRect = ChartPresenter::textBoundingRect(axis()->labelsFont(), labelList.at(i), axis()->labelsAngle()); boundingRect.moveCenter(labelCenter); QPointF positionDiff(labelRect.topLeft() - boundingRect.topLeft()); QPointF labelPoint = center; @@ -203,7 +203,7 @@ void PolarChartAxisRadial::updateGeometry() // Title, along the 0 axis QString titleText = axis()->titleText(); if (!titleText.isEmpty() && axis()->isTitleVisible()) { - title->setText(truncatedText(axis()->titleFont(), titleText, 0.0, radius, Qt::Horizontal, QRectF())); + title->setHtml(ChartPresenter::truncatedText(axis()->titleFont(), titleText, qreal(0.0), radius, Qt::Horizontal, QRectF())); QRectF titleBoundingRect = title->boundingRect(); QPointF titleCenter = titleBoundingRect.center(); @@ -234,18 +234,16 @@ void PolarChartAxisRadial::createItems(int count) for (int i = 0; i < count; ++i) { QGraphicsLineItem *arrow = new QGraphicsLineItem(presenter()->rootItem()); QGraphicsEllipseItem *grid = new QGraphicsEllipseItem(presenter()->rootItem()); - QGraphicsSimpleTextItem *label = new QGraphicsSimpleTextItem(presenter()->rootItem()); - QGraphicsSimpleTextItem *title = titleItem(); + QGraphicsTextItem *label = new QGraphicsTextItem(presenter()->rootItem()); + QGraphicsTextItem *title = titleItem(); arrow->setPen(axis()->linePen()); grid->setPen(axis()->gridLinePen()); label->setFont(axis()->labelsFont()); - label->setPen(axis()->labelsPen()); - label->setBrush(axis()->labelsBrush()); + label->setDefaultTextColor(axis()->labelsBrush().color()); label->setRotation(axis()->labelsAngle()); title->setFont(axis()->titleFont()); - title->setPen(axis()->titlePen()); - title->setBrush(axis()->titleBrush()); - title->setText(axis()->titleText()); + title->setDefaultTextColor(axis()->titleBrush().color()); + title->setHtml(axis()->titleText()); arrowGroup()->addToGroup(arrow); gridGroup()->addToGroup(grid); labelGroup()->addToGroup(label); diff --git a/src/axis/qabstractaxis.cpp b/src/axis/qabstractaxis.cpp index 1d55314..f214f55 100644 --- a/src/axis/qabstractaxis.cpp +++ b/src/axis/qabstractaxis.cpp @@ -92,12 +92,13 @@ QTCOMMERCIALCHART_BEGIN_NAMESPACE /*! \property QAbstractAxis::labelsPen + \deprecated The pen of the labels. */ /*! \property QAbstractAxis::labelsBrush - The brush of the labels. + The brush of the labels. Only the color of the brush is relevant. */ /*! @@ -210,21 +211,22 @@ QTCOMMERCIALCHART_BEGIN_NAMESPACE /*! \property QAbstractAxis::titleText - The title of the axis. Empty by default. + The title of the axis. Empty by default. Axis titles support html formatting. */ /*! \qmlproperty String AbstractAxis::titleText - The title of the axis. Empty by default. + The title of the axis. Empty by default. Axis titles support html formatting. */ /*! \property QAbstractAxis::titlePen + \deprecated The pen of the title text. */ /*! \property QAbstractAxis::titleBrush - The brush of the title text. + The brush of the title text. Only the color of the brush is relevant. */ /*! @@ -297,6 +299,7 @@ QTCOMMERCIALCHART_BEGIN_NAMESPACE /*! \fn void QAbstractAxis::labelsPenChanged(const QPen& pen) + \deprecated The pen of the axis labels has changed to \a pen. */ @@ -366,6 +369,7 @@ QTCOMMERCIALCHART_BEGIN_NAMESPACE /*! \fn void QAbstractAxis::titlePenChanged(const QPen& pen) + \deprecated The pen of the axis shades has changed to \a pen. */ @@ -544,9 +548,6 @@ bool QAbstractAxis::labelsVisible() const return d_ptr->m_labelsVisible; } -/*! - Sets \a pen used to draw labels. -*/ void QAbstractAxis::setLabelsPen(const QPen &pen) { if (d_ptr->m_labelsPen != pen) { @@ -555,9 +556,6 @@ void QAbstractAxis::setLabelsPen(const QPen &pen) } } -/*! - Returns the pen used to labels. -*/ QPen QAbstractAxis::labelsPen() const { if (d_ptr->m_labelsPen == QChartPrivate::defaultPen()) @@ -651,9 +649,6 @@ bool QAbstractAxis::isTitleVisible() const return d_ptr->m_titleVisible; } -/*! - Sets \a pen used to draw title. -*/ void QAbstractAxis::setTitlePen(const QPen &pen) { if (d_ptr->m_titlePen != pen) { @@ -662,9 +657,6 @@ void QAbstractAxis::setTitlePen(const QPen &pen) } } -/*! - Returns the pen used to title. -*/ QPen QAbstractAxis::titlePen() const { if (d_ptr->m_titlePen == QChartPrivate::defaultPen()) diff --git a/src/axis/valueaxis/chartvalueaxisx.cpp b/src/axis/valueaxis/chartvalueaxisx.cpp index 167adf7..2324699 100644 --- a/src/axis/valueaxis/chartvalueaxisx.cpp +++ b/src/axis/valueaxis/chartvalueaxisx.cpp @@ -96,7 +96,7 @@ QSizeF ChartValueAxisX::sizeHint(Qt::SizeHint which, const QSizeF &constraint) c switch (which) { case Qt::MinimumSize: { - QRectF boundingRect = textBoundingRect(axis()->labelsFont(), "...", axis()->labelsAngle()); + QRectF boundingRect = ChartPresenter::textBoundingRect(axis()->labelsFont(), "...", axis()->labelsAngle()); width = boundingRect.width() / 2.0; height = boundingRect.height() + labelPadding() + base.height() + 1.0; sh = QSizeF(width, height); @@ -106,7 +106,7 @@ QSizeF ChartValueAxisX::sizeHint(Qt::SizeHint which, const QSizeF &constraint) c qreal labelHeight = 0.0; qreal firstWidth = -1.0; foreach (const QString& s, ticksList) { - QRectF rect = textBoundingRect(axis()->labelsFont(), s, axis()->labelsAngle()); + QRectF rect = ChartPresenter::textBoundingRect(axis()->labelsFont(), s, axis()->labelsAngle()); labelHeight = qMax(rect.height(), labelHeight); width = rect.width(); if (firstWidth < 0.0) diff --git a/src/axis/valueaxis/chartvalueaxisy.cpp b/src/axis/valueaxis/chartvalueaxisy.cpp index 8d82b78..fbd5a04 100644 --- a/src/axis/valueaxis/chartvalueaxisy.cpp +++ b/src/axis/valueaxis/chartvalueaxisy.cpp @@ -96,7 +96,7 @@ QSizeF ChartValueAxisY::sizeHint(Qt::SizeHint which, const QSizeF &constraint) c switch (which) { case Qt::MinimumSize: { - QRectF boundingRect = textBoundingRect(axis()->labelsFont(), "...", axis()->labelsAngle()); + QRectF boundingRect = ChartPresenter::textBoundingRect(axis()->labelsFont(), "...", axis()->labelsAngle()); width = boundingRect.width() + labelPadding() + base.width() + 1.0; height = boundingRect.height() / 2.0; sh = QSizeF(width, height); @@ -106,7 +106,7 @@ QSizeF ChartValueAxisY::sizeHint(Qt::SizeHint which, const QSizeF &constraint) c qreal labelWidth = 0.0; qreal firstHeight = -1.0; foreach (const QString& s, ticksList) { - QRectF rect = textBoundingRect(axis()->labelsFont(), s, axis()->labelsAngle()); + QRectF rect = ChartPresenter::textBoundingRect(axis()->labelsFont(), s, axis()->labelsAngle()); labelWidth = qMax(rect.width(), labelWidth); height = rect.height(); if (firstHeight < 0.0) diff --git a/src/axis/verticalaxis.cpp b/src/axis/verticalaxis.cpp index dcff8a0..38b2d98 100644 --- a/src/axis/verticalaxis.cpp +++ b/src/axis/verticalaxis.cpp @@ -20,6 +20,7 @@ #include "verticalaxis_p.h" #include "qabstractaxis.h" +#include "chartpresenter_p.h" #include QTCOMMERCIALCHART_BEGIN_NAMESPACE @@ -46,7 +47,7 @@ void VerticalAxis::updateGeometry() QList labels = labelItems(); QList shades = shadeItems(); QList arrow = arrowItems(); - QGraphicsSimpleTextItem *title = titleItem(); + QGraphicsTextItem *title = titleItem(); Q_ASSERT(labels.size() == labelList.size()); Q_ASSERT(layout.size() == labelList.size()); @@ -71,7 +72,7 @@ void VerticalAxis::updateGeometry() QRectF titleBoundingRect; QString titleText = axis()->titleText(); if (!titleText.isEmpty() && titleItem()->isVisible()) { - title->setText(truncatedText(axis()->titleFont(), titleText, 0.0, gridRect.height(), Qt::Horizontal, QRectF())); + title->setHtml(ChartPresenter::truncatedText(axis()->titleFont(), titleText, qreal(0.0), gridRect.height(), Qt::Horizontal, QRectF())); titlePad = titlePadding(); titleBoundingRect = title->boundingRect(); @@ -91,7 +92,7 @@ void VerticalAxis::updateGeometry() //items QGraphicsLineItem *gridItem = static_cast(lines.at(i)); QGraphicsLineItem *tickItem = static_cast(arrow.at(i + 1)); - QGraphicsSimpleTextItem *labelItem = static_cast(labels.at(i)); + QGraphicsTextItem *labelItem = static_cast(labels.at(i)); //grid line gridItem->setLine(gridRect.left(), layout[i], gridRect.right(), layout[i]); @@ -100,7 +101,7 @@ void VerticalAxis::updateGeometry() QString text = labelList.at(i); QRectF boundingRect; qreal size = axisRect.right() - axisRect.left() - labelPadding() - titleBoundingRect.height() - (titlePad * 2); - labelItem->setText(truncatedText(axis()->labelsFont(), text, axis()->labelsAngle(), + labelItem->setHtml(ChartPresenter::truncatedText(axis()->labelsFont(), text, axis()->labelsAngle(), size, Qt::Horizontal, boundingRect)); //label transformation origin point @@ -190,13 +191,13 @@ QSizeF VerticalAxis::sizeHint(Qt::SizeHint which, const QSizeF &constraint) cons switch (which) { case Qt::MinimumSize: { - QRectF titleRect = textBoundingRect(axis()->titleFont(), "..."); + QRectF titleRect = ChartPresenter::textBoundingRect(axis()->titleFont(), "..."); sh = QSizeF(titleRect.height() + (titlePadding() * 2), titleRect.width()); break; } case Qt::MaximumSize: case Qt::PreferredSize: { - QRectF titleRect = textBoundingRect(axis()->titleFont(), axis()->titleText()); + QRectF titleRect = ChartPresenter::textBoundingRect(axis()->titleFont(), axis()->titleText()); sh = QSizeF(titleRect.height() + (titlePadding() * 2), titleRect.width()); break; } diff --git a/src/barchart/abstractbarchartitem.cpp b/src/barchart/abstractbarchartitem.cpp index abc0e50..39b35d0 100644 --- a/src/barchart/abstractbarchartitem.cpp +++ b/src/barchart/abstractbarchartitem.cpp @@ -100,7 +100,7 @@ void AbstractBarChartItem::setLayout(const QVector &layout) for (int i = 0; i < m_bars.count(); i++) { m_bars.at(i)->setRect(layout.at(i)); - QGraphicsSimpleTextItem *label = m_labels.at(i); + QGraphicsTextItem *label = m_labels.at(i); label->setPos(layout.at(i).center() - label->boundingRect().center()); } @@ -135,7 +135,7 @@ void AbstractBarChartItem::handleLayoutChanged() void AbstractBarChartItem::handleLabelsVisibleChanged(bool visible) { - foreach (QGraphicsSimpleTextItem *label, m_labels) + foreach (QGraphicsTextItem *label, m_labels) label->setVisible(visible); update(); } @@ -164,7 +164,7 @@ void AbstractBarChartItem::handleDataStructureChanged() // m_layout.append(QRectF(0, 0, 1, 1)); // Labels - m_labels.append(new QGraphicsSimpleTextItem(this)); + m_labels.append(new QGraphicsTextItem(this)); } } @@ -206,10 +206,10 @@ void AbstractBarChartItem::handleUpdatedBars() bar->setBrush(barSet->m_brush); bar->update(); - QGraphicsSimpleTextItem *label = m_labels.at(itemIndex); - label->setText(QString("%1").arg(barSet->value(category))); + QGraphicsTextItem *label = m_labels.at(itemIndex); + label->setHtml(QString("%1").arg(barSet->value(category))); label->setFont(barSet->m_labelFont); - label->setBrush(barSet->m_labelBrush); + label->setDefaultTextColor(barSet->m_labelBrush.color()); label->update(); itemIndex++; } diff --git a/src/barchart/abstractbarchartitem_p.h b/src/barchart/abstractbarchartitem_p.h index bcedc7d..38b38ca 100644 --- a/src/barchart/abstractbarchartitem_p.h +++ b/src/barchart/abstractbarchartitem_p.h @@ -85,7 +85,7 @@ protected: QAbstractBarSeries *m_series; // Not owned. QList m_bars; - QList m_labels; + QList m_labels; QSizeF m_oldSize; }; diff --git a/src/barchart/horizontal/percent/horizontalpercentbarchartitem.cpp b/src/barchart/horizontal/percent/horizontalpercentbarchartitem.cpp index 12ed06d..3ae0883 100644 --- a/src/barchart/horizontal/percent/horizontalpercentbarchartitem.cpp +++ b/src/barchart/horizontal/percent/horizontalpercentbarchartitem.cpp @@ -108,14 +108,14 @@ void HorizontalPercentBarChartItem::handleUpdatedBars() bar->setBrush(barSet->m_brush); bar->update(); - QGraphicsSimpleTextItem *label = m_labels.at(itemIndex); + QGraphicsTextItem *label = m_labels.at(itemIndex); int p = m_series->d_func()->percentageAt(set, category) * 100; QString vString(QString::number(p)); vString.truncate(3); vString.append("%"); - label->setText(vString); + label->setHtml(vString); label->setFont(barSet->m_labelFont); - label->setBrush(barSet->m_labelBrush); + label->setDefaultTextColor(barSet->m_labelBrush.color()); label->update(); itemIndex++; } diff --git a/src/barchart/vertical/percent/percentbarchartitem.cpp b/src/barchart/vertical/percent/percentbarchartitem.cpp index 9233f16..e302657 100644 --- a/src/barchart/vertical/percent/percentbarchartitem.cpp +++ b/src/barchart/vertical/percent/percentbarchartitem.cpp @@ -110,14 +110,14 @@ void PercentBarChartItem::handleUpdatedBars() bar->setBrush(barSet->m_brush); bar->update(); - QGraphicsSimpleTextItem *label = m_labels.at(itemIndex); + QGraphicsTextItem *label = m_labels.at(itemIndex); int p = m_series->d_func()->percentageAt(set, category) * 100; QString vString(QString::number(p)); vString.truncate(3); vString.append("%"); - label->setText(vString); + label->setHtml(vString); label->setFont(barSet->m_labelFont); - label->setBrush(barSet->m_labelBrush); + label->setDefaultTextColor(barSet->m_labelBrush.color()); label->update(); itemIndex++; } diff --git a/src/chartpresenter.cpp b/src/chartpresenter.cpp index 782df1d..b601beb 100644 --- a/src/chartpresenter.cpp +++ b/src/chartpresenter.cpp @@ -36,6 +36,15 @@ QTCOMMERCIALCHART_BEGIN_NAMESPACE +QGraphicsTextItem *dummyTextItem = 0; +class StaticDummyTextDeleter +{ +public: + StaticDummyTextDeleter() {} + ~StaticDummyTextDeleter() { delete dummyTextItem; } +}; +StaticDummyTextDeleter staticDummyTextDeleter; + ChartPresenter::ChartPresenter(QChart *chart, QChart::ChartType type) : QObject(chart), m_chart(chart), @@ -286,7 +295,7 @@ QFont ChartPresenter::titleFont() const void ChartPresenter::setTitleBrush(const QBrush &brush) { createTitleItem(); - m_title->setBrush(brush); + m_title->setDefaultTextColor(brush.color()); m_layout->invalidate(); } @@ -294,7 +303,7 @@ QBrush ChartPresenter::titleBrush() const { if (!m_title) return QBrush(); - return m_title->brush(); + return QBrush(m_title->defaultTextColor()); } void ChartPresenter::setBackgroundVisible(bool visible) @@ -378,6 +387,58 @@ ChartTitle *ChartPresenter::titleElement() return m_title; } +QRectF ChartPresenter::textBoundingRect(const QFont &font, const QString &text, qreal angle) +{ + if (!dummyTextItem) + dummyTextItem = new QGraphicsTextItem; + + dummyTextItem->setFont(font); + dummyTextItem->setHtml(text); + QRectF boundingRect = dummyTextItem->boundingRect(); + + // Take rotation into account + if (angle) { + QTransform transform; + transform.rotate(angle); + boundingRect = transform.mapRect(boundingRect); + } + + return boundingRect; +} + +// boundingRect parameter returns the rotated bounding rect of the text +QString ChartPresenter::truncatedText(const QFont &font, const QString &text, qreal angle, + qreal maxSize, Qt::Orientation constraintOrientation, + QRectF &boundingRect) +{ + QString truncatedString(text); + boundingRect = textBoundingRect(font, truncatedString, angle); + qreal checkDimension = ((constraintOrientation == Qt::Horizontal) + ? boundingRect.width() : boundingRect.height()); + if (checkDimension > maxSize) { + truncatedString.append("..."); + while (checkDimension > maxSize && truncatedString.length() > 3) { + // Crude truncation logic - simply remove any html tag completely + int removeIndex(-1); + int removeCount(1); + if (truncatedString.at(truncatedString.length() - 4) == QLatin1Char('>')) { + removeIndex = truncatedString.lastIndexOf(QLatin1Char('<')); + if (removeIndex != -1) + removeCount = truncatedString.length() - 3 - removeIndex; + } + if (removeIndex == -1) + removeIndex = truncatedString.length() - 4; + + truncatedString.remove(removeIndex, removeCount); + boundingRect = textBoundingRect(font, truncatedString, angle); + checkDimension = ((constraintOrientation == Qt::Horizontal) + ? boundingRect.width() : boundingRect.height()); + } + } + + return truncatedString; +} + #include "moc_chartpresenter_p.cpp" QTCOMMERCIALCHART_END_NAMESPACE diff --git a/src/chartpresenter_p.h b/src/chartpresenter_p.h index dd36be9..ab13f05 100644 --- a/src/chartpresenter_p.h +++ b/src/chartpresenter_p.h @@ -141,6 +141,9 @@ public: QChart::ChartType chartType() const { return m_chart->chartType(); } QChart *chart() { return m_chart; } + static QRectF textBoundingRect(const QFont &font, const QString &text, qreal angle = 0.0); + static QString truncatedText(const QFont &font, const QString &text, qreal angle, qreal maxSize, + Qt::Orientation constraintOrientation, QRectF &boundingRect); private: void createBackgroundItem(); void createPlotAreaBackgroundItem(); diff --git a/src/charttitle.cpp b/src/charttitle.cpp index 2d7cba9..1b8c91a 100644 --- a/src/charttitle.cpp +++ b/src/charttitle.cpp @@ -19,6 +19,7 @@ ****************************************************************************/ #include "charttitle_p.h" +#include "chartpresenter_p.h" #include #include #include @@ -26,7 +27,7 @@ QTCOMMERCIALCHART_BEGIN_NAMESPACE ChartTitle::ChartTitle(QGraphicsItem *parent) - : QGraphicsSimpleTextItem(parent) + : QGraphicsTextItem(parent) { } @@ -48,19 +49,7 @@ QString ChartTitle::text() const void ChartTitle::setGeometry(const QRectF &rect) { - QFontMetrics fn(font()); - - int width = rect.width(); - - if (fn.boundingRect(m_text).width() > width) { - QString string = m_text + "..."; - while (fn.boundingRect(string).width() > width && string.length() > 3) - string.remove(string.length() - 4, 1); - QGraphicsSimpleTextItem::setText(string); - } else { - QGraphicsSimpleTextItem::setText(m_text); - } - + QGraphicsTextItem::setHtml(ChartPresenter::truncatedText(font(), m_text, qreal(0.0), rect.width(), Qt::Horizontal, QRectF())); setPos(rect.topLeft()); } @@ -68,22 +57,25 @@ void ChartTitle::setGeometry(const QRectF &rect) QSizeF ChartTitle::sizeHint(Qt::SizeHint which, const QSizeF &constraint) const { Q_UNUSED(constraint); - QFontMetrics fn(font()); QSizeF sh; switch (which) { - case Qt::MinimumSize: - sh = QSizeF(fn.boundingRect("...").width(), fn.height()); + case Qt::MinimumSize: { + QRectF titleRect = ChartPresenter::textBoundingRect(font(), "..."); + sh = QSizeF(titleRect.width(), titleRect.height()); break; + } case Qt::PreferredSize: - sh = fn.boundingRect(m_text).size(); - break; - case Qt::MaximumSize: - sh = fn.boundingRect(m_text).size(); + case Qt::MaximumSize: { + QRectF titleRect = ChartPresenter::textBoundingRect(font(), m_text); + sh = QSizeF(titleRect.width(), titleRect.height()); break; - case Qt::MinimumDescent: + } + case Qt::MinimumDescent: { + QFontMetrics fn(font()); sh = QSizeF(0, fn.descent()); break; + } default: break; } diff --git a/src/charttitle_p.h b/src/charttitle_p.h index 4770e5a..6705eeb 100644 --- a/src/charttitle_p.h +++ b/src/charttitle_p.h @@ -31,11 +31,11 @@ #define CHARTTITLE_P_H_ #include "qchartglobal.h" -#include +#include QTCOMMERCIALCHART_BEGIN_NAMESPACE -class ChartTitle : public QGraphicsSimpleTextItem +class ChartTitle : public QGraphicsTextItem { public: ChartTitle(QGraphicsItem *parent = 0); diff --git a/src/layout/polarchartlayout.cpp b/src/layout/polarchartlayout.cpp index 127560a..6a04e57 100644 --- a/src/layout/polarchartlayout.cpp +++ b/src/layout/polarchartlayout.cpp @@ -57,7 +57,7 @@ QRectF PolarChartLayout::calculateAxisGeometry(const QRectF &geometry, const QLi && chartAxis->axis()->isTitleVisible() && !chartAxis->axis()->titleText().isEmpty()) { // If axis has angular title, adjust geometry down by the space title takes - QRectF dummyRect = chartAxis->textBoundingRect(chartAxis->axis()->titleFont(), chartAxis->axis()->titleText()); + QRectF dummyRect = ChartPresenter::textBoundingRect(chartAxis->axis()->titleFont(), chartAxis->axis()->titleText()); titleHeight = (dummyRect.height() / 2.0) + chartAxis->titlePadding(); } } diff --git a/src/legend/legendmarkeritem.cpp b/src/legend/legendmarkeritem.cpp index cf5a054..9586ba1 100644 --- a/src/legend/legendmarkeritem.cpp +++ b/src/legend/legendmarkeritem.cpp @@ -20,13 +20,14 @@ #include #include -#include +#include #include "qlegend.h" #include "qlegend_p.h" #include "qlegendmarker.h" #include "qlegendmarker_p.h" #include "legendmarkeritem_p.h" +#include "chartpresenter_p.h" QTCOMMERCIALCHART_BEGIN_NAMESPACE @@ -35,7 +36,7 @@ LegendMarkerItem::LegendMarkerItem(QLegendMarkerPrivate *marker, QGraphicsObject m_marker(marker), m_markerRect(0,0,10.0,10.0), m_boundingRect(0,0,0,0), - m_textItem(new QGraphicsSimpleTextItem(this)), + m_textItem(new QGraphicsTextItem(this)), m_rectItem(new QGraphicsRectItem(this)), m_margin(4), m_space(4), @@ -99,41 +100,32 @@ QString LegendMarkerItem::label() const void LegendMarkerItem::setLabelBrush(const QBrush &brush) { - m_textItem->setBrush(brush); + m_textItem->setDefaultTextColor(brush.color()); } QBrush LegendMarkerItem::labelBrush() const { - return m_textItem->brush(); + return QBrush(m_textItem->defaultTextColor()); } void LegendMarkerItem::setGeometry(const QRectF &rect) { - QFontMetrics fn (m_font); - int width = rect.width(); - qreal x = m_margin + m_markerRect.width() + m_space + m_margin; - qreal y = qMax(m_markerRect.height()+2*m_margin,fn.height()+2*m_margin); - - if (fn.boundingRect(m_label).width() + x > width) - { - QString string = m_label + "..."; - while(fn.boundingRect(string).width() + x > width && string.length() > 3) - string.remove(string.length() - 4, 1); - m_textItem->setText(string); - } - else - m_textItem->setText(m_label); + qreal x = m_margin + m_markerRect.width() + m_space + m_margin; + QRectF truncatedRect; - const QRectF &textRect = m_textItem->boundingRect(); + m_textItem->setHtml(ChartPresenter::truncatedText(m_font, m_label, qreal(0.0), width - x, Qt::Horizontal, truncatedRect)); + qreal y = qMax(m_markerRect.height() + 2 * m_margin, truncatedRect.height() + 2 * m_margin); + + const QRectF &textRect = m_textItem->boundingRect(); - m_textItem->setPos(x-m_margin,y/2 - textRect.height()/2); + m_textItem->setPos(x - m_margin, y / 2 - textRect.height() / 2); m_rectItem->setRect(m_markerRect); - m_rectItem->setPos(m_margin,y/2 - m_markerRect.height()/2); + m_rectItem->setPos(m_margin, y / 2 - m_markerRect.height() / 2); prepareGeometryChange(); - m_boundingRect = QRectF(0,0,x+textRect.width()+m_margin,y); + m_boundingRect = QRectF(0, 0, x + textRect.width() + m_margin, y); } QRectF LegendMarkerItem::boundingRect() const diff --git a/src/legend/legendmarkeritem_p.h b/src/legend/legendmarkeritem_p.h index cf8f669..2f7340f 100644 --- a/src/legend/legendmarkeritem_p.h +++ b/src/legend/legendmarkeritem_p.h @@ -35,7 +35,7 @@ #include #include #include -#include +#include #include QTCOMMERCIALCHART_BEGIN_NAMESPACE @@ -78,7 +78,7 @@ protected: QLegendMarkerPrivate *m_marker; // Knows QRectF m_markerRect; QRectF m_boundingRect; - QGraphicsSimpleTextItem *m_textItem; + QGraphicsTextItem *m_textItem; QGraphicsRectItem *m_rectItem; qreal m_margin; qreal m_space; diff --git a/src/legend/qlegendmarker_p.h b/src/legend/qlegendmarker_p.h index d46c19c..1c9fdce 100644 --- a/src/legend/qlegendmarker_p.h +++ b/src/legend/qlegendmarker_p.h @@ -34,7 +34,6 @@ #include #include #include -#include #include QTCOMMERCIALCHART_BEGIN_NAMESPACE diff --git a/src/qabstractseries.cpp b/src/qabstractseries.cpp index f422cfb..74181c3 100644 --- a/src/qabstractseries.cpp +++ b/src/qabstractseries.cpp @@ -75,11 +75,11 @@ QTCOMMERCIALCHART_BEGIN_NAMESPACE /*! \property QAbstractSeries::name - \brief name of the series property. The name is shown in legend for QXYSeries. + \brief name of the series property. The name is shown in legend for series and supports html formatting. */ /*! \qmlproperty string AbstractSeries::name - Name of the series. The name is shown in legend for QXYSeries. + Name of the series. The name is shown in legend for series and supports html formatting. */ /*! diff --git a/src/qchart.cpp b/src/qchart.cpp index 4906cf1..03e7e4c 100644 --- a/src/qchart.cpp +++ b/src/qchart.cpp @@ -119,7 +119,7 @@ QTCOMMERCIALCHART_BEGIN_NAMESPACE /*! \property QChart::title - Title is the name (label) of a chart. It is shown as a headline on top of the chart. + Title is the name (label) of a chart. It is shown as a headline on top of the chart. Chart title supports html formatting. */ /*! diff --git a/tests/auto/qchart/tst_qchart.cpp b/tests/auto/qchart/tst_qchart.cpp index 4f78d4e..71f7d0d 100644 --- a/tests/auto/qchart/tst_qchart.cpp +++ b/tests/auto/qchart/tst_qchart.cpp @@ -754,7 +754,7 @@ void tst_QChart::titleBrush() { QFETCH(QBrush, titleBrush); m_chart->setTitleBrush(titleBrush); - QCOMPARE(m_chart->titleBrush(), titleBrush); + QCOMPARE(m_chart->titleBrush().color(), titleBrush.color()); } void tst_QChart::titleFont_data()