diff --git a/rq-cli/src/app.rs b/rq-cli/src/app.rs index 6c77811..5b8d232 100644 --- a/rq-cli/src/app.rs +++ b/rq-cli/src/app.rs @@ -1,4 +1,5 @@ use std::collections::VecDeque; +use std::fmt::Write; use anyhow::anyhow; use ratatui::{ @@ -16,8 +17,8 @@ use crossterm::event::{KeyCode, KeyEvent, KeyModifiers}; use crate::{ components::{ - legend::Legend, menu::Menu, message_dialog::MessageDialog, popup::Popup, - response_panel::ResponsePanel, variables::panel::VarsPanel, BlockComponent, HandleSuccess, + menu::Menu, message_dialog::MessageDialog, popup::Popup, response_panel::ResponsePanel, + variables::panel::VarsPanel, BlockComponent, HandleSuccess, }, event::{Event, Message}, }; @@ -130,57 +131,61 @@ impl App { self.should_exit = true; } KeyCode::Char('v') => Event::emit(Event::Focus(FocusState::VarsPanel)), + KeyCode::Char('?') => Event::emit(Event::Message(Message::Custom( + "keymaps".into(), + self.keymaps() + "\nPress any key to close", + ))), _ => (), }; Ok(()) } - pub fn draw(&self, f: &mut crate::terminal::Frame<'_>) { - let [main_chunk, legend_chunk] = { - let x = Layout::default() - .direction(Direction::Vertical) - .constraints([Constraint::Min(1), Constraint::Length(1)]) - .split(f.size()); - - [x[0], x[1]] + fn keymaps(&self) -> String { + let keymaps = match self.focus { + FocusState::RequestsList => Self::KEYMAPS.iter().chain(self.request_menu.keymaps()), + FocusState::ResponsePanel => Self::KEYMAPS.iter().chain(self.responses[0].keymaps()), + FocusState::VarsPanel => Self::KEYMAPS.iter().chain(self.vars_panel.keymaps()), }; - // Create two chunks with equal screen space - let [mut list_chunk, response_chunk] = { - let x = Layout::default() - .direction(Direction::Horizontal) - .constraints([Constraint::Percentage(50), Constraint::Percentage(50)]) - .split(main_chunk); - - [x[0], x[1]] - }; + keymaps.fold(String::new(), |mut s, (k, v)| { + let _ = writeln!(s, "{k}: {v}"); + s + }) + } - let (list_border_style, response_border_style, vars_border_style, legend) = match self.focus - { + pub fn draw(&self, f: &mut crate::terminal::Frame<'_>) { + let (list_border_style, response_border_style, vars_border_style) = match self.focus { FocusState::RequestsList => ( Style::default().fg(Color::Blue), Style::default(), Style::default(), - Legend::new(Self::KEYMAPS.iter().chain(self.request_menu.keymaps())), ), FocusState::ResponsePanel => ( Style::default(), Style::default().fg(Color::Blue), Style::default(), - Legend::new(Self::KEYMAPS.iter().chain(self.responses[0].keymaps())), ), FocusState::VarsPanel => ( Style::default(), Style::default(), Style::default().fg(Color::Blue), - Legend::new(Self::KEYMAPS.iter().chain(self.vars_panel.keymaps())), ), }; + // Create two chunks with equal screen space + let [mut list_chunk, response_chunk] = { + let x = Layout::default() + .direction(Direction::Horizontal) + .constraints([Constraint::Percentage(50), Constraint::Percentage(50)]) + .split(f.size()); + + [x[0], x[1]] + }; + let list_block = Block::default() .borders(Borders::ALL) - .title(format!(">> {} <<", self.file_path.as_str())) + .title(format!(" {} ", self.file_path.as_str())) .border_style(list_border_style); let response_block = Block::default() @@ -209,7 +214,6 @@ impl App { self.request_menu.render(f, list_chunk, list_block); let response_panel = &self.responses[self.request_menu.idx()]; response_panel.render(f, response_chunk, response_block); - legend.render(f, legend_chunk, Block::default()); if let Some(popup) = self.popups.front() { popup.render(f, f.size(), Block::default().borders(Borders::ALL)); diff --git a/rq-cli/src/components/legend.rs b/rq-cli/src/components/legend.rs deleted file mode 100644 index cc65297..0000000 --- a/rq-cli/src/components/legend.rs +++ /dev/null @@ -1,47 +0,0 @@ -use ratatui::{ - style::{Modifier, Style}, - text::{Line, Span}, - widgets::Paragraph, -}; - -use super::BlockComponent; - -#[derive(Clone)] -pub struct Legend { - keymaps: Vec<&'static (&'static str, &'static str)>, -} - -impl Legend { - pub fn new>(keymaps: I) -> Self { - Self { - keymaps: keymaps.collect(), - } - } -} - -impl BlockComponent for Legend { - fn render( - &self, - frame: &mut crate::terminal::Frame, - area: ratatui::prelude::Rect, - block: ratatui::widgets::Block, - ) { - let spans = self - .keymaps - .iter() - .flat_map(|(k, v)| { - [ - Span::styled( - format!(" {k} "), - Style::default().add_modifier(Modifier::REVERSED), - ), - Span::from(format!(" {v} ")), - ] - }) - .collect::>(); - - let p = Paragraph::new(Line::from(spans)); - - frame.render_widget(p.block(block), area); - } -} diff --git a/rq-cli/src/components/message_dialog.rs b/rq-cli/src/components/message_dialog.rs index 01d62f1..7abbefb 100644 --- a/rq-cli/src/components/message_dialog.rs +++ b/rq-cli/src/components/message_dialog.rs @@ -14,6 +14,10 @@ impl MessageDialog { pub fn new(message: Message) -> Self { Self { content: message } } + + fn format_title(title: &str) -> String { + format!(" {title} ") + } } impl BlockComponent for MessageDialog { @@ -34,8 +38,11 @@ impl BlockComponent for MessageDialog { block: ratatui::widgets::Block, ) { let (content, title, color) = match &self.content { - Message::Info(content) => (content.as_str(), " info ", Color::Green), - Message::Error(content) => (content.as_str(), " error ", Color::Red), + Message::Info(content) => (content.as_str(), Self::format_title("info"), Color::Green), + Message::Error(content) => (content.as_str(), Self::format_title("error"), Color::Red), + Message::Custom(title, content) => { + (content.as_str(), Self::format_title(title), Color::Green) + } }; let p = Paragraph::new(content) diff --git a/rq-cli/src/components/mod.rs b/rq-cli/src/components/mod.rs index 9fdca17..8f6fba8 100644 --- a/rq-cli/src/components/mod.rs +++ b/rq-cli/src/components/mod.rs @@ -4,7 +4,6 @@ use ratatui::{prelude::Rect, widgets::Block}; use crate::terminal::Frame; pub mod input; -pub mod legend; pub mod menu; pub mod message_dialog; pub mod popup; diff --git a/rq-cli/src/components/popup.rs b/rq-cli/src/components/popup.rs index 33f749b..b2784a9 100644 --- a/rq-cli/src/components/popup.rs +++ b/rq-cli/src/components/popup.rs @@ -1,9 +1,9 @@ use ratatui::{ prelude::{Constraint, Direction, Layout, Rect}, - widgets::{Block, Clear}, + widgets::Clear, }; -use super::{legend::Legend, BlockComponent}; +use super::BlockComponent; pub struct Popup { component: T, @@ -55,16 +55,6 @@ impl BlockComponent for Popup { frame.render_widget(Clear, popup_area); - let [popup_area, legend_area] = { - let x = Layout::default() - .direction(Direction::Vertical) - .constraints([Constraint::Min(1), Constraint::Length(1)]) - .split(popup_area); - - [x[0], x[1]] - }; - self.component.render(frame, popup_area, block); - Legend::new(self.component.keymaps().iter()).render(frame, legend_area, Block::default()); } } diff --git a/rq-cli/src/event.rs b/rq-cli/src/event.rs index c113a78..35bd0d5 100644 --- a/rq-cli/src/event.rs +++ b/rq-cli/src/event.rs @@ -32,6 +32,7 @@ pub enum Event { pub enum Message { Info(String), Error(String), + Custom(String, String), } impl Event {