Feat: better user feedback on patterns page
All checks were successful
Deploy Website / deploy (push) Has been skipped

This commit is contained in:
2026-03-04 23:41:11 +01:00
parent 4e1c04f9c7
commit 35370a6f2c
11 changed files with 142 additions and 49 deletions

View File

@@ -130,6 +130,34 @@ impl PlaybackState {
self.soloed.contains(&(bank, pattern))
}
pub fn has_armed(&self) -> bool {
!self.staged_changes.is_empty()
|| !self.staged_mute_changes.is_empty()
|| !self.staged_prop_changes.is_empty()
}
pub fn armed_summary(&self) -> Option<String> {
let play = self.staged_changes.iter().filter(|c| matches!(c.change, PatternChange::Start { .. })).count();
let stop = self.staged_changes.iter().filter(|c| matches!(c.change, PatternChange::Stop { .. })).count();
let mute = self.staged_mute_changes.iter().filter(|c| matches!(c, StagedMuteChange::ToggleMute { .. })).count();
let solo = self.staged_mute_changes.iter().filter(|c| matches!(c, StagedMuteChange::ToggleSolo { .. })).count();
let props = self.staged_prop_changes.len();
let parts: Vec<String> = [
(play, "play"),
(stop, "stop"),
(mute, "mute"),
(solo, "solo"),
(props, "props"),
]
.into_iter()
.filter(|(n, _)| *n > 0)
.map(|(n, label)| format!("{n} {label}"))
.collect();
if parts.is_empty() { None } else { Some(parts.join(", ")) }
}
pub fn is_effectively_muted(&self, bank: usize, pattern: usize) -> bool {
if self.muted.contains(&(bank, pattern)) {
return true;

View File

@@ -86,6 +86,7 @@ pub struct UiState {
pub demo_index: usize,
pub nav_indicator_until: Option<Instant>,
pub nav_fx: RefCell<Option<Effect>>,
pub pulse_phase: f32,
pub last_click: Option<(Instant, u16, u16)>,
}
@@ -142,6 +143,7 @@ impl Default for UiState {
demo_index: 0,
nav_indicator_until: None,
nav_fx: RefCell::new(None),
pulse_phase: 0.0,
last_click: None,
}
}