From b50373d6db9a89e32406bdb659fab6d112b39f1a Mon Sep 17 00:00:00 2001 From: Marco Arnulfo Date: Wed, 14 Oct 2026 19:25:20 +0200 Subject: [PATCH] A Pencil click on a MIDI clip selects it, so the MIDI Editor follows (fixes #562) --- crates/ui-egui/src/edit_window.rs | 9 +++++++-- crates/ui-egui/tests/new_midi_clip.rs | 15 +++++++++++++++ 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/crates/ui-egui/src/edit_window.rs b/crates/ui-egui/src/edit_window.rs index f77560a5..78fc4ff2 100644 --- a/crates/ui-egui/src/edit_window.rs +++ b/crates/ui-egui/src/edit_window.rs @@ -2177,8 +2177,13 @@ fn lane_interaction(app: &mut SoundApp, ui: &mut Ui, track: &Track, lane: Rect, "automation.set_point", json!({"track": track.id.0, "param": automation_id(param), "at": at, "value": lo + (hi - lo) * k}), ); - } else if track.kind.is_midi() && hit.is_none() { - new_midi_clip(app, &s, track.id, at, at); + } else if track.kind.is_midi() { + match &hit { + Some(c) => { + let _ = app.run("edit.select", json!({"clips": [c.id.0]})); + } + None => new_midi_clip(app, &s, track.id, at, at), + } } } _ if !selector_press => place_insertion(app, ui, &s, track.id, at, mods.shift), diff --git a/crates/ui-egui/tests/new_midi_clip.rs b/crates/ui-egui/tests/new_midi_clip.rs index ec3fb07b..46b54616 100644 --- a/crates/ui-egui/tests/new_midi_clip.rs +++ b/crates/ui-egui/tests/new_midi_clip.rs @@ -135,3 +135,18 @@ fn a_click_in_the_empty_midi_editor_adds_a_clip_at_the_insertion_point() { assert_eq!(r.clips(), vec![(r.bar(3), r.bar(4))]); assert_eq!(midi_editor::target_clip(&r.app), Some(r.app.engine.session().tracks[0].clips()[0].id)); } + +#[test] +fn a_pencil_click_on_a_clip_selects_it_for_the_midi_editor() { + let mut r = Rig::new("instrument"); + r.app.ui.show_midi_editor = true; + r.drag((r.bar(2) + r.bar(3)) / 2, (r.bar(3) + r.bar(4)) / 2); + r.drag((r.bar(6) + r.bar(7)) / 2, (r.bar(7) + r.bar(8)) / 2); + let ids: Vec<_> = r.app.engine.session().tracks[0].clips().iter().map(|c| c.id).collect(); + assert_eq!(r.clips(), vec![(r.bar(2), r.bar(4)), (r.bar(6), r.bar(8))]); + assert_eq!(midi_editor::target_clip(&r.app), Some(ids[1])); + r.click((r.bar(2) + r.bar(3)) / 2); + assert_eq!(r.clips().len(), 2); + assert_eq!(r.app.engine.session().edit.selected_clips, vec![ids[0]]); + assert_eq!(midi_editor::target_clip(&r.app), Some(ids[0])); +}