aboutsummaryrefslogtreecommitdiff
path: root/src/ui/menus.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/ui/menus.rs')
-rw-r--r--src/ui/menus.rs65
1 files changed, 56 insertions, 9 deletions
diff --git a/src/ui/menus.rs b/src/ui/menus.rs
index 7a074c68..d17aa897 100644
--- a/src/ui/menus.rs
+++ b/src/ui/menus.rs
@@ -9,6 +9,12 @@ use ratatui::{
use super::widgets::{panel_contrast_fg, render_panel_shell};
use crate::app::AppState;
+fn prefix_rhs_label(bindings: &crate::config::ActionKeybinds) -> String {
+ bindings
+ .prefix_rhs_label()
+ .unwrap_or_else(|| "unset".to_string())
+}
+
fn render_bottom_bar(frame: &mut Frame, area: Rect, line: Line<'_>, bg: ratatui::style::Color) {
frame.render_widget(Clear, area);
let buf = frame.buffer_mut();
@@ -18,6 +24,38 @@ fn render_bottom_bar(frame: &mut Frame, area: Rect, line: Line<'_>, bg: ratatui:
frame.render_widget(Paragraph::new(line), area);
}
+pub(super) fn render_prefix_overlay(app: &AppState, frame: &mut Frame, area: Rect) {
+ let key = Style::default()
+ .fg(app.palette.accent)
+ .add_modifier(Modifier::BOLD);
+ let dim = Style::default().fg(app.palette.overlay0);
+ let mode_style = Style::default()
+ .fg(panel_contrast_fg(&app.palette))
+ .bg(app.palette.accent)
+ .add_modifier(Modifier::BOLD);
+
+ let workspace_picker = prefix_rhs_label(&app.keybinds.workspace_picker);
+ let help = prefix_rhs_label(&app.keybinds.help);
+ let prefix = crate::config::format_key_combo((app.prefix_code, app.prefix_mods));
+
+ let line = Line::from(vec![
+ Span::styled(" PREFIX ", mode_style),
+ Span::raw(" "),
+ Span::styled("esc", key),
+ Span::styled(" cancel ", dim),
+ Span::styled(prefix, key),
+ Span::styled(" send prefix ", dim),
+ Span::styled(workspace_picker, key),
+ Span::styled(" workspace nav ", dim),
+ Span::styled(help, key),
+ Span::styled(" keybinds", dim),
+ ]);
+
+ let overlay_y = area.y + area.height.saturating_sub(1);
+ let overlay_area = Rect::new(area.x, overlay_y, area.width, 1);
+ render_bottom_bar(frame, overlay_area, line, app.palette.panel_bg);
+}
+
pub(super) fn render_navigate_overlay(app: &AppState, frame: &mut Frame, area: Rect) {
let key = Style::default()
.fg(app.palette.accent)
@@ -30,6 +68,15 @@ pub(super) fn render_navigate_overlay(app: &AppState, frame: &mut Frame, area: R
.add_modifier(Modifier::BOLD);
let kb = &app.keybinds;
+ let new_tab = prefix_rhs_label(&kb.new_tab);
+ let split_vertical = prefix_rhs_label(&kb.split_vertical);
+ let split_horizontal = prefix_rhs_label(&kb.split_horizontal);
+ let close_pane = prefix_rhs_label(&kb.close_pane);
+ let zoom = prefix_rhs_label(&kb.zoom);
+ let resize = prefix_rhs_label(&kb.resize_mode);
+ let help = prefix_rhs_label(&kb.help);
+ let settings = prefix_rhs_label(&kb.settings);
+ let quit = prefix_rhs_label(&kb.quit);
let line = Line::from(vec![
Span::styled(" NAVIGATE ", mode_style),
Span::raw(" "),
@@ -39,23 +86,23 @@ pub(super) fn render_navigate_overlay(app: &AppState, frame: &mut Frame, area: R
Span::styled(" ws ", dim),
Span::styled("⇥", key),
Span::styled(" pane ", dim),
- Span::styled(kb.new_tab_label.as_str(), key),
+ Span::styled(new_tab, key),
Span::styled(" new tab ", dim),
- Span::styled(kb.split_vertical_label.as_str(), key),
+ Span::styled(split_vertical, key),
Span::styled(" split│ ", dim),
- Span::styled(kb.split_horizontal_label.as_str(), key),
+ Span::styled(split_horizontal, key),
Span::styled(" split─ ", dim),
- Span::styled(kb.close_pane_label.as_str(), key),
+ Span::styled(close_pane, key),
Span::styled(" close ", dim),
- Span::styled(kb.zoom_label.as_str(), key),
+ Span::styled(zoom, key),
Span::styled(" zoom ", dim),
- Span::styled(kb.resize_mode_label.as_str(), key),
+ Span::styled(resize, key),
Span::styled(" resize ", dim),
- Span::styled("?", key),
+ Span::styled(help, key),
Span::styled(" keybinds ", dim),
- Span::styled("s", key),
+ Span::styled(settings, key),
Span::styled(" settings ", dim),
- Span::styled("q", key),
+ Span::styled(quit, key),
Span::styled(" quit", dim),
]);