Restructure to support color

This commit is contained in:
Dheepak Krishnamurthy 2020-08-02 12:34:07 -06:00
parent 6e6b6857c0
commit 0ac3996443
3 changed files with 133 additions and 331 deletions

View file

@ -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"
} }

View file

@ -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") {

View file

@ -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();