diff --git a/tek/src/view.rs b/tek/src/view.rs index 270a4858..050db51e 100644 --- a/tek/src/view.rs +++ b/tek/src/view.rs @@ -31,7 +31,6 @@ impl ViewMemo { trks: ViewMemo, String>, stop: Arc, edit: Arc, - last_color: Arc> } impl Default for ViewCache { fn default () -> Self { @@ -46,7 +45,6 @@ impl Default for ViewCache { trks: ViewMemo::new(None, String::with_capacity(16)), stop: "⏹".into(), edit: "edit".into(), - last_color: Arc::new(RwLock::new(ItemPalette::G[0])) } } } @@ -288,23 +286,20 @@ impl Tek { let tracks = move||self.tracks_sizes(editing, self.editor_w()); let selected_track = self.selected().track(); let selected_scene = self.selected().scene(); + let header_cell = move|t, s, bg: &ItemPalette, last: Option, name: Arc|{ + let selected = t && self.selected().scene() == Some(s+1); + let neighbor = t && self.selected().scene() == Some(s); + Phat { + width: 0, + height: 0, + selected, + content: Tui::bold(true, Bsp::e("🭬", name.clone())), + colors: colors( + bg, last, selected, neighbor, s == self.scenes.len().saturating_sub(1) + ) + } + }; let header = move||{ - let cell = move|t, s, bg: &ItemPalette, last: Option, name: Arc|{ - let selected = t && self.selected().scene() == Some(s+1); - let neighbor = t && self.selected().scene() == Some(s); - Phat { - width: 0, - height: 0, - selected, - content: Tui::bold(true, Bsp::e("🭬", name.clone())), - colors: [ - bg.lightest.rgb, - if selected { bg.light } else { bg.base }.rgb, - if neighbor { last.map(|last|last.light.rgb) } else { last.map(|last|last.base.rgb) }.unwrap_or(Reset), - Reset, - ] - } - }; Align::y(Map::new( move||self.scenes_sizes(editing, 2, 15).map_while( move|(s, scene, y1, y2)|if y2 > size_h { None } else { Some((s, scene, y1, y2, if s == 0 { @@ -315,7 +310,7 @@ impl Tek { move|(_, scene, y1, y2, last), s| { let height = (1 + y2 - y1) as u16; map_south(y1 as u16, height, Fixed::y(height, - cell(true, s, &scene.color, last, scene.name.clone()))) })).boxed() + header_cell(true, s, &scene.color, last, scene.name.clone()))) })).boxed() }; let content: ThunkBox<_> = per_track!(self.size.w(); |self, track, t|{ let tab = " Tab "; @@ -325,8 +320,9 @@ impl Tek { move|(s, scene, y1, y2)|if y2 > size_h { None } else { Some((s, scene, y1, y2, if s == 0 { None } else { - self.scenes[s-1].clips[t].as_ref().map(|c|c.read().unwrap().color) - })) }), + Some(self.scenes[s-1].clips[t].as_ref() + .map(|c|c.read().unwrap().color) + .unwrap_or(ItemPalette::G[32])) })) }), move|(_, scene, y1, y2, last), s| { let height = (1 + y2 - y1) as u16; let mut fg = Tui::g(64); @@ -336,7 +332,6 @@ impl Tek { fg = clip.color.lightest.rgb; bg = clip.color }; - // weird offsetting: let selected = same_track && selected_scene == Some(s+1); let neighbor = same_track && selected_scene == Some(s); let active = editing && selected; @@ -346,34 +341,15 @@ impl Tek { let name = clip.map(|c|c.read().unwrap().name.clone()); Align::nw(Tui::fg(fg, Bsp::e(icon, Bsp::e(Tui::bold(true, name), " ")))) }; - map_south(y1 as u16, height, Fixed::y(height, Either::new(active, - Thunk::new(move||Bsp::a( - Fill::xy(Align::nw(button(tab, content()))), - &self.editor)), - Thunk::new(move||Bsp::a( - When::new(selected, Fill::y(Align::n(button(tab, "edit")))), - Phat { - width: 0, - height: 0, - selected, - content: content(), - colors: [ - fg, - if selected { bg.light } else { bg.base }.rgb, - if neighbor { - last.map(|last|last.light.rgb) - } else { - last.map(|last|last.base.rgb) - }.unwrap_or(Reset), - if s == self.scenes.len().saturating_sub(1) { - Reset - } else if selected { - bg.light.rgb - } else { - bg.base.rgb - }, - ], - }))))) + map_south(y1 as u16, height, Fixed::y(height, Phat { + width: 0, + height: 0, + selected, + content: content(), + colors: colors( + &bg, last, selected, neighbor, s == self.scenes.len().saturating_sub(1) + ), + })) }) }); //let border = move|x|Outer(false, bstyle).enclose_bg(x); @@ -416,3 +392,26 @@ fn button <'a> ( Margin::x(1, Tui::fg_bg(Tui::g(255), Tui::g(96), label)), )) } +fn colors ( + this: &ItemPalette, + prev: Option, + selected: bool, + neighbor: bool, + is_last: bool, +) -> [Color;4] { + let fg = this.lightest.rgb; + let bg = if selected { this.light } else { this.base }.rgb; + let hi = if neighbor { + prev.map(|prev|prev.light.rgb) + } else { + prev.map(|prev|prev.base.rgb) + }.unwrap_or(Reset); + let lo = if is_last { + Reset + } else if selected { + this.light.rgb + } else { + this.base.rgb + }; + [fg, bg, hi, lo] +}