Feat: tweak and fix from last night workshop

This commit is contained in:
2026-02-04 09:37:29 +01:00
parent bbbd8ff64a
commit c95c82169f
9 changed files with 151 additions and 65 deletions

View File

@@ -20,7 +20,7 @@ use crate::settings::Settings;
use crate::state::{
AudioSettings, CyclicEnum, DictFocus, EditorContext, FlashKind, LiveKeyState, Metrics, Modal,
MuteState, OptionsState, PanelState, PatternField, PatternPropsField, PatternsNav,
PlaybackState, ProjectState, StagedChange, UiState,
PlaybackState, ProjectState, StagedChange, StagedPropChange, UiState,
};
use crate::views::{dict_view, help_view};
@@ -499,13 +499,14 @@ impl App {
}
}
/// Commits staged pattern and mute/solo changes.
/// Commits staged pattern, mute/solo, and prop changes.
/// Returns true if mute state changed (caller should send to sequencer).
pub fn commit_staged_changes(&mut self) -> bool {
let pattern_count = self.playback.staged_changes.len();
let mute_count = self.playback.staged_mute_changes.len();
let prop_count = self.playback.staged_prop_changes.len();
if pattern_count == 0 && mute_count == 0 {
if pattern_count == 0 && mute_count == 0 && prop_count == 0 {
self.ui.set_status("No changes to commit".to_string());
return false;
}
@@ -530,11 +531,21 @@ impl App {
}
}
let status = match (pattern_count, mute_count) {
(0, m) => format!("Applied {m} mute/solo changes"),
(p, 0) => format!("Committed {p} pattern changes"),
(p, m) => format!("Committed {p} pattern + {m} mute/solo changes"),
};
// Apply staged prop changes
for ((bank, pattern), props) in self.playback.staged_prop_changes.drain() {
let pat = self.project_state.project.pattern_at_mut(bank, pattern);
pat.name = props.name;
if let Some(len) = props.length {
pat.set_length(len);
}
pat.speed = props.speed;
pat.quantization = props.quantization;
pat.sync_mode = props.sync_mode;
self.project_state.mark_dirty(bank, pattern);
}
let total = pattern_count + mute_count + prop_count;
let status = format!("Committed {total} changes");
self.ui.set_status(status);
mute_changed
@@ -543,19 +554,18 @@ impl App {
pub fn clear_staged_changes(&mut self) {
let pattern_count = self.playback.staged_changes.len();
let mute_count = self.playback.staged_mute_changes.len();
let prop_count = self.playback.staged_prop_changes.len();
if pattern_count == 0 && mute_count == 0 {
if pattern_count == 0 && mute_count == 0 && prop_count == 0 {
return;
}
self.playback.staged_changes.clear();
self.playback.staged_mute_changes.clear();
self.playback.staged_prop_changes.clear();
let status = match (pattern_count, mute_count) {
(0, m) => format!("Cleared {m} staged mute/solo"),
(p, 0) => format!("Cleared {p} staged patterns"),
(p, m) => format!("Cleared {p} patterns + {m} mute/solo"),
};
let total = pattern_count + mute_count + prop_count;
let status = format!("Cleared {total} staged changes");
self.ui.set_status(status);
}
@@ -1189,7 +1199,7 @@ impl App {
AppCommand::OpenPatternPropsModal { bank, pattern } => {
self.open_pattern_props_modal(bank, pattern);
}
AppCommand::SetPatternProps {
AppCommand::StagePatternProps {
bank,
pattern,
name,
@@ -1198,15 +1208,21 @@ impl App {
quantization,
sync_mode,
} => {
let pat = self.project_state.project.pattern_at_mut(bank, pattern);
pat.name = name;
if let Some(len) = length {
pat.set_length(len);
}
pat.speed = speed;
pat.quantization = quantization;
pat.sync_mode = sync_mode;
self.project_state.mark_dirty(bank, pattern);
self.playback.staged_prop_changes.insert(
(bank, pattern),
StagedPropChange {
name,
length,
speed,
quantization,
sync_mode,
},
);
self.ui.set_status(format!(
"B{:02}:P{:02} props staged",
bank + 1,
pattern + 1
));
}
// Page navigation