Skip to content

Commit 518944b

Browse files
committed
chore: hint using termcfg
1 parent e1a2f28 commit 518944b

1 file changed

Lines changed: 53 additions & 7 deletions

File tree

src/sig.rs

Lines changed: 53 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
1-
use std::{collections::VecDeque, sync::Arc};
1+
use std::{
2+
collections::{HashSet, VecDeque},
3+
sync::Arc,
4+
};
25

36
use tokio::{
47
sync::{mpsc, watch, RwLock},
@@ -16,6 +19,7 @@ use promkit_core::{
1619
PaneFactory,
1720
};
1821
use promkit_widgets::{text, text_editor};
22+
use termcfg::event::{event_def::EventDef, format::event_to_shortcut};
1923

2024
use crate::{
2125
config::{matches_keybind, StreamingKeybinds},
@@ -32,6 +36,33 @@ enum InputAction {
3236
GotoStreaming,
3337
}
3438

39+
#[derive(Clone)]
40+
struct HintKeybindLabels {
41+
archived: String,
42+
pause_resume: String,
43+
retry: Option<String>,
44+
exit: String,
45+
}
46+
47+
fn format_keybinds(events: &HashSet<Event>) -> String {
48+
let mut labels = events
49+
.iter()
50+
.filter_map(|event| EventDef::try_from(event).ok().map(event_to_shortcut))
51+
.collect::<Vec<String>>();
52+
labels.sort();
53+
labels.dedup();
54+
labels.join("/")
55+
}
56+
57+
fn create_hint_keybind_labels(keybinds: &StreamingKeybinds, has_cmd: bool) -> HintKeybindLabels {
58+
HintKeybindLabels {
59+
archived: format_keybinds(&keybinds.goto_archived),
60+
pause_resume: format_keybinds(&keybinds.toggle_pause),
61+
retry: has_cmd.then(|| format_keybinds(&keybinds.retry)),
62+
exit: format_keybinds(&keybinds.exit),
63+
}
64+
}
65+
3566
// Evaluate a key event and return the corresponding InputAction.
3667
fn evaluate_event(
3768
event: &Event,
@@ -108,10 +139,22 @@ fn evaluate_event(
108139
Ok(InputAction::Continue)
109140
}
110141

111-
fn create_panes(text_editor: &text_editor::State, size: (u16, u16), has_cmd: bool) -> Vec<Pane> {
112-
let retry_hint = if has_cmd { " | Retry" } else { "" };
142+
fn create_panes(
143+
text_editor: &text_editor::State,
144+
size: (u16, u16),
145+
paused: bool,
146+
keybind_labels: &HintKeybindLabels,
147+
) -> Vec<Pane> {
148+
let badge = if paused { "[PAUSED]" } else { "[RUNNING]" };
149+
let retry_hint = match &keybind_labels.retry {
150+
Some(retry) => format!(" | Retry({retry})"),
151+
None => String::new(),
152+
};
113153
let hint = text::State {
114-
text: text::Text::from(format!("Archived | Pause/Resume{} | Exit", retry_hint)),
154+
text: text::Text::from(format!(
155+
"{badge} Archived({}) | Pause/Resume({}){} | Exit({})",
156+
keybind_labels.archived, keybind_labels.pause_resume, retry_hint, keybind_labels.exit
157+
)),
115158
config: text::Config {
116159
style: Some(ContentStyle {
117160
foreground_color: Some(Color::DarkGrey),
@@ -140,8 +183,9 @@ pub async fn run(
140183
) -> anyhow::Result<(Signal, VecDeque<String>)> {
141184
let size = crossterm::terminal::size()?;
142185
let has_cmd = cmd.is_some();
186+
let keybind_labels = create_hint_keybind_labels(&keybinds, has_cmd);
143187

144-
let panes = create_panes(&text_editor, size, has_cmd);
188+
let panes = create_panes(&text_editor, size, false, &keybind_labels);
145189
let term = Terminal::try_new(size, &panes)?;
146190
term.draw_pane(&panes)?;
147191

@@ -150,6 +194,7 @@ pub async fn run(
150194
let readonly_term = Arc::clone(&shared_term);
151195
let readonly_text_editor = Arc::clone(&shared_text_editor);
152196
let (pause_tx, mut pause_rx) = watch::channel(false);
197+
let keybind_labels_for_task = keybind_labels.clone();
153198

154199
let (tx, mut rx) = mpsc::channel(1);
155200

@@ -233,7 +278,8 @@ pub async fn run(
233278
case_insensitive,
234279
) {
235280
let matrix = highlighted.matrixify(size.0 as usize, size.1 as usize, 0).0;
236-
let panes = create_panes(&text_editor, size, has_cmd);
281+
let panes =
282+
create_panes(&text_editor, size, paused, &keybind_labels_for_task);
237283
let mut term = readonly_term.write().await;
238284
let pane_rows = Terminal::pane_rows(size, &panes);
239285
if term.sync_layout(size, pane_rows)? {
@@ -275,7 +321,7 @@ pub async fn run(
275321
}
276322

277323
let size = crossterm::terminal::size()?;
278-
let panes = create_panes(&text_editor, size, has_cmd);
324+
let panes = create_panes(&text_editor, size, paused, &keybind_labels);
279325
let mut term = shared_term.write().await;
280326
term.sync_layout(size, Terminal::pane_rows(size, &panes))?;
281327
term.draw_pane(&panes)?;

0 commit comments

Comments
 (0)