From 86649ef994eb981c9403f95566ac42f216521566 Mon Sep 17 00:00:00 2001 From: unspeaker Date: Thu, 28 Nov 2024 13:14:47 +0100 Subject: [PATCH] show hotkeys in status bar --- crates/tek_tui/src/tui_app_sequencer.rs | 55 +++++++++++++++----- crates/tek_tui/src/tui_view_phrase_editor.rs | 5 +- crates/tek_tui/src/tui_view_sequencer.rs | 8 ++- 3 files changed, 53 insertions(+), 15 deletions(-) diff --git a/crates/tek_tui/src/tui_app_sequencer.rs b/crates/tek_tui/src/tui_app_sequencer.rs index 93cb4a52..f9098057 100644 --- a/crates/tek_tui/src/tui_app_sequencer.rs +++ b/crates/tek_tui/src/tui_app_sequencer.rs @@ -133,24 +133,55 @@ impl From<&SequencerTui> for SequencerStatusBar { let samples = state.clock.chunk.load(Ordering::Relaxed); let rate = state.clock.current.timebase.sr.get() as f64; let buffer = samples as f64 / rate; + let default_help = &[("", "⏎", " enter"), ("", "✣", " navigate")]; Self { cpu: state.perf.percentage().map(|cpu|format!("│{cpu:.01}%")), size: format!("{}x{}│", state.size.w(), state.size.h()), res: format!("│{}s│{:.1}kHz│{:.1}ms│", samples, rate / 1000., buffer * 1000.), mode: match state.focused() { - Transport(focus) => match focus { - PlayPause => " PLAY/PAUSE ", - Bpm => " TEMPO ", - Sync => " LAUNCH SYNC ", - Quant => " REC QUANT ", - Clock => " SEEK ", - }, - PhraseList => " PHRASES ", - PhraseEditor => " EDIT MIDI ", - PhrasePlay => " TO PLAY ", - PhraseNext => " UP NEXT ", + Transport(PlayPause) => " PLAY/PAUSE ", + Transport(Bpm) => " TEMPO ", + Transport(Sync) => " LAUNCH SYNC ", + Transport(Quant) => " REC QUANT ", + Transport(Clock) => " SEEK ", + PhraseList => " PHRASES ", + PhraseEditor => " EDIT MIDI ", + PhrasePlay => " TO PLAY ", + PhraseNext => " UP NEXT ", }, - help: &[] + help: match state.focused() { + Transport(PlayPause) => &[ + ("", "⏎", " play/pause"), + ("", "✣", " navigate"), + ], + Transport(Bpm) => &[ + ("", ".,", " inc/dec"), + ("", "><", " fine"), + ], + Transport(Sync) => &[ + ("", ".,", " inc/dec"), + ], + Transport(Quant) => &[ + ("", ".,", " inc/dec"), + ], + PhraseList => if state.entered() { + &[ + ("", "↕", " pick"), + ("", ".,", " move"), + ("", "⏎", " play"), + ("", "e", " edit"), + ] + } else { + default_help + } + _ => if state.entered() { + &[ + ("", "Esc", " exit") + ] + } else { + default_help + } + } } } } diff --git a/crates/tek_tui/src/tui_view_phrase_editor.rs b/crates/tek_tui/src/tui_view_phrase_editor.rs index 809a2257..9f9c9bb7 100644 --- a/crates/tek_tui/src/tui_view_phrase_editor.rs +++ b/crates/tek_tui/src/tui_view_phrase_editor.rs @@ -122,10 +122,11 @@ impl<'a> Content for PhraseView<'a> { let piano_roll = row!(keys, note_area).fill_x(); let content = piano_roll.bg(Color::Rgb(40, 50, 30)).border(border); let content = lay!(content, playhead); - let mut upper_left = format!("[{}] Sequencer", if *entered {"■"} else {" "}); + let mut name = "".to_string(); if let Some(phrase) = phrase { - upper_left = format!("{upper_left}: {}", phrase.read().unwrap().name); + name = phrase.read().unwrap().name.clone(); } + let mut upper_left = format!("[{}] {name}", if *entered {"■"} else {" "},); let mut lower_right = format!("┤{}├", size.format()); lower_right = format!("┤Zoom: {}├─{lower_right}", pulses_to_name(time_scale)); //lower_right = format!("Zoom: {} (+{}:{}*{}|{})", diff --git a/crates/tek_tui/src/tui_view_sequencer.rs b/crates/tek_tui/src/tui_view_sequencer.rs index c9e15a3d..a17d5681 100644 --- a/crates/tek_tui/src/tui_view_sequencer.rs +++ b/crates/tek_tui/src/tui_view_sequencer.rs @@ -29,9 +29,15 @@ impl Content for SequencerStatusBar { type Engine = Tui; fn content (&self) -> impl Widget { let orange = Color::Rgb(255,128,0); + let yellow = Color::Rgb(255,255,0); let black = Color::Rgb(0,0,0); lay!( - widget(&self.mode).bg(orange).fg(black).bold(true), + row!( + widget(&self.mode).bg(orange).fg(black).bold(true), + row!((prefix, hotkey, suffix) in self.help => { + row!(" ", *prefix, TuiStyle::fg(*hotkey, yellow), *suffix) + }) + ), row!( widget(&self.cpu).fg(orange), widget(&self.res).fg(orange),