annotate demos/shared/hoverpoints.d @ 310:5bcfe9e7db7f lifetime

Committing local changes
author maxter <spambox@d-coding.com>
date Wed, 23 Dec 2009 16:10:46 +0200
parents 4bbd9f3d9add
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
310
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
1 /****************************************************************************
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
2 **
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
4 ** Contact: Qt Software Information (qt-info@nokia.com)
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
5 **
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
6 ** This file is part of the demonstration applications of the Qt Toolkit.
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
7 **
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
8 ** $QT_BEGIN_LICENSE:LGPL$
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
9 ** Commercial Usage
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
10 ** Licensees holding valid Qt Commercial licenses may use this file in
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
11 ** accordance with the Qt Commercial License Agreement provided with the
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
12 ** Software or, alternatively, in accordance with the terms contained in
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
13 ** a written agreement between you and Nokia.
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
14 **
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
15 ** GNU Lesser General Public License Usage
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
16 ** Alternatively, this file may be used under the terms of the GNU Lesser
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
17 ** General Public License version 2.1 as published by the Free Software
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
18 ** Foundation and appearing in the file LICENSE.LGPL included in the
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
19 ** packaging of this file. Please review the following information to
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
20 ** ensure the GNU Lesser General Public License version 2.1 requirements
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
21 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
22 **
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
23 ** In addition, as a special exception, Nokia gives you certain
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
24 ** additional rights. These rights are described in the Nokia Qt LGPL
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
25 ** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
26 ** package.
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
27 **
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
28 ** GNU General Public License Usage
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
29 ** Alternatively, this file may be used under the terms of the GNU
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
30 ** General Public License version 3.0 as published by the Free Software
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
31 ** Foundation and appearing in the file LICENSE.GPL included in the
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
32 ** packaging of this file. Please review the following information to
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
33 ** ensure the GNU General Public License version 3.0 requirements will be
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
34 ** met: http://www.gnu.org/copyleft/gpl.html.
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
35 **
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
36 ** If you are unsure which license is appropriate for your use, please
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
37 ** contact the sales department at qt-sales@nokia.com.
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
38 ** $QT_END_LICENSE$
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
39 **
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
40 ****************************************************************************/
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
41 module hoverpoints;
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
42
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
43 version (QT_OPENGL_SUPPORT)
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
44 import qt.opengl.QGLWidget;
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
45
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
46 version (D_Version2) {}
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
47 else
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
48 import tango.core.Array : sort;
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
49
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
50 import
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
51 qt.gui.QWidget,
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
52 qt.qtd.Array,
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
53 arthurwidgets;
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
54
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
55 final class HoverPoints : QObject
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
56 {
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
57 public:
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
58 enum PointShape {
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
59 CircleShape,
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
60 RectangleShape
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
61 }
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
62
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
63 enum LockType {
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
64 LockToLeft = 0x01,
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
65 LockToRight = 0x02,
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
66 LockToTop = 0x04,
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
67 LockToBottom = 0x08
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
68 }
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
69
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
70 enum SortType {
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
71 NoSort,
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
72 XSort,
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
73 YSort
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
74 }
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
75
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
76 enum ConnectionType {
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
77 NoConnection,
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
78 LineConnection,
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
79 CurveConnection
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
80 }
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
81
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
82 private:
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
83 QWidget m_widget;
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
84
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
85 QPolygonF m_points;
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
86 QRectF m_bounds;
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
87 PointShape m_shape;
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
88 SortType m_sortType;
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
89 ConnectionType m_connectionType;
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
90
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
91 uint[] m_locks;
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
92
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
93 QSizeF m_pointSize;
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
94 int m_currentIndex;
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
95 bool m_editable;
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
96 bool m_enabled;
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
97
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
98 QPen m_pointPen;
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
99 QBrush m_pointBrush;
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
100 QPen m_connectionPen;
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
101
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
102 public:
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
103 mixin Signal!("pointsChanged", QPolygonF /*points*/);
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
104
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
105 this(QWidget widget, PointShape shape)
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
106 {
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
107 super(widget);
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
108
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
109 m_widget = widget;
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
110 widget.installEventFilter(this);
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
111
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
112 m_connectionType = ConnectionType.CurveConnection;
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
113 m_sortType = SortType.NoSort;
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
114 m_shape = shape;
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
115 m_pointPen = new QPen(new QBrush(new QColor(255, 255, 255, 191)), 1);
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
116 m_connectionPen = new QPen(new QBrush(new QColor(255, 255, 255, 127)), 2);
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
117 m_pointBrush = new QBrush(new QColor(191, 191, 191, 127));
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
118 m_pointSize = QSizeF(11, 11);
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
119 m_currentIndex = -1;
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
120 m_editable = true;
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
121 m_enabled = true;
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
122
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
123 pointsChanged.connect(&m_widget.update);
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
124 }
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
125
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
126 void setBoundingRect(QRectF boundingRect) { m_bounds = boundingRect; }
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
127
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
128
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
129 QRectF pointBoundingRect(int i)
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
130 {
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
131 QPointF p = m_points.at(i);
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
132 qreal w = m_pointSize.width();
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
133 qreal h = m_pointSize.height();
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
134 qreal x = p.x() - w / 2;
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
135 qreal y = p.y() - h / 2;
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
136 return new QRectF(x, y, w, h);
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
137 }
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
138
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
139 QRectF boundingRect()
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
140 {
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
141 if (m_bounds.isEmpty())
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
142 return new QRectF(m_widget.rect());
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
143 else
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
144 return m_bounds;
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
145 }
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
146
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
147 QPolygonF points() { return m_points; }
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
148
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
149 QSizeF pointSize() { return m_pointSize; }
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
150 void setPointSize(QSizeF size) { m_pointSize = size; }
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
151
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
152 SortType sortType() { return m_sortType; }
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
153 void setSortType(SortType sortType) { m_sortType = sortType; }
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
154
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
155 ConnectionType connectionType() { return m_connectionType; }
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
156 void setConnectionType(ConnectionType connectionType) { m_connectionType = connectionType; }
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
157
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
158 void setConnectionPen(QPen pen) { m_connectionPen = pen; }
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
159 void setShapePen(QPen pen) { m_pointPen = pen; }
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
160 void setShapeBrush(QBrush brush) { m_pointBrush = brush; }
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
161
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
162 void setPointLock(int pos, LockType lock) { m_locks[pos] = lock; }
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
163
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
164 void setEditable(bool editable) { m_editable = editable; }
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
165 bool editable() { return m_editable; }
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
166
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
167 void setEnabled(bool enabled)
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
168 {
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
169 if (m_enabled != enabled) {
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
170 m_enabled = enabled;
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
171 m_widget.update();
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
172 }
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
173 }
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
174
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
175
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
176 override bool eventFilter(QObject object, QEvent event)
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
177 {
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
178 if ((object == m_widget) && m_enabled) {
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
179 switch (event.type()) {
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
180
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
181 case QEvent.MouseButtonPress:
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
182 {
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
183 QMouseEvent me = cast(QMouseEvent) event;
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
184
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
185 QPointF clickPos = me.pos();
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
186 int index = -1;
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
187 for (int i=0; i<m_points.size(); ++i) {
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
188 auto path = new QPainterPath;
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
189 if (m_shape == PointShape.CircleShape)
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
190 path.addEllipse(pointBoundingRect(i));
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
191 else
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
192 path.addRect(pointBoundingRect(i));
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
193
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
194 if (path.contains(clickPos)) {
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
195 index = i;
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
196 break;
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
197 }
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
198 }
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
199
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
200 if (me.button() == Qt.LeftButton) {
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
201 if (index == -1) {
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
202 if (!m_editable)
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
203 return false;
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
204 int pos = 0;
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
205 // Insert sort for x or y
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
206 if (m_sortType == SortType.XSort) {
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
207 for (int i=0; i<m_points.size(); ++i)
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
208 if (m_points.at(i).x() > clickPos.x()) {
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
209 pos = i;
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
210 break;
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
211 }
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
212 } else if (m_sortType == SortType.YSort) {
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
213 for (int i=0; i<m_points.size(); ++i)
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
214 if (m_points.at(i).y() > clickPos.y()) {
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
215 pos = i;
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
216 break;
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
217 }
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
218 }
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
219
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
220 // TODO: implement QPoligon(F).insert
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
221 auto tmpPoints = m_points.toList;
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
222 tmpPoints.insert(pos, clickPos);
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
223 m_points = new QPolygonF(tmpPoints);
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
224
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
225 m_locks.insert(pos, 0u);
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
226 m_currentIndex = pos;
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
227 firePointChange();
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
228 } else {
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
229 m_currentIndex = index;
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
230 }
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
231 return true;
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
232
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
233 } else if (me.button() == Qt.RightButton) {
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
234 if ((index >= 0) && m_editable) {
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
235 if (m_locks[index] == 0) {
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
236 m_locks.removeAt(index);
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
237 m_points.remove(index);
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
238 }
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
239 firePointChange();
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
240 return true;
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
241 }
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
242 }
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
243
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
244 }
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
245 break;
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
246
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
247 case QEvent.MouseButtonRelease:
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
248 m_currentIndex = -1;
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
249 break;
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
250
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
251 case QEvent.MouseMove:
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
252 if (m_currentIndex >= 0)
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
253 movePoint(m_currentIndex, QPointF((cast(QMouseEvent)event).pos));
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
254 break;
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
255
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
256 case QEvent.Resize:
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
257 {
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
258 QResizeEvent e = cast(QResizeEvent) event;
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
259 if (e.oldSize().width() == 0 || e.oldSize().height() == 0)
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
260 break;
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
261 qreal stretch_x = e.size().width() / cast(qreal)e.oldSize.width;
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
262 qreal stretch_y = e.size().height() / cast(qreal)e.oldSize.height;
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
263 for (int i=0; i<m_points.size(); ++i) {
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
264 QPointF p = m_points.at(i);
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
265 movePoint(i, QPointF(p.x() * stretch_x, p.y() * stretch_y), false);
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
266 }
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
267
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
268 firePointChange();
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
269 break;
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
270 }
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
271
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
272 case QEvent.Paint:
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
273 {
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
274 QWidget that_widget = m_widget;
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
275 m_widget = null;
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
276 QApplication.sendEvent(object, event);
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
277 m_widget = that_widget;
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
278 paintPoints();
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
279 version (QT_OPENGL_SUPPORT)
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
280 {
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
281 ArthurFrame af = cast(ArthurFrame)(that_widget);
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
282 if (af && af.usesOpenGL())
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
283 af.glWidget().swapBuffers();
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
284 }
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
285
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
286 return true;
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
287 }
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
288 default:
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
289 break;
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
290 }
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
291 }
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
292
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
293 return false;
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
294 }
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
295
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
296
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
297 void paintPoints()
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
298 {
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
299 scope p = new QPainter;
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
300 version (QT_OPENGL_SUPPORT)
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
301 {
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
302 ArthurFrame af = cast(ArthurFrame)(m_widget);
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
303 if (af && af.usesOpenGL())
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
304 p.begin(af.glWidget());
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
305 else
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
306 p.begin(m_widget);
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
307 }
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
308 else
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
309 p.begin(m_widget);
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
310
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
311 p.setRenderHint(QPainter.Antialiasing);
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
312
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
313 if (m_connectionPen.style() != Qt.NoPen && m_connectionType != ConnectionType.NoConnection) {
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
314 p.setPen(m_connectionPen);
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
315
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
316 if (m_connectionType == ConnectionType.CurveConnection) {
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
317 auto path = new QPainterPath;
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
318 path.moveTo(m_points.at(0));
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
319 for (int i=1; i<m_points.size(); ++i) {
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
320 QPointF p1 = m_points.at(i-1);
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
321 QPointF p2 = m_points.at(i);
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
322 qreal distance = p2.x() - p1.x();
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
323
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
324 path.cubicTo(p1.x() + distance / 2, p1.y(),
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
325 p1.x() + distance / 2, p2.y(),
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
326 p2.x(), p2.y());
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
327 }
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
328 p.drawPath(path);
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
329 } else {
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
330 p.drawPolyline(m_points);
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
331 }
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
332 }
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
333
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
334 p.setPen(m_pointPen);
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
335 p.setBrush(m_pointBrush);
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
336
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
337 for (int i=0; i<m_points.size(); ++i) {
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
338 QRectF bounds = pointBoundingRect(i);
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
339 if (m_shape == PointShape.CircleShape)
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
340 p.drawEllipse(bounds);
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
341 else
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
342 p.drawRect(bounds);
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
343 }
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
344 }
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
345
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
346
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
347 void setPoints(QPolygonF points)
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
348 {
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
349 delete m_points;
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
350 for (int i=0; i<points.size; ++i)
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
351 m_points.append(bound_point(points.at(i), boundingRect(), 0));
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
352
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
353 delete m_locks;
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
354 if (m_points.size > 0) {
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
355 m_locks.length = m_points.size;
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
356
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
357 m_locks[] = 0;
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
358 }
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
359 }
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
360
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
361 void movePoint(int index, QPointF point, bool emitUpdate = true)
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
362 {
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
363 m_points.replace(index, bound_point(point, boundingRect(), m_locks[index]));
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
364 if (emitUpdate)
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
365 firePointChange();
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
366 }
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
367
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
368 void firePointChange()
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
369 {
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
370 // printf("HoverPoints.firePointChange(), current=%d\n", m_currentIndex);
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
371
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
372 if (m_sortType != SortType.NoSort) {
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
373
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
374 QPointF oldCurrent;
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
375 if (m_currentIndex != -1) {
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
376 oldCurrent = m_points.at(m_currentIndex);
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
377 }
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
378
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
379 if (m_sortType == SortType.XSort)
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
380 {
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
381 auto tmpPoints = m_points.toList;
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
382 sort(tmpPoints, &x_less_than);
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
383 m_points = new QPolygonF(tmpPoints);
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
384 }
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
385 else if (m_sortType == SortType.YSort)
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
386 {
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
387 auto tmpPoints = m_points.toList;
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
388 sort(tmpPoints, &y_less_than);
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
389 m_points = new QPolygonF(tmpPoints);
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
390 }
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
391
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
392 // Compensate for changed order...
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
393 if (m_currentIndex != -1) {
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
394 for (int i=0; i<m_points.size; ++i) {
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
395 if (m_points.at(i) == oldCurrent) {
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
396 m_currentIndex = i;
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
397 break;
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
398 }
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
399 }
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
400 }
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
401
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
402 // printf(" - firePointChange(), current=%d\n", m_currentIndex);
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
403 }
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
404
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
405 // for (int i=0; i<m_points.size(); ++i) {
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
406 // printf(" - point(%2d)=[%.2f, %.2f], lock=%d\n",
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
407 // i, m_points.at(i).x(), m_points.at(i).y(), m_locks.at(i));
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
408 // }
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
409
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
410 pointsChanged.emit(m_points);
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
411 }
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
412 }
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
413
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
414 private QPointF bound_point(QPointF point, QRectF bounds, int lock)
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
415 {
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
416 QPointF p = point;
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
417
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
418 qreal left = bounds.left();
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
419 qreal right = bounds.right();
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
420 qreal top = bounds.top();
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
421 qreal bottom = bounds.bottom();
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
422
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
423 if (p.x() < left || (lock & HoverPoints.LockType.LockToLeft)) p.x = left;
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
424 else if (p.x() > right || (lock & HoverPoints.LockType.LockToRight)) p.x = right;
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
425
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
426 if (p.y() < top || (lock & HoverPoints.LockType.LockToTop)) p.y = top;
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
427 else if (p.y() > bottom || (lock & HoverPoints.LockType.LockToBottom)) p.y = bottom;
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
428
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
429 return p;
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
430 }
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
431
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
432 private bool x_less_than(QPointF p1, QPointF p2)
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
433 {
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
434 return p1.x() < p2.x();
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
435 }
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
436
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
437 private bool y_less_than(QPointF p1, QPointF p2)
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
438 {
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
439 return p1.y() < p2.y();
5bcfe9e7db7f Committing local changes
maxter <spambox@d-coding.com>
parents: 162
diff changeset
440 }