93 lines
2.5 KiB
Rust
93 lines
2.5 KiB
Rust
use crate::model::{PatternSpeed, Project};
|
|
|
|
#[derive(Debug, Clone, Copy)]
|
|
pub struct PatternEdit {
|
|
pub bank: usize,
|
|
pub pattern: usize,
|
|
}
|
|
|
|
impl PatternEdit {
|
|
pub fn new(bank: usize, pattern: usize) -> Self {
|
|
Self { bank, pattern }
|
|
}
|
|
}
|
|
|
|
pub fn toggle_step(project: &mut Project, bank: usize, pattern: usize, step: usize) -> PatternEdit {
|
|
if let Some(s) = project.pattern_at_mut(bank, pattern).step_mut(step) {
|
|
s.active = !s.active;
|
|
}
|
|
PatternEdit::new(bank, pattern)
|
|
}
|
|
|
|
pub fn set_length(
|
|
project: &mut Project,
|
|
bank: usize,
|
|
pattern: usize,
|
|
length: usize,
|
|
) -> (PatternEdit, usize) {
|
|
project.pattern_at_mut(bank, pattern).set_length(length);
|
|
let actual = project.pattern_at(bank, pattern).length;
|
|
(PatternEdit::new(bank, pattern), actual)
|
|
}
|
|
|
|
pub fn get_length(project: &Project, bank: usize, pattern: usize) -> usize {
|
|
project.pattern_at(bank, pattern).length
|
|
}
|
|
|
|
pub fn increase_length(project: &mut Project, bank: usize, pattern: usize) -> (PatternEdit, usize) {
|
|
let current = get_length(project, bank, pattern);
|
|
set_length(project, bank, pattern, current + 1)
|
|
}
|
|
|
|
pub fn decrease_length(project: &mut Project, bank: usize, pattern: usize) -> (PatternEdit, usize) {
|
|
let current = get_length(project, bank, pattern);
|
|
set_length(project, bank, pattern, current.saturating_sub(1))
|
|
}
|
|
|
|
pub fn set_speed(
|
|
project: &mut Project,
|
|
bank: usize,
|
|
pattern: usize,
|
|
speed: PatternSpeed,
|
|
) -> PatternEdit {
|
|
project.pattern_at_mut(bank, pattern).speed = speed;
|
|
PatternEdit::new(bank, pattern)
|
|
}
|
|
|
|
pub fn increase_speed(project: &mut Project, bank: usize, pattern: usize) -> PatternEdit {
|
|
let pat = project.pattern_at_mut(bank, pattern);
|
|
pat.speed = pat.speed.next();
|
|
PatternEdit::new(bank, pattern)
|
|
}
|
|
|
|
pub fn decrease_speed(project: &mut Project, bank: usize, pattern: usize) -> PatternEdit {
|
|
let pat = project.pattern_at_mut(bank, pattern);
|
|
pat.speed = pat.speed.prev();
|
|
PatternEdit::new(bank, pattern)
|
|
}
|
|
|
|
pub fn set_step_script(
|
|
project: &mut Project,
|
|
bank: usize,
|
|
pattern: usize,
|
|
step: usize,
|
|
script: String,
|
|
) -> PatternEdit {
|
|
if let Some(s) = project.pattern_at_mut(bank, pattern).step_mut(step) {
|
|
s.script = script;
|
|
}
|
|
PatternEdit::new(bank, pattern)
|
|
}
|
|
|
|
pub fn get_step_script(
|
|
project: &Project,
|
|
bank: usize,
|
|
pattern: usize,
|
|
step: usize,
|
|
) -> Option<String> {
|
|
project
|
|
.pattern_at(bank, pattern)
|
|
.step(step)
|
|
.map(|s| s.script.clone())
|
|
}
|