Pulp 1.88.0
Cross-platform audio plugin framework
Loading...
Searching...
No Matches
waveform_editor_primitives.hpp
Go to the documentation of this file.
1#pragma once
2
5
8
9#include <cstddef>
10#include <cstdint>
11#include <vector>
12
13namespace pulp::view {
14
17 int64_t start = 0;
18 int64_t end = 0;
19
20 [[nodiscard]] int64_t length() const { return end - start; }
21 [[nodiscard]] bool empty() const { return start == end; }
22 [[nodiscard]] WaveformSampleRange normalized() const;
23};
24
27 int64_t total_samples = 0;
28 int64_t visible_start = 0;
29 int64_t visible_length = 0;
30 int64_t min_visible_length = 16;
32
33 void set_total_samples(int64_t samples);
34 void set_bounds(Rect rect);
35 void set_visible_range(int64_t start, int64_t length);
36 void zoom_in(double factor = 2.0);
37 void zoom_out(double factor = 2.0);
39 void scroll(int64_t delta_samples);
40
41 [[nodiscard]] bool empty() const { return total_samples <= 0 || visible_length <= 0; }
42 [[nodiscard]] int64_t visible_end() const;
43 [[nodiscard]] bool sample_visible(int64_t sample) const;
44 [[nodiscard]] bool sample_point_visible(int64_t sample) const;
45 [[nodiscard]] int64_t clamp_sample(int64_t sample) const;
46 [[nodiscard]] double samples_per_pixel() const;
47 [[nodiscard]] double pixels_per_sample() const;
48 [[nodiscard]] float sample_to_x(int64_t sample) const;
49 [[nodiscard]] int64_t x_to_sample(float x) const;
50};
51
54 int64_t sample_start = 0;
55 int64_t sample_end = 0;
56 float x = 0.0f;
57 float width = 0.0f;
58
59 [[nodiscard]] int64_t sample_count() const { return sample_end - sample_start; }
60};
61
65 std::vector<WaveformRenderSpan> spans;
66};
67
69 int max_spans = 0);
70
84
87 int id = -1;
88 int64_t sample = 0;
89 bool enabled = true;
90};
91
94 int64_t total_samples = 0;
95
96 bool has_selection = false;
98
99 bool has_trim = false;
101
102 bool has_loop = false;
104
105 bool has_fade_in = false;
106 int64_t fade_in_end = 0;
107
108 bool has_fade_out = false;
109 int64_t fade_out_start = 0;
110
111 bool has_playhead = false;
112 int64_t playhead = 0;
113
114 std::vector<int64_t> slice_markers;
115
116 void set_total_samples(int64_t samples);
117 void set_selection(int64_t start, int64_t end);
119 void set_trim(int64_t start, int64_t end);
121 void set_loop(int64_t start, int64_t end);
123 void set_fade_in(int64_t end_sample);
125 void set_fade_out(int64_t start_sample);
127 void set_playhead(int64_t sample);
129 void set_slice_markers(std::vector<int64_t> markers);
130
131 template <typename Visitor>
132 void for_each_handle(Visitor&& visitor) const {
133 if (has_selection) {
136 }
137 if (has_trim) {
138 visitor(WaveformHandle{WaveformHandleKind::trim_start, 0, trim.start, true});
139 visitor(WaveformHandle{WaveformHandleKind::trim_end, 0, trim.end, true});
140 }
141 if (has_fade_in) {
143 }
144 if (has_fade_out) {
146 }
147 if (has_loop) {
148 visitor(WaveformHandle{WaveformHandleKind::loop_start, 0, loop.start, true});
149 visitor(WaveformHandle{WaveformHandleKind::loop_end, 0, loop.end, true});
150 }
151 for (std::size_t i = 0; i < slice_markers.size(); ++i) {
153 static_cast<int>(i),
155 true});
156 }
157 if (has_playhead) {
159 }
160 }
161
162 [[nodiscard]] std::vector<WaveformHandle> handles() const;
163};
164
167 int id = -1;
168 int64_t sample = 0;
169 float distance_px = 0.0f;
170
171 [[nodiscard]] bool hit() const { return kind != WaveformHandleKind::none; }
172 explicit operator bool() const { return hit(); }
173};
174
176 const WaveformHandleModel& model,
177 float x,
178 float tolerance_px);
179
185 const WaveformHandleModel& model,
186 float x,
187 const HitMetrics& metrics,
188 float pixels_per_point = 1.0f);
189
196
199 int64_t tolerance_samples = 0;
200 std::vector<int64_t> candidates;
201 bool snap_to_bounds = true;
202};
203
209
210[[nodiscard]] WaveformSnapResult resolve_waveform_snap(int64_t sample,
211 int64_t total_samples,
213
215 int64_t sample = 0;
216 bool visible = false;
217 float x = 0.0f;
218};
219
221 int64_t playhead_sample);
222
231
240
243public:
245 int64_t anchor_sample,
246 WaveformSampleRange initial_selection = {},
247 int64_t initial_playhead_sample = 0);
248
249 [[nodiscard]] WaveformEditorTransactionResult update(int64_t sample) const;
250 [[nodiscard]] WaveformEditorTransactionResult commit(int64_t sample);
252
253 [[nodiscard]] bool active() const { return active_; }
254 [[nodiscard]] WaveformEditorOperationKind operation() const { return operation_; }
255
256private:
257 [[nodiscard]] WaveformEditorTransactionResult result_for_sample(int64_t sample,
258 bool committed,
259 bool cancelled) const;
260
261 bool active_ = false;
263 int64_t anchor_sample_ = 0;
264 WaveformSampleRange initial_selection_{};
265 int64_t initial_playhead_sample_ = 0;
266};
267
276
286
289public:
290 void set_total_samples(int64_t samples);
292 void set_visible_range(int64_t start, int64_t length);
294 void scroll(int64_t delta_samples);
295
296 [[nodiscard]] const WaveformViewport& viewport() const { return viewport_; }
297 [[nodiscard]] const WaveformHandleModel& handles() const { return handles_; }
298
300 [[nodiscard]] const WaveformSnapSettings& snap_settings() const { return snap_settings_; }
301
302 void set_selection(int64_t start, int64_t end);
304 void set_trim(int64_t start, int64_t end);
306 void set_loop(int64_t start, int64_t end);
308 void set_fade_in(int64_t end_sample);
310 void set_fade_out(int64_t start_sample);
312 void set_playhead(int64_t sample);
314 void set_slice_markers(std::vector<int64_t> markers);
315
317 [[nodiscard]] WaveformRenderPlan render_plan(int max_spans = 0) const;
318 [[nodiscard]] WaveformHitResult hit_test(float x, float tolerance_px) const;
319 [[nodiscard]] WaveformHitResult hit_test(float x, const HitMetrics& metrics,
320 float pixels_per_point = 1.0f) const;
321
322 [[nodiscard]] bool begin_selection_edit(int64_t anchor_sample);
323 [[nodiscard]] bool begin_handle_edit(WaveformHandleKind kind, int id = -1);
324 [[nodiscard]] bool begin_handle_edit(const WaveformHitResult& hit);
325 [[nodiscard]] WaveformEditorSurfaceEditResult update_edit(int64_t sample);
326 [[nodiscard]] WaveformEditorSurfaceEditResult commit_edit(int64_t sample);
328
329 [[nodiscard]] bool edit_active() const { return edit_active_; }
330 [[nodiscard]] WaveformHandleKind edit_kind() const { return edit_kind_; }
331 [[nodiscard]] int edit_id() const { return edit_id_; }
332
333private:
334 [[nodiscard]] bool can_edit(WaveformHandleKind kind, int id) const;
335 [[nodiscard]] WaveformEditorSurfaceEditResult edit_result_for_sample(int64_t sample,
336 bool committed,
337 bool cancelled) const;
338 static void apply_edit(WaveformHandleModel& model,
340 int id,
341 int64_t anchor_sample,
342 int64_t sample);
343
344 WaveformViewport viewport_{};
345 WaveformHandleModel handles_{};
346 WaveformSnapSettings snap_settings_{};
347 WaveformHandleModel edit_initial_handles_{};
348 bool edit_active_ = false;
350 int edit_id_ = -1;
351 int64_t edit_anchor_sample_ = 0;
352};
353
354} // namespace pulp::view
View-layer editing surface that composes waveform primitives without owning audio or painting.
Definition waveform_editor_primitives.hpp:288
WaveformEditorSurfaceEditResult cancel_edit()
bool begin_handle_edit(const WaveformHitResult &hit)
void set_snap_settings(WaveformSnapSettings settings)
void set_slice_markers(std::vector< int64_t > markers)
bool edit_active() const
Definition waveform_editor_primitives.hpp:329
void set_loop(int64_t start, int64_t end)
void scroll(int64_t delta_samples)
const WaveformSnapSettings & snap_settings() const
Definition waveform_editor_primitives.hpp:300
bool begin_selection_edit(int64_t anchor_sample)
WaveformHitResult hit_test(float x, const HitMetrics &metrics, float pixels_per_point=1.0f) const
WaveformEditorSurfaceSnapshot snapshot() const
bool begin_handle_edit(WaveformHandleKind kind, int id=-1)
WaveformHandleKind edit_kind() const
Definition waveform_editor_primitives.hpp:330
int edit_id() const
Definition waveform_editor_primitives.hpp:331
void set_total_samples(int64_t samples)
void set_trim(int64_t start, int64_t end)
void set_fade_out(int64_t start_sample)
void set_playhead(int64_t sample)
void set_visible_range(int64_t start, int64_t length)
void set_fade_in(int64_t end_sample)
const WaveformHandleModel & handles() const
Definition waveform_editor_primitives.hpp:297
WaveformEditorSurfaceEditResult commit_edit(int64_t sample)
void set_selection(int64_t start, int64_t end)
WaveformRenderPlan render_plan(int max_spans=0) const
WaveformEditorSurfaceEditResult update_edit(int64_t sample)
const WaveformViewport & viewport() const
Definition waveform_editor_primitives.hpp:296
WaveformHitResult hit_test(float x, float tolerance_px) const
Semantic edit transaction state. Platform input translation stays in widgets/views.
Definition waveform_editor_primitives.hpp:242
WaveformEditorOperationKind operation() const
Definition waveform_editor_primitives.hpp:254
void begin(WaveformEditorOperationKind operation, int64_t anchor_sample, WaveformSampleRange initial_selection={}, int64_t initial_playhead_sample=0)
WaveformEditorTransactionResult cancel()
bool active() const
Definition waveform_editor_primitives.hpp:253
WaveformEditorTransactionResult commit(int64_t sample)
WaveformEditorTransactionResult update(int64_t sample) const
Device-appropriate target sizing shared by pointer-driven hit tests.
Hover-cursor tracking for platform window hosts.
Definition fwd.hpp:27
WaveformHitResult hit_test_waveform_handles(const WaveformViewport &viewport, const WaveformHandleModel &model, float x, float tolerance_px)
WaveformSnapResult resolve_waveform_snap(int64_t sample, int64_t total_samples, const WaveformSnapSettings &settings)
WaveformPlayheadOverlay build_waveform_playhead_overlay(const WaveformViewport &viewport, int64_t playhead_sample)
@ settings
Definition design_shortcuts.hpp:96
@ none
Definition appearance_defects.hpp:53
@ grid
Definition geometry.hpp:348
WaveformHandleKind
Definition waveform_editor_primitives.hpp:71
@ loop_end
Definition waveform_editor_primitives.hpp:80
@ trim_start
Definition waveform_editor_primitives.hpp:75
@ fade_out
Definition waveform_editor_primitives.hpp:78
@ none
Definition waveform_editor_primitives.hpp:72
@ fade_in
Definition waveform_editor_primitives.hpp:77
@ playhead
Definition waveform_editor_primitives.hpp:82
@ selection_start
Definition waveform_editor_primitives.hpp:73
@ slice_marker
Definition waveform_editor_primitives.hpp:81
@ selection_end
Definition waveform_editor_primitives.hpp:74
@ trim_end
Definition waveform_editor_primitives.hpp:76
@ loop_start
Definition waveform_editor_primitives.hpp:79
WaveformEditorOperationKind
Definition waveform_editor_primitives.hpp:223
@ move_playhead
Definition waveform_editor_primitives.hpp:229
@ none
Definition waveform_editor_primitives.hpp:224
@ drag_selection_start
Definition waveform_editor_primitives.hpp:227
@ extend_selection
Definition waveform_editor_primitives.hpp:226
@ create_selection
Definition waveform_editor_primitives.hpp:225
@ drag_selection_end
Definition waveform_editor_primitives.hpp:228
WaveformRenderPlan build_waveform_render_plan(const WaveformViewport &viewport, int max_spans=0)
@ i
Definition input_events.hpp:40
@ x
Definition input_events.hpp:41
WaveformSnapSource
Definition waveform_editor_primitives.hpp:190
@ none
Definition waveform_editor_primitives.hpp:191
@ candidate
Definition waveform_editor_primitives.hpp:193
@ bounds
Definition waveform_editor_primitives.hpp:192
@ end
Definition geometry.hpp:370
@ start
Definition geometry.hpp:370
@ cancelled
Definition gesture.hpp:19
Minimum hit-target sizing for one pointer type.
Definition hit_metrics.hpp:24
Axis-aligned rectangle in continuous (float) coordinates.
Definition geometry.hpp:52
Definition waveform_editor_primitives.hpp:277
bool active
Definition waveform_editor_primitives.hpp:280
bool committed
Definition waveform_editor_primitives.hpp:281
WaveformHandleModel handles
Definition waveform_editor_primitives.hpp:284
WaveformHandleKind kind
Definition waveform_editor_primitives.hpp:278
WaveformSnapResult snap
Definition waveform_editor_primitives.hpp:283
bool cancelled
Definition waveform_editor_primitives.hpp:282
Definition waveform_editor_primitives.hpp:268
WaveformHandleKind edit_kind
Definition waveform_editor_primitives.hpp:273
WaveformPlayheadOverlay playhead
Definition waveform_editor_primitives.hpp:271
int edit_id
Definition waveform_editor_primitives.hpp:274
WaveformViewport viewport
Definition waveform_editor_primitives.hpp:269
WaveformHandleModel handles
Definition waveform_editor_primitives.hpp:270
bool edit_active
Definition waveform_editor_primitives.hpp:272
Definition waveform_editor_primitives.hpp:232
bool active
Definition waveform_editor_primitives.hpp:234
WaveformEditorOperationKind operation
Definition waveform_editor_primitives.hpp:233
WaveformSampleRange selection
Definition waveform_editor_primitives.hpp:237
bool committed
Definition waveform_editor_primitives.hpp:235
bool cancelled
Definition waveform_editor_primitives.hpp:236
int64_t playhead_sample
Definition waveform_editor_primitives.hpp:238
Editor handle state without rendering, input events, or audio ownership.
Definition waveform_editor_primitives.hpp:93
int64_t total_samples
Definition waveform_editor_primitives.hpp:94
void set_fade_out(int64_t start_sample)
int64_t fade_in_end
Definition waveform_editor_primitives.hpp:106
void for_each_handle(Visitor &&visitor) const
Definition waveform_editor_primitives.hpp:132
bool has_selection
Definition waveform_editor_primitives.hpp:96
void set_total_samples(int64_t samples)
bool has_loop
Definition waveform_editor_primitives.hpp:102
void set_loop(int64_t start, int64_t end)
int64_t playhead
Definition waveform_editor_primitives.hpp:112
void set_trim(int64_t start, int64_t end)
void set_playhead(int64_t sample)
bool has_fade_in
Definition waveform_editor_primitives.hpp:105
WaveformSampleRange trim
Definition waveform_editor_primitives.hpp:100
std::vector< int64_t > slice_markers
Definition waveform_editor_primitives.hpp:114
bool has_fade_out
Definition waveform_editor_primitives.hpp:108
int64_t fade_out_start
Definition waveform_editor_primitives.hpp:109
std::vector< WaveformHandle > handles() const
WaveformSampleRange selection
Definition waveform_editor_primitives.hpp:97
void set_slice_markers(std::vector< int64_t > markers)
WaveformSampleRange loop
Definition waveform_editor_primitives.hpp:103
bool has_trim
Definition waveform_editor_primitives.hpp:99
void set_fade_in(int64_t end_sample)
bool has_playhead
Definition waveform_editor_primitives.hpp:111
void set_selection(int64_t start, int64_t end)
Definition waveform_editor_primitives.hpp:85
int64_t sample
Definition waveform_editor_primitives.hpp:88
bool enabled
Definition waveform_editor_primitives.hpp:89
WaveformHandleKind kind
Definition waveform_editor_primitives.hpp:86
Definition waveform_editor_primitives.hpp:165
bool hit() const
Definition waveform_editor_primitives.hpp:171
float distance_px
Definition waveform_editor_primitives.hpp:169
WaveformHandleKind kind
Definition waveform_editor_primitives.hpp:166
int64_t sample
Definition waveform_editor_primitives.hpp:168
Definition waveform_editor_primitives.hpp:214
int64_t sample
Definition waveform_editor_primitives.hpp:215
bool visible
Definition waveform_editor_primitives.hpp:216
float x
Definition waveform_editor_primitives.hpp:217
Opt-in geometry plan. Callers decide when span allocation is acceptable.
Definition waveform_editor_primitives.hpp:63
WaveformViewport viewport
Definition waveform_editor_primitives.hpp:64
std::vector< WaveformRenderSpan > spans
Definition waveform_editor_primitives.hpp:65
One pixel/column span for waveform min/max reduction or GPU upload planning.
Definition waveform_editor_primitives.hpp:53
int64_t sample_count() const
Definition waveform_editor_primitives.hpp:59
float width
Definition waveform_editor_primitives.hpp:57
int64_t sample_end
Definition waveform_editor_primitives.hpp:55
float x
Definition waveform_editor_primitives.hpp:56
int64_t sample_start
Definition waveform_editor_primitives.hpp:54
Sample range in source-frame coordinates. End is exclusive by convention.
Definition waveform_editor_primitives.hpp:16
int64_t start
Definition waveform_editor_primitives.hpp:17
bool empty() const
Definition waveform_editor_primitives.hpp:21
WaveformSampleRange normalized() const
int64_t end
Definition waveform_editor_primitives.hpp:18
int64_t length() const
Definition waveform_editor_primitives.hpp:20
Definition waveform_editor_primitives.hpp:204
WaveformSnapSource source
Definition waveform_editor_primitives.hpp:207
int64_t sample
Definition waveform_editor_primitives.hpp:205
bool snapped
Definition waveform_editor_primitives.hpp:206
Definition waveform_editor_primitives.hpp:197
int64_t grid_interval_samples
Definition waveform_editor_primitives.hpp:198
std::vector< int64_t > candidates
Definition waveform_editor_primitives.hpp:200
int64_t tolerance_samples
Definition waveform_editor_primitives.hpp:199
bool snap_to_bounds
Definition waveform_editor_primitives.hpp:201
Immutable-for-paint viewport state and sample/pixel conversion rules.
Definition waveform_editor_primitives.hpp:26
bool empty() const
Definition waveform_editor_primitives.hpp:41
bool sample_point_visible(int64_t sample) const
void set_visible_range(int64_t start, int64_t length)
int64_t total_samples
Definition waveform_editor_primitives.hpp:27
double pixels_per_sample() const
float sample_to_x(int64_t sample) const
int64_t visible_length
Definition waveform_editor_primitives.hpp:29
int64_t visible_start
Definition waveform_editor_primitives.hpp:28
int64_t clamp_sample(int64_t sample) const
int64_t min_visible_length
Definition waveform_editor_primitives.hpp:30
void scroll(int64_t delta_samples)
void zoom_in(double factor=2.0)
void zoom_out(double factor=2.0)
bool sample_visible(int64_t sample) const
void set_total_samples(int64_t samples)
int64_t x_to_sample(float x) const
double samples_per_pixel() const
Rect bounds
Definition waveform_editor_primitives.hpp:31