QmlMaterial 0.1.0
Loading...
Searching...
No Matches
path_arc_wave.hpp
1#pragma once
2
3#include <QtQuick/private/qquickpath_p.h>
4
5#include "qml_material/export.hpp"
6
7namespace qml_material
8{
9
10// Wavy circular arc segment. Geometry mirrors material-components-android
11// CircularDrawingDelegate.createWavyPath: anchors every half-wavelength along
12// the base arc, alternating ±amplitude radial offset, connected by cubic
13// Beziers whose control points sit `smoothness * halfWl` along the arc tangent.
14//
15// The path is truncated with de Casteljau so it lands exactly at the
16// requested sweepAngle regardless of phase. API follows PathAngleArc
17// (qquickpath.cpp:2326): inherited x/y are ignored.
18class QML_MATERIAL_API PathArcWave : public QQuickCurve {
19 Q_OBJECT
20 Q_PROPERTY(qreal centerX READ center_x WRITE set_center_x NOTIFY centerXChanged FINAL)
21 Q_PROPERTY(qreal centerY READ center_y WRITE set_center_y NOTIFY centerYChanged FINAL)
22 Q_PROPERTY(qreal radius READ radius WRITE set_radius NOTIFY radiusChanged FINAL)
23 Q_PROPERTY(qreal startAngle READ start_angle WRITE set_start_angle NOTIFY startAngleChanged FINAL)
24 Q_PROPERTY(qreal sweepAngle READ sweep_angle WRITE set_sweep_angle NOTIFY sweepAngleChanged FINAL)
25 Q_PROPERTY(qreal amplitude READ amplitude WRITE set_amplitude NOTIFY amplitudeChanged FINAL)
26 Q_PROPERTY(qreal waveLength READ wave_length WRITE set_wave_length NOTIFY waveLengthChanged FINAL)
27 Q_PROPERTY(qreal phase READ phase WRITE set_phase NOTIFY phaseChanged FINAL)
28 Q_PROPERTY(qreal smoothness READ smoothness WRITE set_smoothness NOTIFY smoothnessChanged FINAL)
29 QML_NAMED_ELEMENT(PathArcWave)
30 QML_ADDED_IN_VERSION(2, 0)
31
32public:
33 explicit PathArcWave(QObject* parent = nullptr);
34 ~PathArcWave() override;
35
36 auto center_x() const noexcept -> qreal;
37 auto center_y() const noexcept -> qreal;
38 auto radius() const noexcept -> qreal;
39 auto start_angle() const noexcept -> qreal;
40 auto sweep_angle() const noexcept -> qreal;
41 auto amplitude() const noexcept -> qreal;
42 auto wave_length() const noexcept -> qreal;
43 auto phase() const noexcept -> qreal;
44 auto smoothness() const noexcept -> qreal;
45
46 void set_center_x(qreal);
47 void set_center_y(qreal);
48 void set_radius(qreal);
49 void set_start_angle(qreal);
50 void set_sweep_angle(qreal);
51 void set_amplitude(qreal);
52 void set_wave_length(qreal);
53 void set_phase(qreal);
54 void set_smoothness(qreal);
55
56 void addToPath(QPainterPath& path, const QQuickPathData& data) override;
57
58Q_SIGNALS:
59 void centerXChanged();
60 void centerYChanged();
61 void radiusChanged();
62 void startAngleChanged();
63 void sweepAngleChanged();
64 void amplitudeChanged();
65 void waveLengthChanged();
66 void phaseChanged();
67 void smoothnessChanged();
68
69private:
70 qreal m_center_x { 0.0 };
71 qreal m_center_y { 0.0 };
72 qreal m_radius { 16.0 };
73 qreal m_start_angle { 0.0 };
74 qreal m_sweep_angle { 360.0 };
75 qreal m_amplitude { 4.0 };
76 qreal m_wave_length { 30.0 };
77 qreal m_phase { 0.0 };
78 qreal m_smoothness { 0.48 };
79};
80
81} // namespace qml_material