54 lines
1.3 KiB
Rust
54 lines
1.3 KiB
Rust
use std::collections::HashSet;
|
|
|
|
#[derive(Default)]
|
|
pub struct MuteState {
|
|
pub muted: HashSet<(usize, usize)>,
|
|
pub soloed: HashSet<(usize, usize)>,
|
|
}
|
|
|
|
impl MuteState {
|
|
pub fn toggle_mute(&mut self, bank: usize, pattern: usize) {
|
|
let key = (bank, pattern);
|
|
if self.muted.contains(&key) {
|
|
self.muted.remove(&key);
|
|
} else {
|
|
self.muted.insert(key);
|
|
}
|
|
}
|
|
|
|
pub fn toggle_solo(&mut self, bank: usize, pattern: usize) {
|
|
let key = (bank, pattern);
|
|
if self.soloed.contains(&key) {
|
|
self.soloed.remove(&key);
|
|
} else {
|
|
self.soloed.insert(key);
|
|
}
|
|
}
|
|
|
|
pub fn clear_mute(&mut self) {
|
|
self.muted.clear();
|
|
}
|
|
|
|
pub fn clear_solo(&mut self) {
|
|
self.soloed.clear();
|
|
}
|
|
|
|
pub fn is_muted(&self, bank: usize, pattern: usize) -> bool {
|
|
self.muted.contains(&(bank, pattern))
|
|
}
|
|
|
|
pub fn is_soloed(&self, bank: usize, pattern: usize) -> bool {
|
|
self.soloed.contains(&(bank, pattern))
|
|
}
|
|
|
|
pub fn is_effectively_muted(&self, bank: usize, pattern: usize) -> bool {
|
|
if self.muted.contains(&(bank, pattern)) {
|
|
return true;
|
|
}
|
|
if !self.soloed.is_empty() && !self.soloed.contains(&(bank, pattern)) {
|
|
return true;
|
|
}
|
|
false
|
|
}
|
|
}
|