T25d Generative: sound and motion

AudioGenerationPlayer shows a generated sound's prompt, model and
length, a bar while it is made, then chat::AudioMessage to play it;
Regenerate and Download wait for it. TTSVoicePicker lists voices with a
sample to play, the chosen one washed with a check, tags dropping below
when narrow. VideoGenerationTimeline lays shots along their time under
a ruler, with posters, placeholders, a playhead and Extend.

AudioMessage's waveform is one Tab stop where Left and Right seek, and
it gives way at 280px. debug::ruler serves the timeline's ruler. A mask
shown to read no longer follows the pointer.
This commit is contained in:
ZacharyZhang-NY committed 2026-09-26 13:16:42 -04:00
1 parent 6bfd53baee
commit 2266b4e367
16 files changed
+1198 -19

No files matched your search

+13 -11
View File
@@ -329,19 +329,21 @@ impl RenderOnce for InpaintCanvas {
.size_full(),
)
.children(ring)
.on_mouse_move(move |event, _, cx| {
hover.update(cx, |pointer, cx| {
*pointer = Some(event.position);
cx.notify();
})
})
.on_hover(move |hovered, _, cx| {
if !hovered {
leave.update(cx, |pointer, cx| {
*pointer = None;
.when(drawn, |area| {
area.on_mouse_move(move |event, _, cx| {
hover.update(cx, |pointer, cx| {
*pointer = Some(event.position);
cx.notify();
})
}
})
.on_hover(move |hovered, _, cx| {
if !hovered {
leave.update(cx, |pointer, cx| {
*pointer = None;
cx.notify();
})
}
})
})
.on_key_down(move |event, window, cx| {
let Some(keys) = &keys else {