Lightningbeam/lightningbeam-ui/lightningbeam-core/src
Skyler Lehmkuhl 6924fc0ffe Take management: move takes onto the clip instance
Take management should be per clip instance — deleting a take from one
half of a comped split shouldn't pull it out from under the other half.
That's cleanest if the takes themselves live on the instance rather than
the clip, so they do now.

AudioClipType::TakeFolder is gone entirely. A clip is plain Sampled/Midi
content again, and an instance with a non-empty `takes` list simply
OVERRIDES it with whichever take is active. Splitting already clones the
instance, so each half gets its own take list for free — no index
remapping across instances, no copy-on-write, no shared-state surprise —
and comping still works, because the halves can still each select a
different take. It collapsed machinery too: resolve() moved from the clip
to the instance, and owns_audio_pool_index went back to a one-liner.

Management (DeleteTakeAction, DeleteUnusedTakesAction, RenameTakeAction):
- Right-click a clip with more than one take: `Delete "<active take>"`
  and "Delete Unused Takes". Deletion is named after the take that's
  PLAYING rather than being a generic entry, so you pick the victim by
  selecting it — one clear act instead of hunting a small trash icon in a
  list (which is where this started, and it was fiddly).
- Double-click a take in the dropdown to rename it in place.
- What happens to the selection on delete is the subtle part, and there's
  a test per case: deleting a take BELOW the active one shifts the
  selection down so you keep hearing the same take; deleting the ACTIVE
  take lands on whatever slid into its place (not silently back to take
  1); deleting the LAST take steps back one. The only take can't be
  deleted at all — the menu item isn't offered.
- Deleted takes' audio stays in the pool: undo has to put it back, and
  the other half of a split may still be playing it.

Fixes:
- A recording that stopped before the loop came round wasn't joining an
  existing take list — it landed as a separate overlapping clip. Trigger-
  on-wrap is right for the FIRST recording, but once takes exist there,
  a further run is plainly another take however short. The engine can't
  know that (it's document state), so the editor passes `force_takes`
  with the start-recording command and the run is cut and padded to the
  region even with zero wraps. This forced cycle_loop_len and `wrapped`
  apart on the MIDI side: the region length has to be known from the
  start, but the clip should only pin to full-region length AFTER a pass
  completes, or the bar jumps to full width the moment you hit record.
- Recording a second take left BOTH sounding. append_cycle_takes tore
  down the recording's backend clip by looking it up in
  clip_instance_to_backend_map — but on the audio path the recording
  instance isn't in that map yet; it's only added during promotion, which
  the append path skips. The event already carries the engine's clip id,
  so it's handed over explicitly now.
- The take badge is hidden when there's only one take — no choice to make.
2026-07-14 12:58:33 -04:00
..
actions Take management: move takes onto the clip instance 2026-07-14 12:58:33 -04:00
dcel2 Merge branch 'rust-ui' of https://git.skyler.io/skyler/Lightningbeam into rust-ui 2026-03-09 13:41:48 -04:00
gpu Onion skinning: vector-layer ghosts (tinted) 2026-06-20 23:49:33 -04:00
shaders Fix gamma handling and improve brush canvas performance 2026-06-16 08:32:39 -04:00
vector_graph P5 mobile gestures + long-press context menus 2026-07-02 00:11:49 -04:00
action.rs Take management: move takes onto the clip instance 2026-07-14 12:58:33 -04:00
animation.rs Lock editing on tween in-between frames 2026-06-21 16:01:47 -04:00
asset_folder.rs add folders to asset library 2025-12-30 00:45:19 -05:00
beam_archive.rs Add text layers 2026-06-27 18:14:47 -04:00
beat_time.rs Massive tempo refactor - make beats canonical time rep and allow them to be non constant 2026-04-02 10:26:01 -04:00
bezier_vertex.rs initial vector editing 2025-12-22 18:34:01 -05:00
bezpath_editing.rs initial vector editing 2025-12-22 18:34:01 -05:00
brush_engine.rs Phase 3a-3: low-res image proxy for cold-scrub raster frames 2026-06-20 20:05:46 -04:00
brush_settings.rs add brush library 2026-03-04 16:42:43 -05:00
clip.rs Take management: move takes onto the clip instance 2026-07-14 12:58:33 -04:00
clipboard.rs Add text layers 2026-06-27 18:14:47 -04:00
clipboard_platform.rs Address Mac build failures 2026-03-09 22:03:51 -04:00
curve_intersection.rs Paint bucket 2025-11-19 01:47:37 -05:00
curve_intersections.rs rewrite vector backend again 2026-03-13 18:53:33 -04:00
curve_segment.rs Paint bucket 2025-11-19 01:47:37 -05:00
dcel.rs rewrite dcel 2026-02-26 18:48:21 -05:00
document.rs Take management: move takes onto the clip instance 2026-07-14 12:58:33 -04:00
effect.rs Timeline types stage 1: make lightningbeam-core Beats/Seconds-typed 2026-07-10 09:36:07 -04:00
effect_layer.rs Type the time domains: no raw f64 in any time-carrying API 2026-07-14 09:31:04 -04:00
effect_registry.rs Fix gamma handling and improve brush canvas performance 2026-06-16 08:32:39 -04:00
export.rs Audio export: real FLAC + tag metadata for all formats 2026-07-09 12:52:37 -04:00
file_io.rs Save: skip re-encoding unchanged raster keyframes 2026-07-09 13:58:34 -04:00
file_types.rs Add SVG vector import and export 2026-06-26 16:40:39 -04:00
flood_fill.rs Magic wand selection 2026-03-07 03:39:09 -05:00
fonts.rs Add text layers 2026-06-27 18:14:47 -04:00
gap_handling.rs Paint bucket 2025-11-19 01:47:37 -05:00
gradient.rs Add gradient support to vector graphics 2026-03-10 00:57:47 -04:00
hit_test.rs Type the time domains: no raw f64 in any time-carrying API 2026-07-14 09:31:04 -04:00
instance_group.rs Audio from videos 2025-12-03 01:04:09 -05:00
intersection_graph.rs Clean up build warnings 2026-02-14 11:07:32 -05:00
layer.rs Add text layers 2026-06-27 18:14:47 -04:00
layer_tree.rs Initial work on movie clips 2026-02-21 00:54:38 -05:00
layout.rs Add Rust desktop UI with Blender-style pane system 2025-11-12 06:13:00 -05:00
lib.rs Add text layers 2026-06-27 18:14:47 -04:00
object.rs aspect ratio: unify video placement + add export fit modes 2026-06-26 06:54:49 -04:00
pane.rs Add script node 2026-02-19 09:29:14 -05:00
path_fitting.rs Clean up build warnings 2026-02-14 11:07:32 -05:00
path_interpolation.rs Render shape on stage 2025-11-16 02:40:06 -05:00
planar_graph.rs Clean up build warnings 2026-02-14 11:07:32 -05:00
quadtree.rs Paint bucket 2025-11-19 01:47:37 -05:00
raster_draw.rs Shape tools 2026-03-07 07:27:45 -05:00
raster_layer.rs raster: info-panel size + "Layer to document size" (scale/expand-crop) 2026-06-26 15:40:23 -04:00
raster_store.rs Phase 3a-1: lazy fault-in of raster keyframe pixels 2026-06-19 16:59:46 -04:00
region_select.rs rewrite dcel 2026-02-26 18:48:21 -05:00
renderer.rs Type the time domains: no raw f64 in any time-carrying API 2026-07-14 09:31:04 -04:00
script.rs Add script node 2026-02-19 09:29:14 -05:00
segment_builder.rs Clean up build warnings 2026-02-14 11:07:32 -05:00
selection.rs Unify selection systems and make region/lasso cut robust 2026-06-21 14:47:11 -04:00
shape.rs Phase 5: fix broken unit tests; cargo test --lib green again 2026-06-19 16:45:23 -04:00
snap.rs work on vector graph 2026-03-22 18:16:17 -04:00
svg_export.rs SVG export: emit text layers as real glyph outlines 2026-07-09 07:10:59 -04:00
tempo_map.rs Massive tempo refactor - make beats canonical time rep and allow them to be non constant 2026-04-02 10:26:01 -04:00
test_mode.rs Fix DCEL selection bugs 2026-03-05 19:55:39 -05:00
text_layer.rs Add text layers 2026-06-27 18:14:47 -04:00
tolerance_quadtree.rs Paint bucket 2025-11-19 01:47:37 -05:00
tool.rs Add text layers 2026-06-27 18:14:47 -04:00
video.rs Address code-review findings across export, decode, and data model 2026-06-26 17:47:32 -04:00
webcam.rs Record to multiple layers 2026-03-01 13:48:43 -05:00