127 lines
4.7 KiB
Rust
127 lines
4.7 KiB
Rust
use crate::services::pattern_editor;
|
|
use crate::state::FlashKind;
|
|
|
|
use super::App;
|
|
|
|
impl App {
|
|
pub fn toggle_steps(&mut self) {
|
|
let (bank, pattern) = self.current_bank_pattern();
|
|
for idx in self.selected_steps() {
|
|
pattern_editor::toggle_step(&mut self.project_state.project, bank, pattern, idx);
|
|
}
|
|
self.project_state.mark_dirty(bank, pattern);
|
|
}
|
|
|
|
pub fn length_increase(&mut self) {
|
|
let (bank, pattern) = self.current_bank_pattern();
|
|
let (change, _) =
|
|
pattern_editor::increase_length(&mut self.project_state.project, bank, pattern);
|
|
self.project_state.mark_dirty(change.bank, change.pattern);
|
|
}
|
|
|
|
pub fn length_decrease(&mut self) {
|
|
let (bank, pattern) = self.current_bank_pattern();
|
|
let (change, new_len) =
|
|
pattern_editor::decrease_length(&mut self.project_state.project, bank, pattern);
|
|
if self.editor_ctx.step >= new_len {
|
|
self.editor_ctx.step = new_len - 1;
|
|
self.load_step_to_editor();
|
|
}
|
|
self.project_state.mark_dirty(change.bank, change.pattern);
|
|
}
|
|
|
|
pub fn speed_increase(&mut self) {
|
|
let (bank, pattern) = self.current_bank_pattern();
|
|
let change = pattern_editor::increase_speed(&mut self.project_state.project, bank, pattern);
|
|
self.project_state.mark_dirty(change.bank, change.pattern);
|
|
}
|
|
|
|
pub fn speed_decrease(&mut self) {
|
|
let (bank, pattern) = self.current_bank_pattern();
|
|
let change = pattern_editor::decrease_speed(&mut self.project_state.project, bank, pattern);
|
|
self.project_state.mark_dirty(change.bank, change.pattern);
|
|
}
|
|
|
|
pub fn delete_step(&mut self, bank: usize, pattern: usize, step: usize) {
|
|
let edit = pattern_editor::delete_step(&mut self.project_state.project, bank, pattern, step);
|
|
self.project_state.mark_dirty(edit.bank, edit.pattern);
|
|
if self.editor_ctx.bank == bank
|
|
&& self.editor_ctx.pattern == pattern
|
|
&& self.editor_ctx.step == step
|
|
{
|
|
self.load_step_to_editor();
|
|
}
|
|
self.ui.flash("Step deleted", 150, FlashKind::Success);
|
|
}
|
|
|
|
pub fn delete_steps(&mut self, bank: usize, pattern: usize, steps: &[usize]) {
|
|
let edit = pattern_editor::delete_steps(&mut self.project_state.project, bank, pattern, steps);
|
|
self.project_state.mark_dirty(edit.bank, edit.pattern);
|
|
if self.editor_ctx.bank == bank && self.editor_ctx.pattern == pattern {
|
|
self.load_step_to_editor();
|
|
}
|
|
self.editor_ctx.clear_selection();
|
|
self.ui.flash(
|
|
&format!("{} steps deleted", steps.len()),
|
|
150,
|
|
FlashKind::Success,
|
|
);
|
|
}
|
|
|
|
pub fn reset_pattern(&mut self, bank: usize, pattern: usize) {
|
|
let edit = pattern_editor::reset_pattern(&mut self.project_state.project, bank, pattern);
|
|
self.project_state.mark_dirty(edit.bank, edit.pattern);
|
|
if self.editor_ctx.bank == bank && self.editor_ctx.pattern == pattern {
|
|
self.load_step_to_editor();
|
|
}
|
|
self.ui.flash("Pattern reset", 150, FlashKind::Success);
|
|
}
|
|
|
|
pub fn reset_bank(&mut self, bank: usize) {
|
|
let pat_count = pattern_editor::reset_bank(&mut self.project_state.project, bank);
|
|
for pattern in 0..pat_count {
|
|
self.project_state.mark_dirty(bank, pattern);
|
|
}
|
|
if self.editor_ctx.bank == bank {
|
|
self.load_step_to_editor();
|
|
}
|
|
self.ui.flash("Bank reset", 150, FlashKind::Success);
|
|
}
|
|
|
|
pub fn reset_patterns(&mut self, bank: usize, patterns: &[usize]) {
|
|
for &pattern in patterns {
|
|
let edit =
|
|
pattern_editor::reset_pattern(&mut self.project_state.project, bank, pattern);
|
|
self.project_state.mark_dirty(edit.bank, edit.pattern);
|
|
}
|
|
if self.editor_ctx.bank == bank && patterns.contains(&self.editor_ctx.pattern) {
|
|
self.load_step_to_editor();
|
|
}
|
|
let n = patterns.len();
|
|
self.ui.flash(
|
|
&format!("{n} pattern{} reset", if n == 1 { "" } else { "s" }),
|
|
150,
|
|
FlashKind::Success,
|
|
);
|
|
}
|
|
|
|
pub fn reset_banks(&mut self, banks: &[usize]) {
|
|
for &bank in banks {
|
|
let pat_count =
|
|
pattern_editor::reset_bank(&mut self.project_state.project, bank);
|
|
for pattern in 0..pat_count {
|
|
self.project_state.mark_dirty(bank, pattern);
|
|
}
|
|
}
|
|
if banks.contains(&self.editor_ctx.bank) {
|
|
self.load_step_to_editor();
|
|
}
|
|
let n = banks.len();
|
|
self.ui.flash(
|
|
&format!("{n} bank{} reset", if n == 1 { "" } else { "s" }),
|
|
150,
|
|
FlashKind::Success,
|
|
);
|
|
}
|
|
}
|