src/callout.cpp

Thu, 18 Aug 2022 20:34:15 +0200

author
Michiel Broek <mbroek@mbse.eu>
date
Thu, 18 Aug 2022 20:34:15 +0200
changeset 401
583148eb6e01
parent 370
a730825bc5e4
permissions
-rw-r--r--

Init est_carb field for new products.

370
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
1 /****************************************************************************
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
2 **
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
3 ** Copyright (C) 2016 The Qt Company Ltd.
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
4 ** Contact: https://www.qt.io/licensing/
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
5 **
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
6 ** This file is part of the Qt Charts module of the Qt Toolkit.
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
7 **
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
8 ** $QT_BEGIN_LICENSE:GPL$
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
9 ** Commercial License Usage
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
10 ** Licensees holding valid commercial Qt licenses may use this file in
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
11 ** accordance with the commercial license agreement provided with the
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
12 ** Software or, alternatively, in accordance with the terms contained in
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
13 ** a written agreement between you and The Qt Company. For licensing terms
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
14 ** and conditions see https://www.qt.io/terms-conditions. For further
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
15 ** information use the contact form at https://www.qt.io/contact-us.
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
16 **
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
17 ** GNU General Public License Usage
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
18 ** Alternatively, this file may be used under the terms of the GNU
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
19 ** General Public License version 3 or (at your option) any later version
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
20 ** approved by the KDE Free Qt Foundation. The licenses are as published by
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
21 ** the Free Software Foundation and appearing in the file LICENSE.GPL3
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
22 ** included in the packaging of this file. Please review the following
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
23 ** information to ensure the GNU General Public License requirements will
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
24 ** be met: https://www.gnu.org/licenses/gpl-3.0.html.
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
25 **
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
26 ** $QT_END_LICENSE$
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
27 **
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
28 ****************************************************************************/
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
29
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
30 #include "callout.h"
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
31 #include <QtGui/QPainter>
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
32 #include <QtGui/QFontMetrics>
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
33 #include <QtWidgets/QGraphicsSceneMouseEvent>
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
34 #include <QtGui/QMouseEvent>
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
35 #include <QtCharts/QChart>
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
36
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
37 Callout::Callout(QChart *chart, QAbstractSeries *series) :
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
38 QGraphicsItem(chart), m_chart(chart), m_series(series)
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
39 {
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
40 }
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
41
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
42
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
43 QRectF Callout::boundingRect() const
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
44 {
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
45 QPointF anchor = mapFromParent(m_chart->mapToPosition(m_anchor, m_series));
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
46 QRectF rect;
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
47 rect.setLeft(qMin(m_rect.left(), anchor.x()));
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
48 rect.setRight(qMax(m_rect.right(), anchor.x()));
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
49 rect.setTop(qMin(m_rect.top(), anchor.y()));
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
50 rect.setBottom(qMax(m_rect.bottom(), anchor.y()));
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
51 return rect;
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
52 }
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
53
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
54
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
55 void Callout::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
56 {
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
57 Q_UNUSED(option)
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
58 Q_UNUSED(widget)
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
59 QPainterPath path;
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
60 painter->setPen(Qt::black);
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
61 path.addRoundedRect(m_rect, 5, 5);
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
62
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
63 QPointF anchor = mapFromParent(m_chart->mapToPosition(m_anchor, m_series));
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
64 if (!m_rect.contains(anchor)) {
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
65 QPointF point1, point2;
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
66
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
67 // establish the position of the anchor point in relation to m_rect
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
68 bool above = anchor.y() <= m_rect.top();
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
69 bool aboveCenter = anchor.y() > m_rect.top() && anchor.y() <= m_rect.center().y();
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
70 bool belowCenter = anchor.y() > m_rect.center().y() && anchor.y() <= m_rect.bottom();
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
71 bool below = anchor.y() > m_rect.bottom();
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
72
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
73 bool onLeft = anchor.x() <= m_rect.left();
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
74 bool leftOfCenter = anchor.x() > m_rect.left() && anchor.x() <= m_rect.center().x();
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
75 bool rightOfCenter = anchor.x() > m_rect.center().x() && anchor.x() <= m_rect.right();
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
76 bool onRight = anchor.x() > m_rect.right();
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
77
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
78 // get the nearest m_rect corner.
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
79 qreal x = (onRight + rightOfCenter) * m_rect.width();
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
80 qreal y = (below + belowCenter) * m_rect.height();
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
81 bool cornerCase = (above && onLeft) || (above && onRight) || (below && onLeft) || (below && onRight);
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
82 bool vertical = qAbs(anchor.x() - x) > qAbs(anchor.y() - y);
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
83
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
84 qreal x1 = x + leftOfCenter * 10 - rightOfCenter * 20 + cornerCase * !vertical * (onLeft * 10 - onRight * 20);
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
85 qreal y1 = y + aboveCenter * 10 - belowCenter * 20 + cornerCase * vertical * (above * 10 - below * 20);;
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
86 point1.setX(x1);
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
87 point1.setY(y1);
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
88
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
89 qreal x2 = x + leftOfCenter * 20 - rightOfCenter * 10 + cornerCase * !vertical * (onLeft * 20 - onRight * 10);;
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
90 qreal y2 = y + aboveCenter * 20 - belowCenter * 10 + cornerCase * vertical * (above * 20 - below * 10);;
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
91 point2.setX(x2);
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
92 point2.setY(y2);
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
93
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
94 path.moveTo(point1);
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
95 path.lineTo(anchor);
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
96 path.lineTo(point2);
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
97 path = path.simplified();
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
98 }
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
99 painter->setBrush(QColor(255, 255, 205));
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
100 painter->drawPath(path);
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
101 painter->drawText(m_textRect, m_text);
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
102 }
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
103
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
104
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
105 void Callout::mousePressEvent(QGraphicsSceneMouseEvent *event)
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
106 {
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
107 event->setAccepted(true);
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
108 }
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
109
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
110
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
111 void Callout::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
112 {
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
113 if (event->buttons() & Qt::LeftButton){
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
114 setPos(mapToParent(event->pos() - event->buttonDownPos(Qt::LeftButton)));
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
115 event->setAccepted(true);
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
116 } else {
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
117 event->setAccepted(false);
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
118 }
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
119 }
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
120
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
121
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
122 void Callout::setSeries(QAbstractSeries *series) { m_series = series; }
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
123
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
124
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
125 void Callout::setText(const QString &text)
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
126 {
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
127 m_text = text;
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
128 QFontMetrics metrics(m_font);
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
129 m_textRect = metrics.boundingRect(QRect(0, 0, 150, 150), Qt::AlignLeft, m_text);
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
130 m_textRect.translate(5, 5);
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
131 prepareGeometryChange();
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
132 m_rect = m_textRect.adjusted(-5, -5, 5, 5);
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
133 }
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
134
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
135
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
136 void Callout::setAnchor(QPointF point)
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
137 {
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
138 m_anchor = point;
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
139 }
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
140
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
141
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
142 void Callout::updateGeometry()
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
143 {
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
144 prepareGeometryChange();
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
145 setPos(m_chart->mapToPosition(m_anchor, m_series) + QPoint(10, -50));
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
146 }
a730825bc5e4 Added callout
Michiel Broek <mbroek@mbse.eu>
parents:
diff changeset
147

mercurial