2023-05-26 21:57:45 +02:00
|
|
|
#include <cmath>
|
2019-05-10 18:56:19 +02:00
|
|
|
#include <QFont>
|
|
|
|
#include <QFontMetrics>
|
|
|
|
#include <QImage>
|
|
|
|
#include <QPainter>
|
2021-04-18 12:20:07 +02:00
|
|
|
#include <QStaticText>
|
2019-05-10 18:56:19 +02:00
|
|
|
#include "textpointitem.h"
|
|
|
|
|
|
|
|
|
|
|
|
#define FLAGS (Qt::AlignCenter | Qt::TextWordWrap | Qt::TextDontClip)
|
|
|
|
#define MAX_TEXT_WIDTH 8
|
2019-06-30 20:39:22 +02:00
|
|
|
#define MIN_BOX_WIDTH 2
|
2019-05-10 18:56:19 +02:00
|
|
|
|
2019-06-30 20:39:22 +02:00
|
|
|
|
2022-02-15 00:01:48 +01:00
|
|
|
static void expand(QRectF &rect, int width)
|
2019-05-10 18:56:19 +02:00
|
|
|
{
|
2019-06-30 20:39:22 +02:00
|
|
|
rect.adjust(-(width/2 - rect.width()/2), 0, width/2 - rect.width()/2, 0);
|
|
|
|
}
|
2019-05-10 18:56:19 +02:00
|
|
|
|
2019-06-30 20:39:22 +02:00
|
|
|
TextPointItem::TextPointItem(const QPoint &point, const QString *text,
|
|
|
|
const QFont *font, const QImage *img, const QColor *color,
|
2023-05-26 21:28:44 +02:00
|
|
|
const QColor *haloColor, const QColor *bgColor, int padding, double rotate)
|
2021-04-18 12:20:07 +02:00
|
|
|
: TextItem(font ? text : 0), _font(font), _img(img), _color(color),
|
2023-05-26 21:28:44 +02:00
|
|
|
_haloColor(haloColor), _bgColor(bgColor), _rotate(rotate)
|
2019-06-30 20:39:22 +02:00
|
|
|
{
|
2019-07-08 21:19:25 +02:00
|
|
|
if (_text) {
|
|
|
|
QFontMetrics fm(*_font);
|
|
|
|
int limit = _font->pixelSize() * MAX_TEXT_WIDTH;
|
|
|
|
_textRect = fm.boundingRect(QRect(0, 0, limit, 0), FLAGS, *_text);
|
2019-06-08 12:01:35 +02:00
|
|
|
_textRect.adjust(0, 0, 1, 1);
|
2019-06-30 20:39:22 +02:00
|
|
|
|
2019-07-08 21:19:25 +02:00
|
|
|
if (_bgColor && _textRect.width() < _font->pixelSize() * MIN_BOX_WIDTH)
|
|
|
|
expand(_textRect, _font->pixelSize() * MIN_BOX_WIDTH);
|
|
|
|
}
|
2019-06-30 20:39:22 +02:00
|
|
|
|
2022-03-26 17:20:16 +01:00
|
|
|
setPos(point, padding);
|
2019-06-30 20:39:22 +02:00
|
|
|
}
|
|
|
|
|
2022-03-26 17:20:16 +01:00
|
|
|
void TextPointItem::setPos(const QPoint &point, int padding)
|
2019-06-30 20:39:22 +02:00
|
|
|
{
|
|
|
|
QPainterPath shape;
|
2022-02-15 00:01:48 +01:00
|
|
|
QRectF iconRect;
|
2019-06-30 20:39:22 +02:00
|
|
|
|
2021-12-06 22:58:49 +01:00
|
|
|
if (_img && !_img->isNull()) {
|
2022-02-15 00:01:48 +01:00
|
|
|
QSizeF s(_img->size() / _img->devicePixelRatioF());
|
2022-03-26 16:22:51 +01:00
|
|
|
iconRect = QRectF(QPointF(point.x() - s.width() / 2,
|
|
|
|
point.y() - s.height()/2), s);
|
2022-03-26 17:20:16 +01:00
|
|
|
_textRect.moveTopLeft(QPointF(point.x() + s.width()/2 + padding,
|
|
|
|
point.y() - _textRect.height()/2));
|
2019-05-10 18:56:19 +02:00
|
|
|
} else
|
|
|
|
_textRect.moveCenter(point);
|
|
|
|
|
|
|
|
_rect = _textRect | iconRect;
|
2019-06-30 20:39:22 +02:00
|
|
|
shape.addRect(_rect);
|
|
|
|
_shape = shape;
|
2019-05-10 18:56:19 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
void TextPointItem::paint(QPainter *painter) const
|
|
|
|
{
|
2021-12-06 22:58:49 +01:00
|
|
|
if (_img && !_img->isNull()) {
|
2022-02-15 00:01:48 +01:00
|
|
|
QSizeF s(_img->size() / _img->devicePixelRatioF());
|
2023-05-26 21:28:44 +02:00
|
|
|
if (std::isnan(_rotate))
|
|
|
|
painter->drawImage(QPointF(_rect.left(), _rect.center().y()
|
|
|
|
- s.height()/2), *_img);
|
|
|
|
else {
|
|
|
|
painter->save();
|
|
|
|
painter->translate(QPointF(_rect.left() + s.width()/2,
|
|
|
|
_rect.center().y()));
|
|
|
|
painter->rotate(_rotate);
|
|
|
|
painter->drawImage(QPointF(-s.width()/2, -s.height()/2), *_img);
|
|
|
|
painter->restore();
|
|
|
|
}
|
2021-04-18 18:10:23 +02:00
|
|
|
}
|
2019-05-10 18:56:19 +02:00
|
|
|
|
|
|
|
if (_text) {
|
2019-06-30 20:39:22 +02:00
|
|
|
if (_bgColor) {
|
|
|
|
painter->setPen(*_color);
|
|
|
|
painter->setBrush(*_bgColor);
|
|
|
|
painter->drawRect(_textRect);
|
|
|
|
painter->setBrush(Qt::NoBrush);
|
2019-05-10 18:56:19 +02:00
|
|
|
painter->setFont(*_font);
|
|
|
|
painter->drawText(_textRect, FLAGS, *_text);
|
2021-04-18 12:20:07 +02:00
|
|
|
} else if (_haloColor) {
|
|
|
|
QStaticText st(*_text);
|
|
|
|
st.setTextFormat(Qt::PlainText);
|
|
|
|
st.setTextWidth(_textRect.width());
|
|
|
|
st.setTextOption(QTextOption(Qt::AlignHCenter));
|
|
|
|
st.setPerformanceHint(QStaticText::AggressiveCaching);
|
|
|
|
|
|
|
|
painter->setPen(*_haloColor);
|
|
|
|
painter->setFont(*_font);
|
|
|
|
|
|
|
|
painter->drawStaticText(_textRect.topLeft() + QPointF(-1, -1), st);
|
|
|
|
painter->drawStaticText(_textRect.topLeft() + QPointF(+1, +1), st);
|
|
|
|
painter->drawStaticText(_textRect.topLeft() + QPointF(-1, +1), st);
|
|
|
|
painter->drawStaticText(_textRect.topLeft() + QPointF(+1, -1), st);
|
|
|
|
painter->drawStaticText(_textRect.topLeft() + QPointF(0, -1), st);
|
|
|
|
painter->drawStaticText(_textRect.topLeft() + QPointF(0, +1), st);
|
|
|
|
painter->drawStaticText(_textRect.topLeft() + QPointF(-1, 0), st);
|
|
|
|
painter->drawStaticText(_textRect.topLeft() + QPointF(+1, 0), st);
|
|
|
|
|
|
|
|
painter->setPen(*_color);
|
|
|
|
painter->drawStaticText(_textRect.topLeft(), st);
|
2019-05-10 18:56:19 +02:00
|
|
|
} else {
|
2021-04-18 12:20:07 +02:00
|
|
|
painter->setPen(*_color);
|
|
|
|
painter->setFont(*_font);
|
|
|
|
painter->drawText(_textRect, FLAGS, *_text);
|
2019-05-10 18:56:19 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
//painter->setPen(Qt::red);
|
2023-06-10 08:11:18 +02:00
|
|
|
//painter.setBrush(Qt::NoBrush);
|
2022-02-15 00:01:48 +01:00
|
|
|
//painter->setRenderHint(QPainter::Antialiasing, false);
|
2019-05-10 18:56:19 +02:00
|
|
|
//painter->drawRect(_rect);
|
|
|
|
}
|