mirror of
https://github.com/kdheepak/taskwarrior-tui.git
synced 2025-08-26 12:17:19 +02:00
Restructure to support color
This commit is contained in:
parent
6e6b6857c0
commit
0ac3996443
3 changed files with 133 additions and 331 deletions
27
src/app.rs
27
src/app.rs
|
@ -1,4 +1,4 @@
|
||||||
use crate::color::{TColor, RGB};
|
use crate::color::{TColor};
|
||||||
|
|
||||||
use std::cmp::Ordering;
|
use std::cmp::Ordering;
|
||||||
use std::convert::TryInto;
|
use std::convert::TryInto;
|
||||||
|
@ -104,6 +104,7 @@ pub struct TTApp {
|
||||||
pub task_report_labels: Vec<String>,
|
pub task_report_labels: Vec<String>,
|
||||||
pub task_report_columns: Vec<String>,
|
pub task_report_columns: Vec<String>,
|
||||||
pub mode: AppMode,
|
pub mode: AppMode,
|
||||||
|
pub colors: TColor,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl TTApp {
|
impl TTApp {
|
||||||
|
@ -120,6 +121,7 @@ impl TTApp {
|
||||||
modify: "".to_string(),
|
modify: "".to_string(),
|
||||||
error: "".to_string(),
|
error: "".to_string(),
|
||||||
mode: AppMode::Report,
|
mode: AppMode::Report,
|
||||||
|
colors: TColor::default(),
|
||||||
};
|
};
|
||||||
app.update();
|
app.update();
|
||||||
app
|
app
|
||||||
|
@ -362,10 +364,25 @@ impl TTApp {
|
||||||
);
|
);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
let selected = self.state.selected().unwrap();
|
||||||
let header = headers.iter();
|
let header = headers.iter();
|
||||||
|
let ctasks = self.tasks.clone();
|
||||||
|
let blocking = self.colors.blocking;
|
||||||
|
let blocked = self.colors.blocked;
|
||||||
let rows = tasks
|
let rows = tasks
|
||||||
.iter()
|
.iter()
|
||||||
.map(|i| Row::StyledData(i.iter(), normal_style));
|
.enumerate()
|
||||||
|
.map(|(i, val)|
|
||||||
|
if ctasks[i].tags().unwrap_or(&vec![]).join(" ").contains(&"BLOCKED".to_string()) {
|
||||||
|
Row::StyledData(val.iter(), normal_style)
|
||||||
|
} else if ctasks[i].tags().unwrap_or(&vec![]).contains(&"BLOCKING".to_string()) {
|
||||||
|
Row::StyledData(val.iter(), normal_style.fg(blocking))
|
||||||
|
} else if ctasks[i].due().is_some() {
|
||||||
|
Row::StyledData(val.iter(), normal_style)
|
||||||
|
} else {
|
||||||
|
Row::StyledData(val.iter(), normal_style)
|
||||||
|
}
|
||||||
|
);
|
||||||
let constraints: Vec<Constraint> = widths
|
let constraints: Vec<Constraint> = widths
|
||||||
.iter()
|
.iter()
|
||||||
.map(|i| {
|
.map(|i| {
|
||||||
|
@ -658,9 +675,7 @@ impl TTApp {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn task_virtual_tags(&self) -> Result<String, String> {
|
pub fn task_virtual_tags(&self, task_id: u64) -> Result<String, String> {
|
||||||
let selected = self.state.selected().unwrap_or_default();
|
|
||||||
let task_id = self.tasks[selected].id().unwrap_or_default();
|
|
||||||
let output = Command::new("task").arg(format!("{}", task_id)).output();
|
let output = Command::new("task").arg(format!("{}", task_id)).output();
|
||||||
|
|
||||||
match output {
|
match output {
|
||||||
|
@ -692,7 +707,7 @@ impl TTApp {
|
||||||
let selected = self.state.selected().unwrap_or_default();
|
let selected = self.state.selected().unwrap_or_default();
|
||||||
let task_id = self.tasks[selected].id().unwrap_or_default();
|
let task_id = self.tasks[selected].id().unwrap_or_default();
|
||||||
let mut command = "start";
|
let mut command = "start";
|
||||||
for tag in self.task_virtual_tags()?.split(' ') {
|
for tag in self.task_virtual_tags(task_id)?.split(' ') {
|
||||||
if tag == "ACTIVE" {
|
if tag == "ACTIVE" {
|
||||||
command = "stop"
|
command = "stop"
|
||||||
}
|
}
|
||||||
|
|
435
src/color.rs
435
src/color.rs
|
@ -1,115 +1,90 @@
|
||||||
use std::process::Command;
|
use std::process::Command;
|
||||||
|
use tui::style::Color;
|
||||||
pub struct RGB {
|
|
||||||
r: f32,
|
|
||||||
g: f32,
|
|
||||||
b: f32,
|
|
||||||
}
|
|
||||||
|
|
||||||
pub struct TColor {
|
pub struct TColor {
|
||||||
pub enabled: bool,
|
pub enabled: bool,
|
||||||
pub active: RGB,
|
pub active: Color,
|
||||||
pub alternate: RGB,
|
pub alternate: Color,
|
||||||
pub blocked: RGB,
|
pub blocked: Color,
|
||||||
pub blocking: RGB,
|
pub blocking: Color,
|
||||||
pub burndown_done: RGB,
|
pub burndown_done: Color,
|
||||||
pub burndown_pending: RGB,
|
pub burndown_pending: Color,
|
||||||
pub burndown_started: RGB,
|
pub burndown_started: Color,
|
||||||
pub calendar_due: RGB,
|
pub calendar_due: Color,
|
||||||
pub calendar_due_today: RGB,
|
pub calendar_due_today: Color,
|
||||||
pub calendar_holiday: RGB,
|
pub calendar_holiday: Color,
|
||||||
pub calendar_overdue: RGB,
|
pub calendar_overdue: Color,
|
||||||
pub calendar_today: RGB,
|
pub calendar_today: Color,
|
||||||
pub calendar_weekend: RGB,
|
pub calendar_weekend: Color,
|
||||||
pub calendar_weeknumber: RGB,
|
pub calendar_weeknumber: Color,
|
||||||
pub completed: RGB,
|
pub completed: Color,
|
||||||
pub debug: RGB,
|
pub debug: Color,
|
||||||
pub deleted: RGB,
|
pub deleted: Color,
|
||||||
pub due: RGB,
|
pub due: Color,
|
||||||
pub due_today: RGB,
|
pub due_today: Color,
|
||||||
pub error: RGB,
|
pub error: Color,
|
||||||
pub footnote: RGB,
|
pub footnote: Color,
|
||||||
pub header: RGB,
|
pub header: Color,
|
||||||
pub history_add: RGB,
|
pub history_add: Color,
|
||||||
pub history_delete: RGB,
|
pub history_delete: Color,
|
||||||
pub history_done: RGB,
|
pub history_done: Color,
|
||||||
pub label: RGB,
|
pub label: Color,
|
||||||
pub label_sort: RGB,
|
pub label_sort: Color,
|
||||||
pub overdue: RGB,
|
pub overdue: Color,
|
||||||
pub project: RGB,
|
pub project: Color,
|
||||||
pub recurring: RGB,
|
pub recurring: Color,
|
||||||
pub scheduled: RGB,
|
pub scheduled: Color,
|
||||||
pub summary_background: RGB,
|
pub summary_background: Color,
|
||||||
pub summary_bar: RGB,
|
pub summary_bar: Color,
|
||||||
pub sync_added: RGB,
|
pub sync_added: Color,
|
||||||
pub sync_changed: RGB,
|
pub sync_changed: Color,
|
||||||
pub sync_rejected: RGB,
|
pub sync_rejected: Color,
|
||||||
pub tag_next: RGB,
|
pub tag_next: Color,
|
||||||
pub tag: RGB,
|
pub tag: Color,
|
||||||
pub tagged: RGB,
|
pub tagged: Color,
|
||||||
pub uda_priority: RGB,
|
pub uda_priority: Color,
|
||||||
pub uda_priority_h: RGB,
|
pub uda_priority_h: Color,
|
||||||
pub uda_priority_l: RGB,
|
pub uda_priority_l: Color,
|
||||||
pub uda_priority_m: RGB,
|
pub uda_priority_m: Color,
|
||||||
pub undo_after: RGB,
|
pub undo_after: Color,
|
||||||
pub undo_before: RGB,
|
pub undo_before: Color,
|
||||||
pub until: RGB,
|
pub until: Color,
|
||||||
pub warning: RGB,
|
pub warning: Color,
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn get_color(line: &str) -> RGB {
|
pub fn get_color(line: &str) -> Color {
|
||||||
let sline = line.split(" ").collect::<Vec<&str>>();
|
let sline = line.split(" ").collect::<Vec<&str>>();
|
||||||
if sline.len() == 1 {
|
if sline.len() == 1 {
|
||||||
return RGB {
|
return Color::Rgb(0, 0, 0);
|
||||||
r : 0.0,
|
|
||||||
g : 0.0,
|
|
||||||
b : 0.0,
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if line.contains(" on ") {
|
if line.contains(" on ") {
|
||||||
let foreground = line.split(" ").collect::<Vec<&str>>()[1];
|
let foreground = line.split(" ").collect::<Vec<&str>>()[1];
|
||||||
let background = line.split(" ").collect::<Vec<&str>>()[3];
|
let background = line.split(" ").collect::<Vec<&str>>()[3];
|
||||||
if foreground.starts_with("color") {
|
if foreground.starts_with("color") {
|
||||||
// TODO: get the correct color here
|
// TODO: get the correct color here
|
||||||
RGB {
|
Color::Rgb(0, 0, 0)
|
||||||
r : 0.0,
|
|
||||||
g : 0.0,
|
|
||||||
b : 0.0,
|
|
||||||
}
|
|
||||||
} else if foreground.starts_with("rgb") {
|
} else if foreground.starts_with("rgb") {
|
||||||
RGB {
|
Color::Rgb(
|
||||||
r : foreground.as_bytes()[3] as f32,
|
foreground.as_bytes()[3],
|
||||||
g : foreground.as_bytes()[4] as f32,
|
foreground.as_bytes()[4],
|
||||||
b : foreground.as_bytes()[5] as f32,
|
foreground.as_bytes()[5],
|
||||||
}
|
)
|
||||||
} else {
|
} else {
|
||||||
RGB {
|
Color::Rgb(0, 0, 0)
|
||||||
r : 0.0,
|
|
||||||
g : 0.0,
|
|
||||||
b : 0.0,
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
let foreground = line.split(" ").collect::<Vec<&str>>()[1];
|
let foreground = line.split(" ").collect::<Vec<&str>>()[1];
|
||||||
if foreground.starts_with("color") {
|
if foreground.starts_with("color") {
|
||||||
// TODO: get the correct color here
|
// TODO: get the correct color here
|
||||||
RGB {
|
Color::Rgb(0, 0, 0)
|
||||||
r : 0.0,
|
|
||||||
g : 0.0,
|
|
||||||
b : 0.0,
|
|
||||||
}
|
|
||||||
} else if foreground.starts_with("rgb") {
|
} else if foreground.starts_with("rgb") {
|
||||||
RGB {
|
Color::Rgb(
|
||||||
r : foreground.as_bytes()[3] as f32,
|
foreground.as_bytes()[3],
|
||||||
g : foreground.as_bytes()[4] as f32,
|
foreground.as_bytes()[4],
|
||||||
b : foreground.as_bytes()[5] as f32,
|
foreground.as_bytes()[5],
|
||||||
}
|
)
|
||||||
} else {
|
} else {
|
||||||
RGB {
|
Color::Rgb(0, 0, 0)
|
||||||
r : 0.0,
|
|
||||||
g : 0.0,
|
|
||||||
b : 0.0,
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -125,241 +100,53 @@ impl TColor {
|
||||||
let data = String::from_utf8(output.stdout).expect("Unable to convert stdout to string");
|
let data = String::from_utf8(output.stdout).expect("Unable to convert stdout to string");
|
||||||
|
|
||||||
let enabled = true;
|
let enabled = true;
|
||||||
let mut active = RGB {
|
let mut active = Color::Black;
|
||||||
r: 0.0,
|
let mut alternate = Color::Black;
|
||||||
g: 0.0,
|
let mut blocked = Color::Black;
|
||||||
b: 0.0,
|
let mut blocking = Color::Black;
|
||||||
};
|
let mut burndown_done = Color::Black;
|
||||||
let mut alternate = RGB {
|
let mut burndown_pending = Color::Black;
|
||||||
r: 0.0,
|
let mut burndown_started = Color::Black;
|
||||||
g: 0.0,
|
let mut calendar_due = Color::Black;
|
||||||
b: 0.0,
|
let mut calendar_due_today = Color::Black;
|
||||||
};
|
let mut calendar_holiday = Color::Black;
|
||||||
let mut blocked = RGB {
|
let mut calendar_overdue = Color::Black;
|
||||||
r: 0.0,
|
let mut calendar_today = Color::Black;
|
||||||
g: 0.0,
|
let mut calendar_weekend = Color::Black;
|
||||||
b: 0.0,
|
let mut calendar_weeknumber = Color::Black;
|
||||||
};
|
let mut completed = Color::Black;
|
||||||
let mut blocking = RGB {
|
let mut debug = Color::Black;
|
||||||
r: 0.0,
|
let mut deleted = Color::Black;
|
||||||
g: 0.0,
|
let mut due = Color::Black;
|
||||||
b: 0.0,
|
let mut due_today = Color::Black;
|
||||||
};
|
let mut error = Color::Black;
|
||||||
let mut burndown_done = RGB {
|
let mut footnote = Color::Black;
|
||||||
r: 0.0,
|
let mut header = Color::Black;
|
||||||
g: 0.0,
|
let mut history_add = Color::Black;
|
||||||
b: 0.0,
|
let mut history_delete = Color::Black;
|
||||||
};
|
let mut history_done = Color::Black;
|
||||||
let mut burndown_pending = RGB {
|
let mut label = Color::Black;
|
||||||
r: 0.0,
|
let mut label_sort = Color::Black;
|
||||||
g: 0.0,
|
let mut overdue = Color::Black;
|
||||||
b: 0.0,
|
let mut project = Color::Black;
|
||||||
};
|
let mut recurring = Color::Black;
|
||||||
let mut burndown_started = RGB {
|
let mut scheduled = Color::Black;
|
||||||
r: 0.0,
|
let mut summary_background = Color::Black;
|
||||||
g: 0.0,
|
let mut summary_bar = Color::Black;
|
||||||
b: 0.0,
|
let mut sync_added = Color::Black;
|
||||||
};
|
let mut sync_changed = Color::Black;
|
||||||
let mut calendar_due = RGB {
|
let mut sync_rejected = Color::Black;
|
||||||
r: 0.0,
|
let mut tag_next = Color::Black;
|
||||||
g: 0.0,
|
let mut tag = Color::Black;
|
||||||
b: 0.0,
|
let mut tagged = Color::Black;
|
||||||
};
|
let mut uda_priority = Color::Black;
|
||||||
let mut calendar_due_today = RGB {
|
let mut uda_priority_h = Color::Black;
|
||||||
r: 0.0,
|
let mut uda_priority_l = Color::Black;
|
||||||
g: 0.0,
|
let mut uda_priority_m = Color::Black;
|
||||||
b: 0.0,
|
let mut undo_after = Color::Black;
|
||||||
};
|
let mut undo_before = Color::Black;
|
||||||
let mut calendar_holiday = RGB {
|
let mut until = Color::Black;
|
||||||
r: 0.0,
|
let mut warning = Color::Black;
|
||||||
g: 0.0,
|
|
||||||
b: 0.0,
|
|
||||||
};
|
|
||||||
let mut calendar_overdue = RGB {
|
|
||||||
r: 0.0,
|
|
||||||
g: 0.0,
|
|
||||||
b: 0.0,
|
|
||||||
};
|
|
||||||
let mut calendar_today = RGB {
|
|
||||||
r: 0.0,
|
|
||||||
g: 0.0,
|
|
||||||
b: 0.0,
|
|
||||||
};
|
|
||||||
let mut calendar_weekend = RGB {
|
|
||||||
r: 0.0,
|
|
||||||
g: 0.0,
|
|
||||||
b: 0.0,
|
|
||||||
};
|
|
||||||
let mut calendar_weeknumber = RGB {
|
|
||||||
r: 0.0,
|
|
||||||
g: 0.0,
|
|
||||||
b: 0.0,
|
|
||||||
};
|
|
||||||
let mut completed = RGB {
|
|
||||||
r: 0.0,
|
|
||||||
g: 0.0,
|
|
||||||
b: 0.0,
|
|
||||||
};
|
|
||||||
let mut debug = RGB {
|
|
||||||
r: 0.0,
|
|
||||||
g: 0.0,
|
|
||||||
b: 0.0,
|
|
||||||
};
|
|
||||||
let mut deleted = RGB {
|
|
||||||
r: 0.0,
|
|
||||||
g: 0.0,
|
|
||||||
b: 0.0,
|
|
||||||
};
|
|
||||||
let mut due = RGB {
|
|
||||||
r: 0.0,
|
|
||||||
g: 0.0,
|
|
||||||
b: 0.0,
|
|
||||||
};
|
|
||||||
let mut due_today = RGB {
|
|
||||||
r: 0.0,
|
|
||||||
g: 0.0,
|
|
||||||
b: 0.0,
|
|
||||||
};
|
|
||||||
let mut error = RGB {
|
|
||||||
r: 0.0,
|
|
||||||
g: 0.0,
|
|
||||||
b: 0.0,
|
|
||||||
};
|
|
||||||
let mut footnote = RGB {
|
|
||||||
r: 0.0,
|
|
||||||
g: 0.0,
|
|
||||||
b: 0.0,
|
|
||||||
};
|
|
||||||
let mut header = RGB {
|
|
||||||
r: 0.0,
|
|
||||||
g: 0.0,
|
|
||||||
b: 0.0,
|
|
||||||
};
|
|
||||||
let mut history_add = RGB {
|
|
||||||
r: 0.0,
|
|
||||||
g: 0.0,
|
|
||||||
b: 0.0,
|
|
||||||
};
|
|
||||||
let mut history_delete = RGB {
|
|
||||||
r: 0.0,
|
|
||||||
g: 0.0,
|
|
||||||
b: 0.0,
|
|
||||||
};
|
|
||||||
let mut history_done = RGB {
|
|
||||||
r: 0.0,
|
|
||||||
g: 0.0,
|
|
||||||
b: 0.0,
|
|
||||||
};
|
|
||||||
let mut label = RGB {
|
|
||||||
r: 0.0,
|
|
||||||
g: 0.0,
|
|
||||||
b: 0.0,
|
|
||||||
};
|
|
||||||
let mut label_sort = RGB {
|
|
||||||
r: 0.0,
|
|
||||||
g: 0.0,
|
|
||||||
b: 0.0,
|
|
||||||
};
|
|
||||||
let mut overdue = RGB {
|
|
||||||
r: 0.0,
|
|
||||||
g: 0.0,
|
|
||||||
b: 0.0,
|
|
||||||
};
|
|
||||||
let mut project = RGB {
|
|
||||||
r: 0.0,
|
|
||||||
g: 0.0,
|
|
||||||
b: 0.0,
|
|
||||||
};
|
|
||||||
let mut recurring = RGB {
|
|
||||||
r: 0.0,
|
|
||||||
g: 0.0,
|
|
||||||
b: 0.0,
|
|
||||||
};
|
|
||||||
let mut scheduled = RGB {
|
|
||||||
r: 0.0,
|
|
||||||
g: 0.0,
|
|
||||||
b: 0.0,
|
|
||||||
};
|
|
||||||
let mut summary_background = RGB {
|
|
||||||
r: 0.0,
|
|
||||||
g: 0.0,
|
|
||||||
b: 0.0,
|
|
||||||
};
|
|
||||||
let mut summary_bar = RGB {
|
|
||||||
r: 0.0,
|
|
||||||
g: 0.0,
|
|
||||||
b: 0.0,
|
|
||||||
};
|
|
||||||
let mut sync_added = RGB {
|
|
||||||
r: 0.0,
|
|
||||||
g: 0.0,
|
|
||||||
b: 0.0,
|
|
||||||
};
|
|
||||||
let mut sync_changed = RGB {
|
|
||||||
r: 0.0,
|
|
||||||
g: 0.0,
|
|
||||||
b: 0.0,
|
|
||||||
};
|
|
||||||
let mut sync_rejected = RGB {
|
|
||||||
r: 0.0,
|
|
||||||
g: 0.0,
|
|
||||||
b: 0.0,
|
|
||||||
};
|
|
||||||
let mut tag_next = RGB {
|
|
||||||
r: 0.0,
|
|
||||||
g: 0.0,
|
|
||||||
b: 0.0,
|
|
||||||
};
|
|
||||||
let mut tag = RGB {
|
|
||||||
r: 0.0,
|
|
||||||
g: 0.0,
|
|
||||||
b: 0.0,
|
|
||||||
};
|
|
||||||
let mut tagged = RGB {
|
|
||||||
r: 0.0,
|
|
||||||
g: 0.0,
|
|
||||||
b: 0.0,
|
|
||||||
};
|
|
||||||
let mut uda_priority = RGB {
|
|
||||||
r: 0.0,
|
|
||||||
g: 0.0,
|
|
||||||
b: 0.0,
|
|
||||||
};
|
|
||||||
let mut uda_priority_h = RGB {
|
|
||||||
r: 0.0,
|
|
||||||
g: 0.0,
|
|
||||||
b: 0.0,
|
|
||||||
};
|
|
||||||
let mut uda_priority_l = RGB {
|
|
||||||
r: 0.0,
|
|
||||||
g: 0.0,
|
|
||||||
b: 0.0,
|
|
||||||
};
|
|
||||||
let mut uda_priority_m = RGB {
|
|
||||||
r: 0.0,
|
|
||||||
g: 0.0,
|
|
||||||
b: 0.0,
|
|
||||||
};
|
|
||||||
let mut undo_after = RGB {
|
|
||||||
r: 0.0,
|
|
||||||
g: 0.0,
|
|
||||||
b: 0.0,
|
|
||||||
};
|
|
||||||
let mut undo_before = RGB {
|
|
||||||
r: 0.0,
|
|
||||||
g: 0.0,
|
|
||||||
b: 0.0,
|
|
||||||
};
|
|
||||||
let mut until = RGB {
|
|
||||||
r: 0.0,
|
|
||||||
g: 0.0,
|
|
||||||
b: 0.0,
|
|
||||||
};
|
|
||||||
let mut warning = RGB {
|
|
||||||
r: 0.0,
|
|
||||||
g: 0.0,
|
|
||||||
b: 0.0,
|
|
||||||
};
|
|
||||||
|
|
||||||
for line in data.split('\n') {
|
for line in data.split('\n') {
|
||||||
if line.starts_with("color.active") {
|
if line.starts_with("color.active") {
|
||||||
|
|
|
@ -45,7 +45,7 @@ fn tui_main(_config: &str) -> Result<(), Box<dyn Error>> {
|
||||||
|
|
||||||
// Setup event handlers
|
// Setup event handlers
|
||||||
let events = Events::with_config(EventConfig {
|
let events = Events::with_config(EventConfig {
|
||||||
tick_rate: Duration::from_millis(250),
|
tick_rate: Duration::from_millis(1000),
|
||||||
});
|
});
|
||||||
|
|
||||||
let mut app = TTApp::new();
|
let mut app = TTApp::new();
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue