|
@@
-13,10
+13,10
QRectF Callout::boundingRect() const
|
|
13
|
13
|
{
|
|
14
|
14
|
QPointF anchor = mapFromParent(m_anchor);
|
|
15
|
15
|
QRectF rect;
|
|
16
|
|
rect.setLeft(qMin(m_textRect.left(), anchor.x()));
|
|
17
|
|
rect.setRight(qMax(m_textRect.right() + 8, anchor.x()));
|
|
18
|
|
rect.setTop(qMin(m_textRect.top(), anchor.y()));
|
|
19
|
|
rect.setBottom(qMax(m_textRect.bottom() + 8, anchor.y()));
|
|
|
16
|
rect.setLeft(qMin(m_rect.left(), anchor.x()));
|
|
|
17
|
rect.setRight(qMax(m_rect.right(), anchor.x()));
|
|
|
18
|
rect.setTop(qMin(m_rect.top(), anchor.y()));
|
|
|
19
|
rect.setBottom(qMax(m_rect.bottom(), anchor.y()));
|
|
20
|
20
|
return rect;
|
|
21
|
21
|
}
|
|
22
|
22
|
|
|
@@
-25,26
+25,26
void Callout::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, Q
|
|
25
|
25
|
Q_UNUSED(option)
|
|
26
|
26
|
Q_UNUSED(widget)
|
|
27
|
27
|
QPainterPath path;
|
|
28
|
|
path.addRoundedRect(m_textRect, 5, 5);
|
|
|
28
|
path.addRoundedRect(m_rect, 5, 5);
|
|
29
|
29
|
|
|
30
|
30
|
QPointF anchor = mapFromParent(m_anchor);
|
|
31
|
|
if (!m_textRect.contains(anchor)) {
|
|
|
31
|
if (!m_rect.contains(anchor)) {
|
|
32
|
32
|
QPointF point1, point2;
|
|
33
|
33
|
|
|
34
|
34
|
// establish the position of the anchor point in relation to m_textRect
|
|
35
|
|
bool above = anchor.y() <= m_textRect.top();
|
|
36
|
|
bool aboveCenter = anchor.y() > m_textRect.top() && anchor.y() <= m_textRect.center().y();
|
|
37
|
|
bool belowCenter = anchor.y() > m_textRect.center().y() && anchor.y() <= m_textRect.bottom();
|
|
38
|
|
bool below = anchor.y() > m_textRect.bottom();
|
|
|
35
|
bool above = anchor.y() <= m_rect.top();
|
|
|
36
|
bool aboveCenter = anchor.y() > m_rect.top() && anchor.y() <= m_rect.center().y();
|
|
|
37
|
bool belowCenter = anchor.y() > m_rect.center().y() && anchor.y() <= m_rect.bottom();
|
|
|
38
|
bool below = anchor.y() > m_rect.bottom();
|
|
39
|
39
|
|
|
40
|
|
bool onLeft = anchor.x() <= m_textRect.left();
|
|
41
|
|
bool leftOfCenter = anchor.x() > m_textRect.left() && anchor.x() <= m_textRect.center().x();
|
|
42
|
|
bool rightOfCenter = anchor.x() > m_textRect.center().x() && anchor.x() <= m_textRect.right();
|
|
43
|
|
bool onRight = anchor.x() > m_textRect.right();
|
|
|
40
|
bool onLeft = anchor.x() <= m_rect.left();
|
|
|
41
|
bool leftOfCenter = anchor.x() > m_rect.left() && anchor.x() <= m_rect.center().x();
|
|
|
42
|
bool rightOfCenter = anchor.x() > m_rect.center().x() && anchor.x() <= m_rect.right();
|
|
|
43
|
bool onRight = anchor.x() > m_rect.right();
|
|
44
|
44
|
|
|
45
|
45
|
// get the nearest m_textRect corner.
|
|
46
|
|
qreal x = (onRight + rightOfCenter) * m_textRect.width();
|
|
47
|
|
qreal y = (below + belowCenter) * m_textRect.height();
|
|
|
46
|
qreal x = (onRight + rightOfCenter) * m_rect.width();
|
|
|
47
|
qreal y = (below + belowCenter) * m_rect.height();
|
|
48
|
48
|
bool cornerCase = (above && onLeft) || (above && onRight) || (below && onLeft) || (below && onRight);
|
|
49
|
49
|
bool vertical = qAbs(anchor.x() - x) > qAbs(anchor.y() - y);
|
|
50
|
50
|
|
|
@@
-65,12
+65,12
void Callout::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, Q
|
|
65
|
65
|
}
|
|
66
|
66
|
painter->setBrush(QColor(255, 255, 255));
|
|
67
|
67
|
painter->drawPath(path);
|
|
68
|
|
painter->drawText(m_textRect.adjusted(4, 4, 0, 0), m_text);
|
|
|
68
|
painter->drawText(m_textRect, m_text);
|
|
69
|
69
|
}
|
|
70
|
70
|
|
|
71
|
71
|
void Callout::mousePressEvent(QGraphicsSceneMouseEvent *event)
|
|
72
|
72
|
{
|
|
73
|
|
if (m_textRect.contains(event->pos())) {
|
|
|
73
|
if (m_rect.contains(event->pos())) {
|
|
74
|
74
|
m_clickOffset = event->pos();
|
|
75
|
75
|
event->setAccepted(true);
|
|
76
|
76
|
} else {
|
|
@@
-80,7
+80,7
void Callout::mousePressEvent(QGraphicsSceneMouseEvent *event)
|
|
80
|
80
|
|
|
81
|
81
|
void Callout::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
|
|
82
|
82
|
{
|
|
83
|
|
if (m_textRect.contains(event->pos())){
|
|
|
83
|
if (event->buttons() & Qt::LeftButton){
|
|
84
|
84
|
setPos(mapToParent(event->pos() - m_clickOffset));
|
|
85
|
85
|
event->setAccepted(true);
|
|
86
|
86
|
} else {
|
|
@@
-92,8
+92,10
void Callout::setText(const QString &text)
|
|
92
|
92
|
{
|
|
93
|
93
|
m_text = text;
|
|
94
|
94
|
QFontMetrics metrics(m_font);
|
|
|
95
|
m_textRect = metrics.boundingRect(QRect(0, 0, 150, 150), Qt::AlignLeft, m_text);
|
|
|
96
|
m_textRect.translate(5, 5);
|
|
95
|
97
|
prepareGeometryChange();
|
|
96
|
|
m_textRect = metrics.boundingRect(QRect(0, 0, 150, 150), Qt::AlignLeft, m_text).adjusted(0, 0, 4, 4);
|
|
|
98
|
m_rect = m_textRect.adjusted(-5, -5, 5, 5);
|
|
97
|
99
|
}
|
|
98
|
100
|
|
|
99
|
101
|
void Callout::setAnchor(QPointF point)
|