Feat: introduce follow up actions

This commit is contained in:
2026-02-22 03:59:09 +01:00
parent d3b27e8245
commit e2f3bcd4a9
25 changed files with 203 additions and 307 deletions

View File

@@ -609,37 +609,45 @@ fn render_modal(
speed,
quantization,
sync_mode,
follow_up,
} => {
use crate::model::FollowUp;
use crate::state::PatternPropsField;
let is_chain = matches!(follow_up, FollowUp::Chain { .. });
let modal_height = if is_chain { 16 } else { 14 };
let inner = ModalFrame::new(&format!(" Pattern B{:02}:P{:02} ", bank + 1, pattern + 1))
.width(50)
.height(12)
.height(modal_height)
.border_color(theme.modal.input)
.render_centered(frame, term);
let speed_label = speed.label();
let fields: Vec<(&str, &str, bool)> = vec![
("Name", name.as_str(), *field == PatternPropsField::Name),
(
"Length",
length.as_str(),
*field == PatternPropsField::Length,
),
("Speed", &speed_label, *field == PatternPropsField::Speed),
(
"Quantization",
quantization.label(),
*field == PatternPropsField::Quantization,
),
(
"Sync Mode",
sync_mode.label(),
*field == PatternPropsField::SyncMode,
),
let follow_up_label = match follow_up {
FollowUp::Loop => "Loop".to_string(),
FollowUp::Stop => "Stop".to_string(),
FollowUp::Chain { bank: b, pattern: p } => {
format!("Chain B{:02}:P{:02}", b + 1, p + 1)
}
};
let mut fields: Vec<(&str, String, bool)> = vec![
("Name", name.clone(), *field == PatternPropsField::Name),
("Length", length.clone(), *field == PatternPropsField::Length),
("Speed", speed_label, *field == PatternPropsField::Speed),
("Quantization", quantization.label().to_string(), *field == PatternPropsField::Quantization),
("Sync Mode", sync_mode.label().to_string(), *field == PatternPropsField::SyncMode),
("Follow Up", follow_up_label, *field == PatternPropsField::FollowUp),
];
if is_chain {
if let FollowUp::Chain { bank: b, pattern: p } = follow_up {
fields.push((" Bank", format!("{:02}", b + 1), *field == PatternPropsField::ChainBank));
fields.push((" Pattern", format!("{:02}", p + 1), *field == PatternPropsField::ChainPattern));
}
}
render_props_form(frame, inner, &fields);
let fields_ref: Vec<(&str, &str, bool)> = fields.iter().map(|(l, v, s)| (*l, v.as_str(), *s)).collect();
render_props_form(frame, inner, &fields_ref);
let hint_area = Rect::new(inner.x, inner.y + inner.height - 1, inner.width, 1);
let hints = hint_line(&[