From e7c4bc4f9db60387d9d70059845e198c25d1aa64 Mon Sep 17 00:00:00 2001 From: Dheepak Krishnamurthy Date: Tue, 6 Apr 2021 06:03:45 -0600 Subject: [PATCH] Jump to task --- docs/keybindings.md | 2 ++ docs/taskwarrior-tui.1.md | 3 +++ src/app.rs | 50 ++++++++++++++++++++++++++++++++++++++- 3 files changed, 54 insertions(+), 1 deletion(-) diff --git a/docs/keybindings.md b/docs/keybindings.md index 55e8b0b..91f56c0 100644 --- a/docs/keybindings.md +++ b/docs/keybindings.md @@ -59,6 +59,8 @@ Keybindings for task report: 1-9: {string} - Run user defined shortcuts + :: {task id} - Jump to task id + c: context switcher menu - Open context switcher menu ?: help - Help menu diff --git a/docs/taskwarrior-tui.1.md b/docs/taskwarrior-tui.1.md index 87f6cea..4fde460 100644 --- a/docs/taskwarrior-tui.1.md +++ b/docs/taskwarrior-tui.1.md @@ -119,6 +119,9 @@ Ctrl-y `1-9` : {string} - Run user defined shortcuts +`:` +: {task id} - Jump to task id + `c` : context switcher menu - Open context switcher menu diff --git a/src/app.rs b/src/app.rs index 0f95f37..44c248b 100644 --- a/src/app.rs +++ b/src/app.rs @@ -34,7 +34,7 @@ use unicode_segmentation::UnicodeSegmentation; use chrono::{Datelike, Local, NaiveDate, NaiveDateTime, TimeZone, Timelike}; use anyhow::Context as AnyhowContext; -use anyhow::Result; +use anyhow::{anyhow, Result}; use async_std::prelude::*; use async_std::stream::StreamExt; @@ -159,6 +159,7 @@ pub enum AppMode { TaskHelpPopup, TaskError, TaskContextMenu, + TaskJump, Calendar, } @@ -298,6 +299,7 @@ impl TaskwarriorTuiApp { self.terminal_height = rect.height; match self.mode { AppMode::TaskReport + | AppMode::TaskJump | AppMode::TaskFilter | AppMode::TaskAdd | AppMode::TaskAnnotate @@ -419,6 +421,17 @@ impl TaskwarriorTuiApp { self.get_position(&self.filter), false, ), + AppMode::TaskJump => { + let position = self.get_position(&self.command); + self.draw_command( + f, + rects[1], + self.command.as_str(), + Span::styled("Jump to Task", Style::default().add_modifier(Modifier::BOLD)), + position, + true, + ); + } AppMode::TaskFilter => { let position = self.get_position(&self.filter); if self.show_completion_pane { @@ -1205,6 +1218,20 @@ impl TaskwarriorTuiApp { self.current_selection = i; } + pub fn task_report_jump(&mut self) -> Result<()> { + if self.tasks.is_empty() { + return Ok(()); + } + let i = self.command.as_str().parse::()?; + if let Some(task) = self.task_by_id(i as u64) { + let i = self.task_index_by_uuid(*task.uuid()).unwrap(); + self.current_selection = i; + Ok(()) + } else { + Err(anyhow!("Cannot locate task id {} in report", i)) + } + } + pub fn export_contexts(&mut self) -> Result<()> { let output = Command::new("task").arg("context").output()?; let data = String::from_utf8_lossy(&output.stdout); @@ -1989,6 +2016,8 @@ impl TaskwarriorTuiApp { } else if input == self.keyconfig.filter { self.mode = AppMode::TaskFilter; self.update_completion_list(); + } else if input == Key::Char(':') { + self.mode = AppMode::TaskJump; } else if input == self.keyconfig.shortcut1 { match self.task_shortcut(1) { Ok(_) => self.update(true)?, @@ -2284,6 +2313,25 @@ impl TaskwarriorTuiApp { } _ => handle_movement(&mut self.command, input), }, + AppMode::TaskJump => match input { + Key::Char('\n') => match self.task_report_jump() { + Ok(_) => { + self.mode = AppMode::TaskReport; + self.command.update("", 0); + self.update(true)?; + } + Err(e) => { + self.command.update("", 0); + self.mode = AppMode::TaskError; + self.error = e.to_string(); + } + }, + Key::Esc => { + self.command.update("", 0); + self.mode = AppMode::TaskReport; + } + _ => handle_movement(&mut self.command, input), + }, AppMode::TaskAdd => match input { Key::Esc => { if self.show_completion_pane {