add Modal::Message to handle errors

This commit is contained in:
🪞👃🪞 2025-05-04 16:38:34 +03:00
parent a77536c234
commit 0a090765d3
4 changed files with 43 additions and 16 deletions

View file

@ -405,14 +405,16 @@ impl Tek {
match index { match index {
0 => { 0 => {
let jack = self.jack.clone(); let jack = self.jack.clone();
self.track_mut() let sampler = if let Ok(sampler) = Sampler::new(
.expect("no active track") &jack, &"sampler", &[], &[&[], &[]], &[&[], &[]]
.devices ) {
.push({
let sampler = Sampler::new(&jack, &"sampler", &[], &[&[], &[]], &[&[], &[]])?;
Device::Sampler(sampler)
});
self.modal = None; self.modal = None;
Device::Sampler(sampler)
} else {
self.modal = Some(Modal::Message(Message::FailedToAddDevice));
return Err("failed to add device".into())
};
self.track_mut().expect("no active track").devices.push(sampler);
Ok(()) Ok(())
}, },
1 => todo!(), 1 => todo!(),
@ -458,9 +460,20 @@ pub trait HasSelection {
pub enum Modal { pub enum Modal {
Help, Help,
Menu, Menu,
Device(usize) Device(usize),
Message(Message)
} }
/// Various possible messages
#[derive(PartialEq, Clone, Copy, Debug)]
pub enum Message {
FailedToAddDevice,
}
content!(TuiOut: |self: Message| match self {
Self::FailedToAddDevice => "Failed to add device"
});
/// Represents the current user selection in the arranger /// Represents the current user selection in the arranger
#[derive(PartialEq, Clone, Copy, Debug, Default)] #[derive(PartialEq, Clone, Copy, Debug, Default)]
pub enum Selection { pub enum Selection {

View file

@ -67,10 +67,11 @@ impl Tek {
Fixed::xy(30, 15, Tui::fg_bg(Rgb(255,255,255), Rgb(16,16,16), Bsp::b( Fixed::xy(30, 15, Tui::fg_bg(Rgb(255,255,255), Rgb(16,16,16), Bsp::b(
Repeat(" "), Repeat(" "),
Outer(true, Style::default().fg(Tui::g(96))) Outer(true, Style::default().fg(Tui::g(96)))
.enclose(self.modal.map(|modal|match modal { .enclose(self.modal.as_ref().map(|modal|match modal {
Modal::Menu => self.view_modal_menu().boxed(), Modal::Menu => self.view_modal_menu().boxed(),
Modal::Help => self.view_modal_help().boxed(), Modal::Help => self.view_modal_help().boxed(),
Modal::Device(index) => self.view_modal_device(index).boxed(), Modal::Device(index) => self.view_modal_device(*index).boxed(),
Modal::Message(message) => self.view_modal_message(message).boxed(),
})) }))
))) )))
)) ))
@ -120,6 +121,10 @@ impl Tek {
Bsp::s(Tui::bold(true, "Add device"), Map::south(1, choices, choice)) Bsp::s(Tui::bold(true, "Add device"), Map::south(1, choices, choice))
} }
fn view_modal_message <'a> (&'a self, message: &'a Message) -> impl Content<TuiOut> + use<'a> {
Bsp::s(message, "[ OK ]")
}
/// Spacing between tracks. /// Spacing between tracks.
pub(crate) const TRACK_SPACING: usize = 0; pub(crate) const TRACK_SPACING: usize = 0;
@ -361,14 +366,13 @@ impl<'a> ArrangerView<'a> {
.right(*width_side, button_2("Z", "add device", *is_editing)) .right(*width_side, button_2("Z", "add device", *is_editing))
.middle(*width_mid, per_track_top(*width_mid, ||self.tracks_with_sizes_scrolled(), .middle(*width_mid, per_track_top(*width_mid, ||self.tracks_with_sizes_scrolled(),
move|index, track|{ move|index, track|{
wrap(if *track_selected == Some(index) { let bg = if *track_selected == Some(index) {
track.color.light track.color.light
} else { } else {
track.color.base track.color.base
}.rgb, Tui::g(224), Tui::bold(true, Fill::x(Bsp::e( };
Tui::fg_bg(Reset, Reset, "[ "), let fg = Tui::g(224);
Tui::fg_bg(Reset, Reset, " ]"), track.devices.get(0).map(|device|wrap(bg.rgb, fg, device.name()))
))))
})) }))
} }

View file

@ -38,3 +38,12 @@ pub enum Device {
#[cfg(feature = "clap")] Clap, // TODO #[cfg(feature = "clap")] Clap, // TODO
#[cfg(feature = "sf2")] Sf2, // TODO #[cfg(feature = "sf2")] Sf2, // TODO
} }
impl Device {
pub fn name (&self) -> &str {
match self {
Self::Sampler(sampler) => sampler.name.as_ref(),
_ => todo!(),
}
}
}

View file

@ -64,6 +64,7 @@ impl Sampler {
) -> Usually<Self> { ) -> Usually<Self> {
let name = name.as_ref(); let name = name.as_ref();
Ok(Self { Ok(Self {
name: name.into(),
midi_in: Some(JackMidiIn::new(jack, format!("M/{name}"), midi_from)?), midi_in: Some(JackMidiIn::new(jack, format!("M/{name}"), midi_from)?),
audio_ins: vec![ audio_ins: vec![
JackAudioIn::new(jack, &format!("L/{name}"), audio_from[0])?, JackAudioIn::new(jack, &format!("L/{name}"), audio_from[0])?,