src/callout.cpp

Fri, 20 Jan 2023 16:44:08 +0100

author
Michiel Broek <mbroek@mbse.eu>
date
Fri, 20 Jan 2023 16:44:08 +0100
changeset 467
c5f6f3f1b714
parent 370
a730825bc5e4
permissions
-rw-r--r--

Added more buttons to the images tab. Load images from the database and display thumbnails added. Added support for jpeg files. Rename pictures in the database to .png. Added temporary images_list, images_count and images_current variables to the product record.

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