mirror of
https://github.com/kdheepak/taskwarrior-tui.git
synced 2025-08-26 03:07:18 +02:00
Support annotations
This commit is contained in:
parent
28ea95d602
commit
73ffc9d026
2 changed files with 90 additions and 1 deletions
44
src/app.rs
44
src/app.rs
|
@ -115,6 +115,7 @@ pub enum AppMode {
|
|||
Report,
|
||||
Filter,
|
||||
AddTask,
|
||||
AnnotateTask,
|
||||
LogTask,
|
||||
ModifyTask,
|
||||
HelpPopup,
|
||||
|
@ -201,6 +202,10 @@ impl TTApp {
|
|||
.split(rects[0]);
|
||||
self.draw_task_report(f, task_rects[0]);
|
||||
self.draw_task_details(f, task_rects[1]);
|
||||
let selected = self.state.selected().unwrap_or_default();
|
||||
let task_id = self.tasks.lock().unwrap()[selected]
|
||||
.id()
|
||||
.unwrap_or_default();
|
||||
match self.mode {
|
||||
AppMode::Report => self.draw_command(f, rects[1], &self.filter[..], "Filter Tasks"),
|
||||
AppMode::Filter => {
|
||||
|
@ -211,13 +216,18 @@ impl TTApp {
|
|||
AppMode::ModifyTask => {
|
||||
f.set_cursor(rects[1].x + self.cursor_location as u16 + 1, rects[1].y + 1);
|
||||
f.render_widget(Clear, rects[1]);
|
||||
self.draw_command(f, rects[1], &self.modify[..], "Modify Task");
|
||||
self.draw_command(f, rects[1], &self.modify[..], format!("Modify Task {}", task_id).as_str());
|
||||
}
|
||||
AppMode::LogTask => {
|
||||
f.set_cursor(rects[1].x + self.cursor_location as u16 + 1, rects[1].y + 1);
|
||||
f.render_widget(Clear, rects[1]);
|
||||
self.draw_command(f, rects[1], &self.command[..], "Log Task");
|
||||
}
|
||||
AppMode::AnnotateTask => {
|
||||
f.set_cursor(rects[1].x + self.cursor_location as u16 + 1, rects[1].y + 1);
|
||||
f.render_widget(Clear, rects[1]);
|
||||
self.draw_command(f, rects[1], &self.command[..], format!("Annotate Task {}", task_id).as_str());
|
||||
}
|
||||
AppMode::AddTask => {
|
||||
f.set_cursor(rects[1].x + self.cursor_location as u16 + 1, rects[1].y + 1);
|
||||
f.render_widget(Clear, rects[1]);
|
||||
|
@ -753,6 +763,38 @@ impl TTApp {
|
|||
}
|
||||
}
|
||||
|
||||
pub fn task_annotate(&mut self) -> Result<(), String> {
|
||||
if self.tasks.lock().unwrap().is_empty() {
|
||||
return Ok(());
|
||||
}
|
||||
let selected = self.state.selected().unwrap_or_default();
|
||||
let task_id = self.tasks.lock().unwrap()[selected]
|
||||
.id()
|
||||
.unwrap_or_default();
|
||||
let mut command = Command::new("task");
|
||||
command.arg(format!("{}", task_id)).arg("annotate");
|
||||
|
||||
match shlex::split(&self.command) {
|
||||
Some(cmd) => {
|
||||
for s in cmd {
|
||||
command.arg(&s);
|
||||
}
|
||||
let output = command.output();
|
||||
match output {
|
||||
Ok(_) => {
|
||||
self.command = "".to_string();
|
||||
Ok(())
|
||||
}
|
||||
Err(_) => Err(
|
||||
"Cannot run `task annotate`. Check documentation for more information"
|
||||
.to_string(),
|
||||
),
|
||||
}
|
||||
}
|
||||
None => Err(format!("Unable to run `task add` with `{}`", &self.command)),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn task_add(&mut self) -> Result<(), String> {
|
||||
let mut command = Command::new("task");
|
||||
command.arg("add");
|
||||
|
|
47
src/main.rs
47
src/main.rs
|
@ -117,6 +117,10 @@ fn tui_main(_config: &str) -> Result<(), Box<dyn Error>> {
|
|||
app.mode = AppMode::AddTask;
|
||||
app.cursor_location = app.command.chars().count();
|
||||
}
|
||||
Key::Char('A') => {
|
||||
app.mode = AppMode::AnnotateTask;
|
||||
app.cursor_location = app.command.chars().count();
|
||||
}
|
||||
Key::Char('?') => {
|
||||
app.mode = AppMode::HelpPopup;
|
||||
}
|
||||
|
@ -218,6 +222,49 @@ fn tui_main(_config: &str) -> Result<(), Box<dyn Error>> {
|
|||
}
|
||||
_ => {}
|
||||
},
|
||||
AppMode::AnnotateTask => match input {
|
||||
Key::Char('\n') => match app.task_annotate() {
|
||||
Ok(_) => {
|
||||
app.mode = AppMode::Report;
|
||||
app.update();
|
||||
}
|
||||
Err(e) => {
|
||||
app.mode = AppMode::TaskError;
|
||||
app.error = e;
|
||||
}
|
||||
},
|
||||
Key::Esc => {
|
||||
app.command = "".to_string();
|
||||
app.mode = AppMode::Report;
|
||||
}
|
||||
Key::Right => {
|
||||
if app.cursor_location < app.command.chars().count() {
|
||||
app.cursor_location += 1;
|
||||
}
|
||||
}
|
||||
Key::Left => {
|
||||
if app.cursor_location > 0 {
|
||||
app.cursor_location -= 1;
|
||||
}
|
||||
}
|
||||
Key::Char(c) => {
|
||||
if app.cursor_location < app.command.chars().count() {
|
||||
app.command.insert_str(app.cursor_location, &c.to_string());
|
||||
} else {
|
||||
app.command.push(c);
|
||||
}
|
||||
app.cursor_location += 1;
|
||||
}
|
||||
Key::Backspace => {
|
||||
if app.cursor_location > 0 {
|
||||
app.cursor_location -= 1;
|
||||
let mut cs = app.command.chars().collect::<Vec<char>>();
|
||||
cs.remove(app.cursor_location);
|
||||
app.command = cs.into_iter().collect();
|
||||
}
|
||||
}
|
||||
_ => {}
|
||||
},
|
||||
AppMode::AddTask => match input {
|
||||
Key::Char('\n') => match app.task_add() {
|
||||
Ok(_) => {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue