diff --git a/src/app.rs b/src/app.rs index 88a42b1..7d9444d 100644 --- a/src/app.rs +++ b/src/app.rs @@ -21,6 +21,7 @@ pub enum Screen { NewEntry, ReassignProject, LogView, + LogViewHelp, } pub enum LogViewPeriod { @@ -97,6 +98,7 @@ impl App { Screen::NewEntry => self.handle_new_entry_event(event), Screen::ReassignProject => self.handle_reassign_project_event(event), Screen::LogView => self.handle_log_view_event(event), + Screen::LogViewHelp => self.handle_log_view_help_event(event), }; // If we switched screens, signal that we need to clear @@ -246,6 +248,19 @@ impl App { Ok(false) } + fn handle_log_view_help_event(&mut self, event: Event) -> anyhow::Result { + match event { + Event::Key(KeyEvent { code, .. }) => match code { + KeyCode::Esc | KeyCode::Char('q') | KeyCode::Char('?') => { + self.current_screen = Screen::LogView; + } + _ => {} + }, + _ => {} + } + Ok(false) + } + fn handle_reassign_project_event(&mut self, event: Event) -> anyhow::Result { match event { Event::Key(KeyEvent { @@ -299,6 +314,9 @@ impl App { self.log_view_selected = 0; self.needs_clear = true; } + KeyCode::Char('?') => { + self.current_screen = Screen::LogViewHelp; + } KeyCode::Char('d') => { self.log_view_period = LogViewPeriod::Day; self.log_view_scroll = 0; diff --git a/src/ui.rs b/src/ui.rs index 904f4f8..a84bc21 100644 --- a/src/ui.rs +++ b/src/ui.rs @@ -22,6 +22,7 @@ pub fn render(frame: &mut Frame, app: &App) { Screen::NewEntry => render_new_entry(frame, app), Screen::ReassignProject => render_reassign_project(frame, app), Screen::LogView => render_log_view(frame, app), + Screen::LogViewHelp => render_log_view_help(frame, app), } } @@ -568,6 +569,7 @@ fn render_log_view(frame: &mut Frame, app: &App) { ("e", "edit"), ("x", "delete"), ("c", "copy"), + ("?", "help"), ("q/ESC", "back"), ]; @@ -586,3 +588,68 @@ fn render_log_view(frame: &mut Frame, app: &App) { frame.render_widget(command_bar, chunks[1]); } + +fn render_log_view_help(frame: &mut Frame, _app: &App) { + let width = frame.size().width.saturating_sub(4).min(60); + let area = centered_rect(width, frame.size().height.saturating_sub(2), frame.size()); + + frame.render_widget(Clear, area); + + let help_text = vec![ + "Watson Log Viewer Help", + "", + "This view displays your Watson time tracking logs with various options", + "for viewing and managing your tracked time.", + "", + "Time Periods:", + "- d: Switch to Day view (current day)", + "- w: Switch to Week view (current week)", + "- m: Switch to Month view (current month)", + "", + "Grouping:", + "- g: Toggle between grouping by Date or by Project", + " - By Date: Shows all entries chronologically", + " - By Project: Groups entries by project within each date", + "", + "Navigation:", + "- j/k or ↑/↓: Select entries", + "- PageUp/PageDown: Jump 10 entries", + "", + "Actions:", + "- e: Edit the selected entry (opens Watson's editor)", + "- x: Delete the selected entry (no confirmation)", + "- c: Copy all visible log entries to clipboard", + "", + "Other:", + "- ?: Show this help", + "- q or ESC: Return to main screen", + ]; + + let text = help_text.join("\n"); + + let block = Block::default() + .title("Log View Help") + .borders(Borders::ALL) + .style(Style::default().fg(Color::White)); + + let paragraph = Paragraph::new(text) + .block(block) + .style(Style::default().fg(Color::White)) + .wrap(ratatui::widgets::Wrap { trim: true }); + + frame.render_widget(paragraph, area); + + // Render command bar + let bar_area = Rect::new( + 0, + frame.size().height.saturating_sub(1), + frame.size().width, + 1, + ); + + let command_bar = Paragraph::new(" q/ESC/? (back to log view)") + .style(Style::default().fg(Color::White)) + .alignment(Alignment::Left); + + frame.render_widget(command_bar, bar_area); +}