use crate::page::Page; pub fn bindings_for(page: Page) -> Vec<(&'static str, &'static str, &'static str)> { let mut bindings = Vec::new(); // Global bindings bindings.push(("Ctrl+←→↑↓", "Navigate", "Switch between views")); bindings.push(("q", "Quit", "Quit application")); bindings.push(("?", "Keybindings", "Show this help")); // Page-specific bindings match page { Page::Main => { bindings.push(("Space", "Play/Stop", "Toggle playback")); bindings.push(("←→↑↓", "Navigate", "Move cursor between steps")); bindings.push(("Shift+←→↑↓", "Select", "Extend selection")); bindings.push(("Esc", "Clear", "Clear selection")); bindings.push(("Enter", "Edit", "Open step editor")); bindings.push(("t", "Toggle", "Toggle selected steps")); bindings.push(("p", "Preview", "Preview step script")); bindings.push(("Tab", "Samples", "Toggle sample browser")); bindings.push(("Ctrl+C", "Copy", "Copy selected steps")); bindings.push(("Ctrl+V", "Paste", "Paste steps")); bindings.push(("Ctrl+B", "Link", "Paste as linked steps")); bindings.push(("Ctrl+D", "Duplicate", "Duplicate selection")); bindings.push(("Ctrl+H", "Harden", "Convert links to copies")); bindings.push(("Del", "Delete", "Delete step(s)")); bindings.push(("< >", "Length", "Decrease/increase pattern length")); bindings.push(("[ ]", "Speed", "Decrease/increase pattern speed")); bindings.push(("+ -", "Tempo", "Increase/decrease tempo")); bindings.push(("T", "Set tempo", "Open tempo input")); bindings.push(("L", "Set length", "Open length input")); bindings.push(("S", "Set speed", "Open speed input")); bindings.push(("s", "Save", "Save project")); bindings.push(("l", "Load", "Load project")); bindings.push(("f", "Fill", "Toggle fill mode (hold)")); bindings.push(("r", "Rename", "Rename current step")); bindings.push(("Ctrl+R", "Run", "Run step script immediately")); bindings.push(("e", "Euclidean", "Distribute linked steps using Euclidean rhythm")); bindings.push(("m", "Mute", "Stage mute for current pattern")); bindings.push(("x", "Solo", "Stage solo for current pattern")); bindings.push(("M", "Clear mutes", "Clear all mutes")); bindings.push(("X", "Clear solos", "Clear all solos")); bindings.push(("d", "Prelude", "Edit prelude script")); bindings.push(("D", "Eval prelude", "Re-evaluate prelude without editing")); } Page::Patterns => { bindings.push(("←→↑↓", "Navigate", "Move between banks/patterns")); bindings.push(("Enter", "Select", "Select pattern for editing")); bindings.push(("Space", "Play", "Toggle pattern playback")); bindings.push(("Esc", "Back", "Clear staged or go back")); bindings.push(("c", "Commit", "Commit staged changes")); bindings.push(("r", "Rename", "Rename bank/pattern")); bindings.push(("e", "Properties", "Edit pattern properties")); bindings.push(("m", "Mute", "Stage mute for pattern")); bindings.push(("x", "Solo", "Stage solo for pattern")); bindings.push(("M", "Clear mutes", "Clear all mutes")); bindings.push(("X", "Clear solos", "Clear all solos")); bindings.push(("Ctrl+C", "Copy", "Copy bank/pattern")); bindings.push(("Ctrl+V", "Paste", "Paste bank/pattern")); bindings.push(("Del", "Reset", "Reset bank/pattern")); } Page::Engine => { bindings.push(("Tab", "Section", "Next section")); bindings.push(("Shift+Tab", "Section", "Previous section")); bindings.push(("←→", "Switch", "Switch device type or adjust setting")); bindings.push(("↑↓", "Navigate", "Navigate list items")); bindings.push(("PgUp/Dn", "Page", "Page through device list")); bindings.push(("Enter", "Select", "Select device")); bindings.push(("R", "Restart", "Restart audio engine")); bindings.push(("A", "Add path", "Add sample path")); bindings.push(("D", "Refresh/Del", "Refresh devices or delete path")); bindings.push(("h", "Hush", "Stop all sounds gracefully")); bindings.push(("p", "Panic", "Stop all sounds immediately")); bindings.push(("r", "Reset", "Reset peak voice counter")); bindings.push(("t", "Test", "Play test tone")); } Page::Options => { bindings.push(("Tab", "Next", "Move to next option")); bindings.push(("Shift+Tab", "Previous", "Move to previous option")); bindings.push(("↑↓", "Navigate", "Navigate options")); bindings.push(("←→", "Toggle", "Toggle or adjust option")); bindings.push(("Space", "Play/Stop", "Toggle playback")); } Page::Help => { bindings.push(("↑↓ j/k", "Scroll", "Scroll content")); bindings.push(("Tab", "Topic", "Next topic")); bindings.push(("Shift+Tab", "Topic", "Previous topic")); bindings.push(("PgUp/Dn", "Page", "Page scroll")); bindings.push(("/", "Search", "Activate search")); bindings.push(("Esc", "Clear", "Clear search")); } Page::Dict => { bindings.push(("Tab", "Focus", "Toggle category/words focus")); bindings.push(("↑↓ j/k", "Navigate", "Navigate items")); bindings.push(("PgUp/Dn", "Page", "Page scroll")); bindings.push(("/", "Search", "Activate search")); bindings.push(("Ctrl+F", "Search", "Activate search")); bindings.push(("Esc", "Clear", "Clear search")); } } bindings }