Init
This commit is contained in:
1
src/services/mod.rs
Normal file
1
src/services/mod.rs
Normal file
@@ -0,0 +1 @@
|
||||
pub mod pattern_editor;
|
||||
105
src/services/pattern_editor.rs
Normal file
105
src/services/pattern_editor.rs
Normal file
@@ -0,0 +1,105 @@
|
||||
use crate::model::{PatternSpeed, Project};
|
||||
|
||||
#[derive(Debug, Clone, Copy)]
|
||||
pub struct PatternChange {
|
||||
pub bank: usize,
|
||||
pub pattern: usize,
|
||||
}
|
||||
|
||||
impl PatternChange {
|
||||
pub fn new(bank: usize, pattern: usize) -> Self {
|
||||
Self { bank, pattern }
|
||||
}
|
||||
}
|
||||
|
||||
pub fn toggle_step(
|
||||
project: &mut Project,
|
||||
bank: usize,
|
||||
pattern: usize,
|
||||
step: usize,
|
||||
) -> PatternChange {
|
||||
if let Some(s) = project.pattern_at_mut(bank, pattern).step_mut(step) {
|
||||
s.active = !s.active;
|
||||
}
|
||||
PatternChange::new(bank, pattern)
|
||||
}
|
||||
|
||||
pub fn set_length(
|
||||
project: &mut Project,
|
||||
bank: usize,
|
||||
pattern: usize,
|
||||
length: usize,
|
||||
) -> (PatternChange, usize) {
|
||||
project.pattern_at_mut(bank, pattern).set_length(length);
|
||||
let actual = project.pattern_at(bank, pattern).length;
|
||||
(PatternChange::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,
|
||||
) -> (PatternChange, 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,
|
||||
) -> (PatternChange, 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,
|
||||
) -> PatternChange {
|
||||
project.pattern_at_mut(bank, pattern).speed = speed;
|
||||
PatternChange::new(bank, pattern)
|
||||
}
|
||||
|
||||
pub fn increase_speed(project: &mut Project, bank: usize, pattern: usize) -> PatternChange {
|
||||
let pat = project.pattern_at_mut(bank, pattern);
|
||||
pat.speed = pat.speed.next();
|
||||
PatternChange::new(bank, pattern)
|
||||
}
|
||||
|
||||
pub fn decrease_speed(project: &mut Project, bank: usize, pattern: usize) -> PatternChange {
|
||||
let pat = project.pattern_at_mut(bank, pattern);
|
||||
pat.speed = pat.speed.prev();
|
||||
PatternChange::new(bank, pattern)
|
||||
}
|
||||
|
||||
pub fn set_step_script(
|
||||
project: &mut Project,
|
||||
bank: usize,
|
||||
pattern: usize,
|
||||
step: usize,
|
||||
script: String,
|
||||
) -> PatternChange {
|
||||
if let Some(s) = project.pattern_at_mut(bank, pattern).step_mut(step) {
|
||||
s.script = script;
|
||||
}
|
||||
PatternChange::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())
|
||||
}
|
||||
Reference in New Issue
Block a user