use crate::*; def_sizes_iter!(PortsSizes => Arc, [Connect]); impl_has!(Vec: |self: Arrangement| self.midi_ins); impl_has!(Vec: |self: Arrangement| self.midi_outs); impl_has!(Vec: |self: App|self.project.midi_ins); impl_has!(Vec: |self: App|self.project.midi_outs); pub fn view_midi_ins_status (theme: ItemTheme, track: Option<&Track>) -> impl Draw { track.map(move|track|view_ports_status(theme, "MIDI ins: ", &track.sequencer.midi_ins)) } pub fn view_midi_outs_status (theme: ItemTheme, track: Option<&Track>) -> impl Draw { track.map(move|track|view_ports_status(theme, "MIDI outs: ", &track.sequencer.midi_outs)) } pub fn view_audio_ins_status (theme: ItemTheme, track: Option<&Track>) -> impl Draw { track.map(move|track|view_ports_status(theme, "Audio ins: ", &track.audio_ins())) } pub fn view_audio_outs_status (theme: ItemTheme, track: Option<&Track>) -> impl Draw { track.map(move|track|view_ports_status(theme, "Audio outs:", &track.audio_outs())) } pub fn view_ports_status <'a, T: JackPort> (theme: ItemTheme, title: &'a str, ports: &'a [T]) -> impl Draw + use<'a, T> { let ins = ports.len() as u16; let frame = Outer(true, Style::default().fg(g(96))); let names = iter_south(move||ports.iter().enumerate().map(|(index, port)|format!( " {index} {}", port.port_name() ).align_w().full_h())); let field = field_v(theme, title, names); border(true, frame, field.exact_wh(20, 1 + ins)).exact_wh(20, 1 + ins) } pub fn view_io_ports <'a, T: PortsSizes<'a>> ( fg: Color, bg: Color, items: impl Fn()->T + Send + Sync + 'a ) -> impl Draw + 'a { type Item<'a> = (usize, &'a Arc, &'a [Connect], usize, usize); iter(items, move|(_index, name, connections, y, y2): Item<'a>, _| south( bold(true, fg_bg(fg, bg, east(" 󰣲 ", name).align_w())).full_h(), iter(||connections.iter(), move|connect: &'a Connect, index|{ bold(false, fg_bg(fg, bg, &connect.info)).exact_h(1).align_w().push_y(index as u16) }) ).exact_h((y2 - y) as u16).push_y(y as u16)) } pub struct Junction(T); impl View for Junction { fn view (&self) -> impl Draw { T::KIND } } #[tek_proc::command(AudioInput)] #[tek_proc::keyword(AudioInput)] #[derive(Debug)] pub enum AudioInputCommand { Close, Connect(Arc), } #[tek_proc::command(AudioOutput)] #[tek_proc::keyword(AudioOutput)] #[derive(Debug)] pub enum AudioOutputCommand { Close, Connect(Arc), } #[tek_proc::command(MidiInput)] #[tek_proc::keyword(MidiInput)] #[derive(Debug)] pub enum MidiInputCommand { Close, Connect(Arc), } #[tek_proc::command(MidiOutput)] #[tek_proc::keyword(MidiOutput)] #[derive(Debug)] pub enum MidiOutputCommand { Close, Connect(Arc), }