Revision control
++ // Copyright (C) 2016 The Qt Company Ltd.
++ // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause
++
++ #ifndef PATHSTROKE_H
++ #define PATHSTROKE_H
++
++ #include "arthurwidgets.h"
++
++ #include <QtWidgets>
++
++ class PathStrokeRenderer : public ArthurFrame
++ {
++ Q_OBJECT
++ Q_PROPERTY(bool animation READ animation WRITE setAnimation)
++ Q_PROPERTY(qreal penWidth READ realPenWidth WRITE setRealPenWidth)
++ public:
++ enum PathMode { CurveMode, LineMode };
++
++ explicit PathStrokeRenderer(QWidget *parent, bool smallScreen = false);
++
++ void paint(QPainter *) override;
++ void mousePressEvent(QMouseEvent *e) override;
++ void mouseMoveEvent(QMouseEvent *e) override;
++ void mouseReleaseEvent(QMouseEvent *e) override;
++ void timerEvent(QTimerEvent *e) override;
++ bool event(QEvent *e) override;
++
++ QSize sizeHint() const override { return QSize(500, 500); }
++
++ bool animation() const { return m_timer.isActive(); }
++
++ qreal realPenWidth() const { return m_penWidth; }
++ void setRealPenWidth(qreal penWidth) { m_penWidth = penWidth; update(); }
++
++ signals:
++ void clicked();
++
++ public slots:
++ void setPenWidth(int penWidth) { m_penWidth = penWidth / 10.0; update(); }
++ void setAnimation(bool animation);
++
++ void setFlatCap() { m_capStyle = Qt::FlatCap; update(); }
++ void setSquareCap() { m_capStyle = Qt::SquareCap; update(); }
++ void setRoundCap() { m_capStyle = Qt::RoundCap; update(); }
++
++ void setBevelJoin() { m_joinStyle = Qt::BevelJoin; update(); }
++ void setMiterJoin() { m_joinStyle = Qt::MiterJoin; update(); }
++ void setSvgMiterJoin() { m_joinStyle = Qt::SvgMiterJoin; update(); }
++ void setRoundJoin() { m_joinStyle = Qt::RoundJoin; update(); }
++
++ void setCurveMode() { m_pathMode = CurveMode; update(); }
++ void setLineMode() { m_pathMode = LineMode; update(); }
++
++ void setSolidLine() { m_penStyle = Qt::SolidLine; update(); }
++ void setDashLine() { m_penStyle = Qt::DashLine; update(); }
++ void setDotLine() { m_penStyle = Qt::DotLine; update(); }
++ void setDashDotLine() { m_penStyle = Qt::DashDotLine; update(); }
++ void setDashDotDotLine() { m_penStyle = Qt::DashDotDotLine; update(); }
++ void setCustomDashLine() { m_penStyle = Qt::NoPen; update(); }
++
++ private:
++ void initializePoints();
++ void updatePoints();
++
++ QBasicTimer m_timer;
++
++ PathMode m_pathMode;
++
++ bool m_wasAnimated;
++
++ qreal m_penWidth;
++ int m_pointCount;
++ int m_pointSize;
++ int m_activePoint;
++ QList<QPointF> m_points;
++ QList<QPointF> m_vectors;
++
++ Qt::PenJoinStyle m_joinStyle;
++ Qt::PenCapStyle m_capStyle;
++
++ Qt::PenStyle m_penStyle;
++
++ bool m_smallScreen;
++ QPoint m_mousePress;
++ bool m_mouseDrag;
++
++ QHash<int, int> m_fingerPointMapping;
++ };
++
++ class PathStrokeControls : public QWidget
++ {
++ Q_OBJECT
++
++ public:
++ PathStrokeControls(QWidget* parent, PathStrokeRenderer* renderer, bool smallScreen);
++
++ signals:
++ void okPressed();
++ void quitPressed();
++
++ private:
++ PathStrokeRenderer* m_renderer;
++
++ QGroupBox *m_capGroup;
++ QGroupBox *m_joinGroup;
++ QGroupBox *m_styleGroup;
++ QGroupBox *m_pathModeGroup;
++
++ void createCommonControls(QWidget* parent);
++ void layoutForDesktop();
++ void layoutForSmallScreens();
++
++ private slots:
++ void emitQuitSignal();
++ void emitOkSignal();
++
++ };
++
++ class PathStrokeWidget : public QWidget
++ {
++ Q_OBJECT
++
++ public:
++ PathStrokeWidget(bool smallScreen);
++ void setStyle(QStyle *style);
++
++ private:
++ PathStrokeRenderer *m_renderer;
++ PathStrokeControls *m_controls;
++
++ private slots:
++ void showControls();
++ void hideControls();
++ };
++
++ #endif // PATHSTROKE_H