diff --git a/crates/device/src/arranger/arranger_view.rs b/crates/device/src/arranger/arranger_view.rs index e6213432..37b8e593 100644 --- a/crates/device/src/arranger/arranger_view.rs +++ b/crates/device/src/arranger/arranger_view.rs @@ -86,7 +86,7 @@ impl<'a> Content for ArrangerView<'a> { let bg = |x|Tui::bg(Reset, x); //let track_scroll = |x|Bsp::s(&self.track_scroll, x); //let scene_scroll = |x|Bsp::e(&self.scene_scroll, x); - outs(tracks(devices(ins(bg(self.scenes(None)))))) + outs(tracks(devices(ins(bg(self.scenes(&None)))))) } } @@ -150,7 +150,7 @@ impl<'a> ArrangerView<'a> { pub(crate) const H_EDITOR: usize = 15; /// Render scenes with clips - pub(crate) fn scenes (&'a self, editor: Option) -> impl Content + 'a { + pub(crate) fn scenes (&'a self, editor: &'a Option) -> impl Content + 'a { /// A scene with size and color. type SceneWithColor<'a> = (usize, &'a Scene, usize, usize, Option); let Self { @@ -163,85 +163,78 @@ impl<'a> ArrangerView<'a> { let selection = Has::>::get(self.arrangement); let selected_track = selection.map(|s|s.track()).flatten(); let selected_scene = selection.map(|s|s.scene()).flatten(); - - let scenes_with_scene_colors = ||HasScenes::scenes_with_sizes(self.arrangement, - *is_editing, - Self::H_SCENE, - Self::H_EDITOR, - selected_track, - selected_scene, - ).map_while(|(s, scene, y1, y2)|if y2 as u16 > *scenes_height { - None - } else { - Some((s, scene, y1, y2, if s == 0 { - None - } else { - Some(arrangement.scenes()[s-1].color) - })) - }); - - let scene_header = |(s, scene, y1, y2, previous): SceneWithColor, _|{ - let height = (1 + y2 - y1) as u16; - let name = Some(scene.name.clone()); - let content = Fill::x(Align::w(Tui::bold(true, Bsp::e(" ⯈ ", name)))); - let same_track = true; - let selected = same_track && *scene_selected == Some(s); - let neighbor = same_track && s > 0 && *scene_selected == Some(s - 1); - let is_last = *scene_last == s; - let theme = scene.color; - let fg = theme.lightest.rgb; - let bg = if selected { theme.light } else { theme.base }.rgb; - let hi = if let Some(previous) = previous { - if neighbor { - previous.light.rgb - } else { - previous.base.rgb - } - } else { - Reset - }; - let lo = if is_last { - Reset - } else if selected { - theme.light.rgb - } else { - theme.base.rgb - }; - Fill::x(map_south(y1 as u16, height, Fixed::y(height, Phat { - width: 0, height: 0, content, colors: [fg, bg, hi, lo] - }))) - }; - - let scenes_with_track_colors = |track: usize| arrangement.scenes_with_sizes( - self.is_editing, - Self::H_SCENE, - Self::H_EDITOR, - selected_track, - selected_scene, - ).map_while(|(s, scene, y1, y2)|if y2 as u16 > self.scenes_height { - None - } else { - Some((s, scene, y1, y2, if s == 0 { - None - } else { - Some(self.arrangement.scenes[s-1].clips[track].as_ref() - .map(|c|c.read().unwrap().color) - .unwrap_or(ItemTheme::G[32])) - })) - }); - Tryptich::center(*scenes_height) .left(*width_side, Map::new( - ||scenes_with_scene_colors(), - scene_header)) + move||arrangement.scenes_with_sizes( + *is_editing, + Self::H_SCENE, + Self::H_EDITOR, + selected_track, + selected_scene, + ).map_while(|(s, scene, y1, y2)|if y2 as u16 > *scenes_height { + None + } else { + Some((s, scene, y1, y2, if s == 0 { + None + } else { + Some(arrangement.scenes()[s-1].color) + })) + }), + move |(s, scene, y1, y2, previous): SceneWithColor, _|{ + let height = (1 + y2 - y1) as u16; + let name = Some(scene.name.clone()); + let content = Fill::x(Align::w(Tui::bold(true, Bsp::e(" ⯈ ", name)))); + let same_track = true; + let selected = same_track && *scene_selected == Some(s); + let neighbor = same_track && s > 0 && *scene_selected == Some(s - 1); + let is_last = *scene_last == s; + let theme = scene.color; + let fg = theme.lightest.rgb; + let bg = if selected { theme.light } else { theme.base }.rgb; + let hi = if let Some(previous) = previous { + if neighbor { + previous.light.rgb + } else { + previous.base.rgb + } + } else { + Reset + }; + let lo = if is_last { + Reset + } else if selected { + theme.light.rgb + } else { + theme.base.rgb + }; + Fill::x(map_south(y1 as u16, height, Fixed::y(height, Phat { + width: 0, height: 0, content, colors: [fg, bg, hi, lo] + }))) + })) .middle(*width_mid, per_track( *width_mid, ||self.tracks_with_sizes_scrolled(), - |track_index, track|Map::new( - ||scenes_with_track_colors(track_index), - |(s, scene, y1, y2, previous): SceneWithColor<'a>, _|{ + move|track_index, track|Map::new( + move||arrangement.scenes_with_sizes( + self.is_editing, + Self::H_SCENE, + Self::H_EDITOR, + selected_track, + selected_scene, + ).map_while(move|(s, scene, y1, y2)|if y2 as u16 > self.scenes_height { + None + } else { + Some((s, scene, y1, y2, if s == 0 { + None + } else { + Some(self.arrangement.scenes[s-1].clips[track_index].as_ref() + .map(|c|c.read().unwrap().color) + .unwrap_or(ItemTheme::G[32])) + })) + }), + move|(s, scene, y1, y2, previous): SceneWithColor<'a>, _|{ let (name, theme) = if let Some(clip) = &scene.clips[track_index] { let clip = clip.read().unwrap(); (Some(clip.name.clone()), clip.color)