mirror of
https://github.com/kdheepak/taskwarrior-tui.git
synced 2025-08-25 08:47:18 +02:00
Support virtual tags using same logic as taskwarrior
This commit is contained in:
parent
84cba526f8
commit
7a4221b0e8
1 changed files with 53 additions and 19 deletions
72
src/app.rs
72
src/app.rs
|
@ -6,6 +6,7 @@ use std::process::Command;
|
||||||
use std::result::Result;
|
use std::result::Result;
|
||||||
|
|
||||||
use task_hookrs::date::Date;
|
use task_hookrs::date::Date;
|
||||||
|
use task_hookrs::status::TaskStatus;
|
||||||
use task_hookrs::import::import;
|
use task_hookrs::import::import;
|
||||||
use task_hookrs::task::Task;
|
use task_hookrs::task::Task;
|
||||||
use task_hookrs::uda::UDAValue;
|
use task_hookrs::uda::UDAValue;
|
||||||
|
@ -131,7 +132,6 @@ impl TTApp {
|
||||||
};
|
};
|
||||||
app.get_context();
|
app.get_context();
|
||||||
app.update();
|
app.update();
|
||||||
app.start_background_thread();
|
|
||||||
app
|
app
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -584,6 +584,8 @@ impl TTApp {
|
||||||
|
|
||||||
pub fn update(&mut self) {
|
pub fn update(&mut self) {
|
||||||
self.export_tasks();
|
self.export_tasks();
|
||||||
|
self.dependency_scan();
|
||||||
|
self.update_tags();
|
||||||
self.export_headers();
|
self.export_headers();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -690,24 +692,6 @@ impl TTApp {
|
||||||
*(self.tasks.lock().unwrap()) = i;
|
*(self.tasks.lock().unwrap()) = i;
|
||||||
self.tasks.lock().unwrap().sort_by(cmp);
|
self.tasks.lock().unwrap().sort_by(cmp);
|
||||||
}
|
}
|
||||||
{
|
|
||||||
let mut tasks = self.tasks.lock().unwrap();
|
|
||||||
for i in 0..tasks.len() {
|
|
||||||
let task_id = tasks[i].id().unwrap();
|
|
||||||
let tags = TTApp::task_virtual_tags(task_id).unwrap_or_default();
|
|
||||||
let task = &mut tasks[i];
|
|
||||||
match task.tags_mut() {
|
|
||||||
Some(t) => {
|
|
||||||
for tag in tags.split(" ") {
|
|
||||||
t.push(tag.to_string())
|
|
||||||
}
|
|
||||||
},
|
|
||||||
None => {
|
|
||||||
task.set_tags(Some(tags.split(" ")))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -953,6 +937,56 @@ impl TTApp {
|
||||||
let selected = self.state.selected().unwrap_or_default();
|
let selected = self.state.selected().unwrap_or_default();
|
||||||
Some(self.tasks.lock().unwrap()[selected].clone())
|
Some(self.tasks.lock().unwrap()[selected].clone())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn dependency_scan(&mut self) {
|
||||||
|
let tasks = &mut*self.tasks.lock().unwrap();
|
||||||
|
for l_i in 0..tasks.len() {
|
||||||
|
let default_deps = vec![];
|
||||||
|
let deps = tasks[l_i].depends().unwrap_or(&default_deps).clone();
|
||||||
|
for dep in deps {
|
||||||
|
for r_i in 0..tasks.len() {
|
||||||
|
if tasks[r_i].uuid() == &dep {
|
||||||
|
let lstatus = tasks[l_i].status();
|
||||||
|
let rstatus = tasks[r_i].status();
|
||||||
|
if lstatus != &TaskStatus::Completed && lstatus != &TaskStatus::Deleted && rstatus != &TaskStatus::Completed && rstatus != &TaskStatus::Deleted {
|
||||||
|
add_tag(&mut tasks[l_i], "BLOCKED".to_string());
|
||||||
|
add_tag(&mut tasks[r_i], "BLOCKING".to_string());
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn update_tags(&mut self) {
|
||||||
|
let tasks = &mut*self.tasks.lock().unwrap();
|
||||||
|
for i in 0..tasks.len() {
|
||||||
|
match tasks[i].status() {
|
||||||
|
TaskStatus::Waiting => add_tag(&mut tasks[i], "WAITING".to_string()),
|
||||||
|
TaskStatus::Completed => add_tag(&mut tasks[i], "COMPLETED".to_string()),
|
||||||
|
TaskStatus::Pending => add_tag(&mut tasks[i], "PENDING".to_string()),
|
||||||
|
TaskStatus::Deleted => add_tag(&mut tasks[i], "DELETED".to_string()),
|
||||||
|
TaskStatus::Recurring => (),
|
||||||
|
}
|
||||||
|
if tasks[i].start().is_some() { add_tag(&mut tasks[i], "ACTIVE".to_string()); }
|
||||||
|
if tasks[i].scheduled().is_some() { add_tag(&mut tasks[i], "SCHEDULED".to_string()); }
|
||||||
|
if tasks[i].parent().is_some() { add_tag(&mut tasks[i], "INSTANCE".to_string()); }
|
||||||
|
if tasks[i].until().is_some() { add_tag(&mut tasks[i], "UNTIL".to_string()); }
|
||||||
|
if tasks[i].annotations().is_some() { add_tag(&mut tasks[i], "ANNOTATED".to_string()); }
|
||||||
|
if tasks[i].tags().is_some() { add_tag(&mut tasks[i], "TAGGED".to_string()); }
|
||||||
|
if tasks[i].mask().is_some() { add_tag(&mut tasks[i], "TEMPLATE".to_string()); }
|
||||||
|
if tasks[i].project().is_some() { add_tag(&mut tasks[i], "PROJECT".to_string()); }
|
||||||
|
if tasks[i].priority().is_some() { add_tag(&mut tasks[i], "PROJECT".to_string()); }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn add_tag(task: &mut Task, tag: String) {
|
||||||
|
match task.tags_mut() {
|
||||||
|
Some(t) => t.push(tag.to_string()),
|
||||||
|
None => task.set_tags(Some(vec![tag])),
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue