This commit is contained in:
2026-03-05 22:14:28 +01:00
parent 77364dddae
commit 04b68850d0
25 changed files with 374 additions and 8447 deletions

View File

@@ -109,24 +109,101 @@ impl App {
self.load_step_to_editor();
}
/// Evaluate the project prelude to seed variables and definitions.
pub fn evaluate_prelude(&mut self, link: &LinkState) {
let prelude = &self.project_state.project.prelude;
/// Switch the editor to the current bank's prelude script.
pub fn open_bank_prelude_editor(&mut self) {
let bank = self.editor_ctx.bank;
let prelude = &self.project_state.project.banks[bank].prelude;
let lines: Vec<String> = if prelude.is_empty() {
vec![String::new()]
} else {
prelude.lines().map(String::from).collect()
};
self.editor_ctx.editor.set_content(lines);
self.editor_ctx.editor.set_candidates(Arc::clone(&COMPLETION_CANDIDATES));
self.editor_ctx
.editor
.set_completion_enabled(self.ui.show_completion);
let tree = SampleTree::from_paths(&self.audio.config.sample_paths);
self.editor_ctx.editor.set_sample_folders(tree.all_folder_names());
self.editor_ctx.target = EditorTarget::BankPrelude;
self.ui.modal = Modal::Editor;
}
pub fn save_bank_prelude(&mut self) {
let bank = self.editor_ctx.bank;
let text = self.editor_ctx.editor.content();
self.project_state.project.banks[bank].prelude = text;
}
pub fn close_bank_prelude_editor(&mut self) {
self.editor_ctx.target = EditorTarget::Step;
self.load_step_to_editor();
}
/// Evaluate a single bank's prelude.
pub fn evaluate_bank_prelude(&mut self, bank: usize, link: &LinkState) {
let prelude = &self.project_state.project.banks[bank].prelude;
if prelude.trim().is_empty() {
return;
}
let ctx = self.create_step_context(0, link);
match self.script_engine.evaluate(prelude, &ctx) {
Ok(_) => {
self.ui.flash("Prelude evaluated", 150, FlashKind::Info);
}
Ok(_) => {}
Err(e) => {
self.ui
.flash(&format!("Prelude error: {e}"), 300, FlashKind::Error);
let fallback = format!("Bank {}", bank + 1);
let bank_name = self.project_state.project.banks[bank]
.name
.as_deref()
.unwrap_or(&fallback);
self.ui.flash(
&format!("{bank_name} prelude error: {e}"),
300,
FlashKind::Error,
);
}
}
}
/// Evaluate the project prelude and all bank preludes.
pub fn evaluate_prelude(&mut self, link: &LinkState) {
let project_prelude = &self.project_state.project.prelude;
if !project_prelude.trim().is_empty() {
let ctx = self.create_step_context(0, link);
match self.script_engine.evaluate(project_prelude, &ctx) {
Ok(_) => {}
Err(e) => {
self.ui
.flash(&format!("Project prelude error: {e}"), 300, FlashKind::Error);
return;
}
}
}
for bank_idx in 0..self.project_state.project.banks.len() {
let prelude = &self.project_state.project.banks[bank_idx].prelude;
if prelude.trim().is_empty() {
continue;
}
let ctx = self.create_step_context(0, link);
match self.script_engine.evaluate(prelude, &ctx) {
Ok(_) => {}
Err(e) => {
let bank_name = self.project_state.project.banks[bank_idx]
.name
.as_deref()
.map(String::from)
.unwrap_or_else(|| format!("Bank {}", bank_idx + 1));
self.ui.flash(
&format!("{bank_name} prelude error: {e}"),
300,
FlashKind::Error,
);
return;
}
}
}
self.ui.flash("Preludes evaluated", 150, FlashKind::Info);
}
/// Evaluate a script and immediately send its audio commands.
/// Returns collected `print` output, if any.
pub fn execute_script_oneshot(