summaryrefslogtreecommitdiffstats
path: root/stats/informationbox.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'stats/informationbox.cpp')
-rw-r--r--stats/informationbox.cpp65
1 files changed, 28 insertions, 37 deletions
diff --git a/stats/informationbox.cpp b/stats/informationbox.cpp
index 189fd1ab1..c768b77b3 100644
--- a/stats/informationbox.cpp
+++ b/stats/informationbox.cpp
@@ -1,9 +1,9 @@
#include "informationbox.h"
#include "statscolors.h"
+#include "statsview.h"
#include "zvalues.h"
#include <QFontMetrics>
-#include <QGraphicsScene>
static const QColor informationBorderColor(Qt::black);
static const QColor informationColor(0xff, 0xff, 0x00, 192); // Note: fourth argument is opacity
@@ -11,74 +11,65 @@ static const int informationBorder = 2;
static const double informationBorderRadius = 4.0; // Radius of rounded corners
static const int distanceFromPointer = 10; // Distance to place box from mouse pointer or scatter item
-InformationBox::InformationBox() : RoundRectItem(informationBorderRadius, nullptr)
+InformationBox::InformationBox(StatsView &v) :
+ ChartRectItem(v, QPen(informationBorderColor, informationBorder),
+ QBrush(informationColor), informationBorderRadius)
{
- setPen(QPen(informationBorderColor, informationBorder));
- setBrush(informationColor);
- setZValue(ZValues::informationBox);
}
void InformationBox::setText(const std::vector<QString> &text, QPointF pos)
{
- width = height = 0.0;
- textItems.clear();
+ QFontMetrics fm(font);
+ double fontHeight = fm.height();
+ std::vector<double> widths;
+ widths.reserve(text.size());
+ width = 0.0;
for (const QString &s: text) {
- if (!s.isEmpty())
- addLine(s);
+ widths.push_back(static_cast<double>(fm.size(Qt::TextSingleLine, s).width()));
+ width = std::max(width, widths.back());
}
width += 4.0 * informationBorder;
- height += 4.0 * informationBorder;
+ height = widths.size() * fontHeight + 4.0 * informationBorder;
+
+ ChartRectItem::resize(QSizeF(width, height));
- // Setting the position will also set the proper size
- setPos(pos);
+ painter->setPen(QPen(darkLabelColor)); // QPainter uses QPen to set text color!
+ double y = 2.0 * informationBorder;
+ for (size_t i = 0; i < widths.size(); ++i) {
+ QRectF rect(2.0 * informationBorder, y, widths[i], fontHeight);
+ painter->drawText(rect, text[i]);
+ y += fontHeight;
+ }
}
void InformationBox::setPos(QPointF pos)
{
- QRectF plotArea = scene()->sceneRect();
+ QSizeF size = sceneSize();
double x = pos.x() + distanceFromPointer;
- if (x + width >= plotArea.right()) {
- if (pos.x() - width >= plotArea.x())
+ if (x + width >= size.width()) {
+ if (pos.x() - width >= 0.0)
x = pos.x() - width;
else
x = pos.x() - width / 2.0;
}
double y = pos.y() + distanceFromPointer;
- if (y + height >= plotArea.bottom()) {
- if (pos.y() - height >= plotArea.y())
+ if (y + height >= size.height()) {
+ if (pos.y() - height >= 0.0)
y = pos.y() - height;
else
y = pos.y() - height / 2.0;
}
- setRect(x, y, width, height);
- double actY = y + 2.0 * informationBorder;
- for (auto &item: textItems) {
- item->setPos(QPointF(x + 2.0 * informationBorder, actY));
- actY += item->boundingRect().height();
- }
-}
-
-void InformationBox::addLine(const QString &s)
-{
- textItems.emplace_back(new QGraphicsSimpleTextItem(s, this));
- QGraphicsSimpleTextItem &item = *textItems.back();
- item.setBrush(QBrush(darkLabelColor));
- item.setPos(QPointF(0.0, height));
- item.setFont(font);
- item.setZValue(ZValues::informationBox);
- QRectF rect = item.boundingRect();
- width = std::max(width, rect.width());
- height += rect.height();
+ ChartRectItem::setPos(QPointF(x, y));
}
// Try to stay within three-thirds of the chart height
int InformationBox::recommendedMaxLines() const
{
QFontMetrics fm(font);
- int maxHeight = static_cast<int>(scene()->sceneRect().height());
+ int maxHeight = static_cast<int>(sceneSize().height());
return maxHeight * 2 / fm.height() / 3;
}