| /**************************************************************************** |
| ** |
| ** Copyright (C) 2016 The Qt Company Ltd. |
| ** Contact: https://www.qt.io/licensing/ |
| ** |
| ** This file is part of the demonstration applications of the Qt Toolkit. |
| ** |
| ** $QT_BEGIN_LICENSE:BSD$ |
| ** Commercial License Usage |
| ** Licensees holding valid commercial Qt licenses may use this file in |
| ** accordance with the commercial license agreement provided with the |
| ** Software or, alternatively, in accordance with the terms contained in |
| ** a written agreement between you and The Qt Company. For licensing terms |
| ** and conditions see https://www.qt.io/terms-conditions. For further |
| ** information use the contact form at https://www.qt.io/contact-us. |
| ** |
| ** BSD License Usage |
| ** Alternatively, you may use this file under the terms of the BSD license |
| ** as follows: |
| ** |
| ** "Redistribution and use in source and binary forms, with or without |
| ** modification, are permitted provided that the following conditions are |
| ** met: |
| ** * Redistributions of source code must retain the above copyright |
| ** notice, this list of conditions and the following disclaimer. |
| ** * Redistributions in binary form must reproduce the above copyright |
| ** notice, this list of conditions and the following disclaimer in |
| ** the documentation and/or other materials provided with the |
| ** distribution. |
| ** * Neither the name of The Qt Company Ltd nor the names of its |
| ** contributors may be used to endorse or promote products derived |
| ** from this software without specific prior written permission. |
| ** |
| ** |
| ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
| ** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
| ** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
| ** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
| ** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
| ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
| ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
| ** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
| ** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
| ** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
| ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." |
| ** |
| ** $QT_END_LICENSE$ |
| ** |
| ****************************************************************************/ |
| |
| #ifndef HOVERPOINTS_H |
| #define HOVERPOINTS_H |
| |
| #include <QtWidgets> |
| |
| QT_FORWARD_DECLARE_CLASS(QBypassWidget) |
| |
| class HoverPoints : public QObject |
| { |
| Q_OBJECT |
| public: |
| enum PointShape { |
| CircleShape, |
| RectangleShape |
| }; |
| |
| enum LockType { |
| LockToLeft = 0x01, |
| LockToRight = 0x02, |
| LockToTop = 0x04, |
| LockToBottom = 0x08 |
| }; |
| |
| enum SortType { |
| NoSort, |
| XSort, |
| YSort |
| }; |
| |
| enum ConnectionType { |
| NoConnection, |
| LineConnection, |
| CurveConnection |
| }; |
| |
| HoverPoints(QWidget *widget, PointShape shape); |
| |
| bool eventFilter(QObject *object, QEvent *event) override; |
| |
| void paintPoints(); |
| |
| inline QRectF boundingRect() const; |
| void setBoundingRect(const QRectF &boundingRect) { m_bounds = boundingRect; } |
| |
| QPolygonF points() const { return m_points; } |
| void setPoints(const QPolygonF &points); |
| |
| QSizeF pointSize() const { return m_pointSize; } |
| void setPointSize(const QSizeF &size) { m_pointSize = size; } |
| |
| SortType sortType() const { return m_sortType; } |
| void setSortType(SortType sortType) { m_sortType = sortType; } |
| |
| ConnectionType connectionType() const { return m_connectionType; } |
| void setConnectionType(ConnectionType connectionType) { m_connectionType = connectionType; } |
| |
| void setConnectionPen(const QPen &pen) { m_connectionPen = pen; } |
| void setShapePen(const QPen &pen) { m_pointPen = pen; } |
| void setShapeBrush(const QBrush &brush) { m_pointBrush = brush; } |
| |
| void setPointLock(int pos, LockType lock) { m_locks[pos] = lock; } |
| |
| void setEditable(bool editable) { m_editable = editable; } |
| bool editable() const { return m_editable; } |
| |
| public slots: |
| void setEnabled(bool enabled); |
| void setDisabled(bool disabled) { setEnabled(!disabled); } |
| |
| signals: |
| void pointsChanged(const QPolygonF &points); |
| |
| public: |
| void firePointChange(); |
| |
| private: |
| inline QRectF pointBoundingRect(int i) const; |
| void movePoint(int i, const QPointF &newPos, bool emitChange = true); |
| |
| QWidget *m_widget; |
| |
| QPolygonF m_points; |
| QRectF m_bounds; |
| PointShape m_shape; |
| SortType m_sortType; |
| ConnectionType m_connectionType; |
| |
| QVector<uint> m_locks; |
| |
| QSizeF m_pointSize; |
| int m_currentIndex; |
| bool m_editable; |
| bool m_enabled; |
| |
| QHash<int, int> m_fingerPointMapping; |
| |
| QPen m_pointPen; |
| QBrush m_pointBrush; |
| QPen m_connectionPen; |
| }; |
| |
| |
| inline QRectF HoverPoints::pointBoundingRect(int i) const |
| { |
| QPointF p = m_points.at(i); |
| qreal w = m_pointSize.width(); |
| qreal h = m_pointSize.height(); |
| qreal x = p.x() - w / 2; |
| qreal y = p.y() - h / 2; |
| return QRectF(x, y, w, h); |
| } |
| |
| inline QRectF HoverPoints::boundingRect() const |
| { |
| if (m_bounds.isEmpty()) |
| return m_widget->rect(); |
| else |
| return m_bounds; |
| } |
| |
| #endif // HOVERPOINTS_H |