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(
24 qreal startAngle READ start_angle WRITE set_start_angle NOTIFY startAngleChanged FINAL)
25 Q_PROPERTY(
26 qreal sweepAngle READ sweep_angle WRITE set_sweep_angle NOTIFY sweepAngleChanged FINAL)
27 Q_PROPERTY(qreal amplitude READ amplitude WRITE set_amplitude NOTIFY amplitudeChanged FINAL)
28 Q_PROPERTY(
29 qreal waveLength READ wave_length WRITE set_wave_length NOTIFY waveLengthChanged FINAL)
30 Q_PROPERTY(qreal phase READ phase WRITE set_phase NOTIFY phaseChanged FINAL)
31 Q_PROPERTY(qreal smoothness READ smoothness WRITE set_smoothness NOTIFY smoothnessChanged FINAL)
32 QML_NAMED_ELEMENT(PathArcWave)
33 QML_ADDED_IN_VERSION(2, 0)
34
35public:
36 explicit PathArcWave(QObject* parent = nullptr);
37 ~PathArcWave() override;
38
39 auto center_x() const noexcept -> qreal;
40 auto center_y() const noexcept -> qreal;
41 auto radius() const noexcept -> qreal;
42 auto start_angle() const noexcept -> qreal;
43 auto sweep_angle() const noexcept -> qreal;
44 auto amplitude() const noexcept -> qreal;
45 auto wave_length() const noexcept -> qreal;
46 auto phase() const noexcept -> qreal;
47 auto smoothness() const noexcept -> qreal;
48
49 void set_center_x(qreal);
50 void set_center_y(qreal);
51 void set_radius(qreal);
52 void set_start_angle(qreal);
53 void set_sweep_angle(qreal);
54 void set_amplitude(qreal);
55 void set_wave_length(qreal);
56 void set_phase(qreal);
57 void set_smoothness(qreal);
58
59 void addToPath(QPainterPath& path, const QQuickPathData& data) override;
60
61Q_SIGNALS:
62 void centerXChanged();
63 void centerYChanged();
64 void radiusChanged();
65 void startAngleChanged();
66 void sweepAngleChanged();
67 void amplitudeChanged();
68 void waveLengthChanged();
69 void phaseChanged();
70 void smoothnessChanged();
71
72private:
73 qreal m_center_x { 0.0 };
74 qreal m_center_y { 0.0 };
75 qreal m_radius { 16.0 };
76 qreal m_start_angle { 0.0 };
77 qreal m_sweep_angle { 360.0 };
78 qreal m_amplitude { 4.0 };
79 qreal m_wave_length { 30.0 };
80 qreal m_phase { 0.0 };
81 qreal m_smoothness { 0.48 };
82};
83
84} // namespace qml_material