diff --git a/src/main.rs b/src/main.rs index f418eb54..db8cddb6 100644 --- a/src/main.rs +++ b/src/main.rs @@ -174,7 +174,8 @@ const KEYMAP: &'static [KeyBinding] = keymap!(App { [Char(','), NONE, "decrement", "decrement value at cursor", decrement], [Delete, CONTROL, "delete", "delete track", delete], [Char('d'), CONTROL, "duplicate", "duplicate scene or track", duplicate], - [Enter, NONE, "activate", "activate item at cursor", activate], + [Enter, NONE, "activate", "activate item at cursor", enter], + [Esc, NONE, "escape", "unfocus", escape], [Char(' '), NONE, "play_toggle", "play or pause", play_toggle], [Char('r'), NONE, "record_toggle", "toggle recording", record_toggle], [Char('d'), NONE, "overdub_toggle", "toggle overdub", overdub_toggle], @@ -211,33 +212,45 @@ fn focus_prev (app: &mut App) -> Usually { Ok(true) } fn cursor_up (app: &mut App) -> Usually { - focus_prev(app) + if app.entered { + match app.section { + 0 => match app.grid_mode { + false => {app.scene_cursor = app.scene_cursor.saturating_sub(1); Ok(true)}, + true => {app.track_cursor = app.track_cursor.saturating_sub(1); Ok(true)}, + }, + _ => Ok(false) + } + } else { + focus_prev(app) + } } fn cursor_down (app: &mut App) -> Usually { - focus_next(app) + if app.entered { + match app.section { + 0 => match app.grid_mode { + false => {app.scene_cursor = app.scenes.len().min(app.scene_cursor + 1); Ok(true)}, + true => {app.track_cursor = app.tracks.len().min(app.track_cursor + 1); Ok(true)}, + }, + _ => Ok(false) + } + } else { + focus_next(app) + } } fn cursor_left (app: &mut App) -> Usually { match app.section { - 0 => { - app.track_cursor = if app.track_cursor == 0 { - app.tracks.len() - } else { - app.track_cursor - } - 1; - Ok(true) - } + 0 => match app.grid_mode { + false => {app.track_cursor = app.track_cursor.saturating_sub(1); Ok(true)}, + true => {app.scene_cursor = app.scene_cursor.saturating_sub(1); Ok(true)}, + }, _ => Ok(false) } } fn cursor_right (app: &mut App) -> Usually { match app.section { - 0 => { - app.track_cursor = if app.track_cursor >= app.tracks.len() { - 0 - } else { - app.track_cursor + 1 - }; - Ok(true) + 0 => match app.grid_mode { + false => {app.track_cursor = app.tracks.len().min(app.track_cursor + 1); Ok(true)}, + true => {app.scene_cursor = app.scenes.len().min(app.scene_cursor + 1); Ok(true)}, }, _ => Ok(false) } @@ -261,18 +274,36 @@ fn delete (app: &mut App) -> Usually { } } fn duplicate (_: &mut App) -> Usually { Ok(true) } -fn activate (_: &mut App) -> Usually { Ok(true) } +fn enter (app: &mut App) -> Usually { + if app.entered { + activate(app) + } else { + app.entered = true; + Ok(true) + } +} +fn activate (_: &mut App) -> Usually { + Ok(true) +} +fn escape (app: &mut App) -> Usually { + if app.entered { + app.entered = false; + Ok(true) + } else { + Ok(false) + } +} fn rename (_: &mut App) -> Usually { Ok(true) } fn add_scene (app: &mut App) -> Usually { let name = format!("Scene {}", app.scenes.len() + 1); app.scenes.push(Scene::new(&name, vec![])); - app.scene_cursor = app.scenes.len() - 1; + app.scene_cursor = app.scenes.len(); Ok(true) } fn add_track (app: &mut App) -> Usually { let name = format!("Track {}", app.tracks.len() + 1); app.tracks.push(Track::new(&name, app.jack.as_ref().unwrap().as_client(), &app.timebase, None, None)?); - app.track_cursor = app.tracks.len() - 1; + app.track_cursor = app.tracks.len(); Ok(true) } fn delete_track (app: &mut App) -> Usually {