L7: capture-order slot model, card metadata overlay, tertiary-border selection

Add gap-preserving per-bank SlotMap (reorder + Alt-replace mutators, JSON
round-trip, insertion-order migration) to bank_book; stamp captureTimeSig on
Sample; pure card_meta formatters + card_drag gesture/slot module; card
metadata overlay + purple selection border in the panel. Shell drop/cursor
wiring deferred. Fixes: removeSample syncs SlotMap; card_drag gap-probe coordinate.
This commit is contained in:
2026-07-27 01:49:07 -04:00
parent 7dc77e51b5
commit fdb9e38ad6
20 changed files with 1495 additions and 21 deletions
+36 -1
View File
@@ -421,6 +421,31 @@ target_link_libraries(mode_enable PUBLIC view_mode_model)
add_library(tooltip STATIC src/tooltip.cpp)
target_include_directories(tooltip PUBLIC src)
# ---------------------------------------------------------------------------
# 2t) Pure card_meta formatters — NO REAPER, NO SWELL, NO LICE. The Phase L (L7)
# decorative card metadata overlay's formatting: bars.beats.subdivisions from a
# capture-time tempo + meter stamp (F1) and seconds.milliseconds from length. Split
# out so the musical/wall-clock string derivation (with its bar-boundary + unstamped
# edge cases) is unit-tested outside the DAW; the bank_panel kit-text overlay draw is
# DAW-verified. Mirror of tooltip's prefix-strip helper — pure, CTest-covered.
# ---------------------------------------------------------------------------
add_library(card_meta STATIC src/card_meta.cpp)
target_include_directories(card_meta PUBLIC src)
# ---------------------------------------------------------------------------
# 2u) Pure card_drag gesture — NO REAPER, NO SWELL, NO LICE, NO OS. The Phase L (L7)
# in-grid reorder drag decision logic: the F3 gesture precedence (leave-client ->
# OS-drag; else other-bank -> move/copy; else same-bank grid -> reorder/replace),
# the resolved-gesture -> cursor-cue map, and the sparse-aware slot rect layout +
# point -> slot hit-test (empties included). Split out so the precedence + slot math
# is unit-tested outside the DAW; the SWELL wiring + SetCursor call + drop-target draw
# are DAW-verified. Reuses drag_out's PanelClientRect/DragState + bank_grid's CellRect/
# GridSpec. Mirror of drag_out::decideGesture / bank_grid.
# ---------------------------------------------------------------------------
add_library(card_drag STATIC src/card_drag.cpp)
target_include_directories(card_drag PUBLIC src)
target_link_libraries(card_drag PUBLIC drag_out bank_grid)
# ---------------------------------------------------------------------------
# 3) Standalone tests for the pure modules (run without launching REAPER).
# ---------------------------------------------------------------------------
@@ -551,6 +576,14 @@ add_executable(tooltip_tests tests/test_tooltip.cpp)
target_link_libraries(tooltip_tests PRIVATE tooltip)
add_test(NAME tooltip_tests COMMAND tooltip_tests)
add_executable(card_meta_tests tests/test_card_meta.cpp)
target_link_libraries(card_meta_tests PRIVATE card_meta)
add_test(NAME card_meta_tests COMMAND card_meta_tests)
add_executable(card_drag_tests tests/test_card_drag.cpp)
target_link_libraries(card_drag_tests PRIVATE card_drag)
add_test(NAME card_drag_tests COMMAND card_drag_tests)
# ---------------------------------------------------------------------------
# 4) The REAPER extension — a loadable module (dlopen'd by REAPER, not linked).
# ---------------------------------------------------------------------------
@@ -599,8 +632,10 @@ add_library(reaper_reasampler MODULE
src/overflow_menu.cpp
src/mode_enable.cpp
src/tooltip.cpp
src/card_meta.cpp
src/card_drag.cpp
)
target_link_libraries(reaper_reasampler PRIVATE bank_model capture_paths peaks bank_grid mode_switch tab_strip view_mode_model insert_plan render_settings batch_capture tail_control realtime_record bank_book wav_trim owned_manifest prune_reconcile prune_button app_version provenance action_buttons drag_out theme component_geometry action_bar footer_bar overflow_menu mode_enable tooltip)
target_link_libraries(reaper_reasampler PRIVATE bank_model capture_paths peaks bank_grid mode_switch tab_strip view_mode_model insert_plan render_settings batch_capture tail_control realtime_record bank_book wav_trim owned_manifest prune_reconcile prune_button app_version provenance action_buttons drag_out theme component_geometry action_bar footer_bar overflow_menu mode_enable tooltip card_meta card_drag)
target_include_directories(reaper_reasampler PRIVATE ${SDK_INC} ${WDL_INC})
# OUTPUT_NAME is channel-derived (Phase V, V4): "reaper_reasampler" (stable, default) or
# "reaper_reasampler_beta" (beta). REAPER dlopen's any reaper_* module, so both channels'