mirror of
https://github.com/kdheepak/taskwarrior-tui.git
synced 2025-08-26 12:17:19 +02:00
Use get_bool trait for String and str
This commit is contained in:
parent
a6a437ec77
commit
8071558dbe
3 changed files with 111 additions and 62 deletions
25
src/app.rs
25
src/app.rs
|
@ -1,5 +1,5 @@
|
||||||
use crate::config::TConfig;
|
|
||||||
use crate::calendar::Calendar;
|
use crate::calendar::Calendar;
|
||||||
|
use crate::config::TConfig;
|
||||||
use crate::table::{Row, Table, TableState};
|
use crate::table::{Row, Table, TableState};
|
||||||
|
|
||||||
use std::cmp::Ordering;
|
use std::cmp::Ordering;
|
||||||
|
@ -14,7 +14,7 @@ use task_hookrs::task::Task;
|
||||||
use task_hookrs::uda::UDAValue;
|
use task_hookrs::uda::UDAValue;
|
||||||
use uuid::Uuid;
|
use uuid::Uuid;
|
||||||
|
|
||||||
use chrono::{Datelike, Local, NaiveDateTime, NaiveDate, TimeZone};
|
use chrono::{Datelike, Local, NaiveDate, NaiveDateTime, TimeZone};
|
||||||
|
|
||||||
use std::sync::{Arc, Mutex};
|
use std::sync::{Arc, Mutex};
|
||||||
use std::{sync::mpsc, thread, time::Duration};
|
use std::{sync::mpsc, thread, time::Duration};
|
||||||
|
@ -434,7 +434,6 @@ impl TTApp {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn draw_calendar(&mut self, f: &mut Frame<impl Backend>) {
|
pub fn draw_calendar(&mut self, f: &mut Frame<impl Backend>) {
|
||||||
|
|
||||||
let dates_with_styles = self.get_dates_with_styles();
|
let dates_with_styles = self.get_dates_with_styles();
|
||||||
let rects = Layout::default()
|
let rects = Layout::default()
|
||||||
.direction(Direction::Vertical)
|
.direction(Direction::Vertical)
|
||||||
|
@ -450,7 +449,6 @@ impl TTApp {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn get_dates_with_styles(&self) -> Vec<(NaiveDate, Style)> {
|
pub fn get_dates_with_styles(&self) -> Vec<(NaiveDate, Style)> {
|
||||||
|
|
||||||
let mut tasks_with_styles = vec![];
|
let mut tasks_with_styles = vec![];
|
||||||
|
|
||||||
let tasks_is_empty = self.tasks.lock().unwrap().is_empty();
|
let tasks_is_empty = self.tasks.lock().unwrap().is_empty();
|
||||||
|
@ -460,12 +458,8 @@ impl TTApp {
|
||||||
let tasks = &self.tasks.lock().unwrap();
|
let tasks = &self.tasks.lock().unwrap();
|
||||||
let tasks_with_due_dates = tasks.iter().filter(|t| t.due().is_some());
|
let tasks_with_due_dates = tasks.iter().filter(|t| t.due().is_some());
|
||||||
|
|
||||||
tasks_with_styles.extend(
|
tasks_with_styles
|
||||||
tasks_with_due_dates.map(
|
.extend(tasks_with_due_dates.map(|t| (t.due().unwrap().clone().date(), self.style_for_task(t))))
|
||||||
|t| (t.due().unwrap().clone().date(), self.style_for_task(t))
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
}
|
}
|
||||||
return tasks_with_styles;
|
return tasks_with_styles;
|
||||||
}
|
}
|
||||||
|
@ -1048,7 +1042,7 @@ impl TTApp {
|
||||||
task_id
|
task_id
|
||||||
)),
|
)),
|
||||||
}
|
}
|
||||||
},
|
}
|
||||||
None => Err(format!(
|
None => Err(format!(
|
||||||
"Unable to run `task modify` with `{}` on task {}",
|
"Unable to run `task modify` with `{}` on task {}",
|
||||||
self.modify.as_str(),
|
self.modify.as_str(),
|
||||||
|
@ -1297,7 +1291,12 @@ impl TTApp {
|
||||||
add_tag(&mut task, "ANNOTATED".to_string());
|
add_tag(&mut task, "ANNOTATED".to_string());
|
||||||
}
|
}
|
||||||
if task.tags().is_some() {
|
if task.tags().is_some() {
|
||||||
let tags = task.tags().unwrap().iter().filter(|s| !self.task_report_table.virtual_tags.contains(s)).collect::<Vec<_>>();
|
let tags = task
|
||||||
|
.tags()
|
||||||
|
.unwrap()
|
||||||
|
.iter()
|
||||||
|
.filter(|s| !self.task_report_table.virtual_tags.contains(s))
|
||||||
|
.collect::<Vec<_>>();
|
||||||
if !tags.is_empty() {
|
if !tags.is_empty() {
|
||||||
add_tag(&mut task, "TAGGED".to_string());
|
add_tag(&mut task, "TAGGED".to_string());
|
||||||
}
|
}
|
||||||
|
@ -1401,7 +1400,7 @@ impl TTApp {
|
||||||
Some(t) => {
|
Some(t) => {
|
||||||
let s = format!("{} ", t.description());
|
let s = format!("{} ", t.description());
|
||||||
self.modify.update(&s, s.len())
|
self.modify.update(&s, s.len())
|
||||||
},
|
}
|
||||||
None => self.modify.update("", 0),
|
None => self.modify.update("", 0),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,7 +5,7 @@ use std::fmt;
|
||||||
|
|
||||||
const COL_WIDTH: usize = 21;
|
const COL_WIDTH: usize = 21;
|
||||||
|
|
||||||
use chrono::{Datelike, Local, Duration, NaiveDate, NaiveDateTime, TimeZone, Month};
|
use chrono::{Datelike, Duration, Local, Month, NaiveDate, NaiveDateTime, TimeZone};
|
||||||
|
|
||||||
use tui::{
|
use tui::{
|
||||||
buffer::Buffer,
|
buffer::Buffer,
|
||||||
|
@ -25,7 +25,7 @@ pub struct Calendar<'a> {
|
||||||
pub month: u32,
|
pub month: u32,
|
||||||
pub style: Style,
|
pub style: Style,
|
||||||
pub months_per_row: usize,
|
pub months_per_row: usize,
|
||||||
pub date_style: Vec<(NaiveDate, Style)>
|
pub date_style: Vec<(NaiveDate, Style)>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a> Default for Calendar<'a> {
|
impl<'a> Default for Calendar<'a> {
|
||||||
|
@ -78,7 +78,7 @@ impl<'a> Calendar<'a> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl <'a> Widget for Calendar<'a> {
|
impl<'a> Widget for Calendar<'a> {
|
||||||
fn render(mut self, area: Rect, buf: &mut Buffer) {
|
fn render(mut self, area: Rect, buf: &mut Buffer) {
|
||||||
let month_names = [
|
let month_names = [
|
||||||
Month::January.name(),
|
Month::January.name(),
|
||||||
|
@ -106,7 +106,7 @@ impl <'a> Widget for Calendar<'a> {
|
||||||
};
|
};
|
||||||
|
|
||||||
if area.height < 7 {
|
if area.height < 7 {
|
||||||
return
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
let style = self.style;
|
let style = self.style;
|
||||||
|
@ -117,21 +117,41 @@ impl <'a> Widget for Calendar<'a> {
|
||||||
|
|
||||||
let months: Vec<_> = (0..12).collect();
|
let months: Vec<_> = (0..12).collect();
|
||||||
|
|
||||||
let mut days: Vec<_> = months.iter().map(|i| {
|
let mut days: Vec<_> = months
|
||||||
let first = NaiveDate::from_ymd(year, i+1, 1);
|
.iter()
|
||||||
(first, first - Duration::days(first.weekday().num_days_from_sunday() as i64))
|
.map(|i| {
|
||||||
}).collect();
|
let first = NaiveDate::from_ymd(year, i + 1, 1);
|
||||||
|
(
|
||||||
|
first,
|
||||||
|
first - Duration::days(first.weekday().num_days_from_sunday() as i64),
|
||||||
|
)
|
||||||
|
})
|
||||||
|
.collect();
|
||||||
|
|
||||||
days.append(&mut months.iter().map(|i| {
|
days.append(
|
||||||
let first = NaiveDate::from_ymd(year + 1, i+1, 1);
|
&mut months
|
||||||
(first, first - Duration::days(first.weekday().num_days_from_sunday() as i64))
|
.iter()
|
||||||
}).collect::<Vec<_>>()
|
.map(|i| {
|
||||||
|
let first = NaiveDate::from_ymd(year + 1, i + 1, 1);
|
||||||
|
(
|
||||||
|
first,
|
||||||
|
first - Duration::days(first.weekday().num_days_from_sunday() as i64),
|
||||||
|
)
|
||||||
|
})
|
||||||
|
.collect::<Vec<_>>(),
|
||||||
);
|
);
|
||||||
|
|
||||||
days.append(&mut months.iter().map(|i| {
|
days.append(
|
||||||
let first = NaiveDate::from_ymd(year + 2, i+1, 1);
|
&mut months
|
||||||
(first, first - Duration::days(first.weekday().num_days_from_sunday() as i64))
|
.iter()
|
||||||
}).collect::<Vec<_>>()
|
.map(|i| {
|
||||||
|
let first = NaiveDate::from_ymd(year + 2, i + 1, 1);
|
||||||
|
(
|
||||||
|
first,
|
||||||
|
first - Duration::days(first.weekday().num_days_from_sunday() as i64),
|
||||||
|
)
|
||||||
|
})
|
||||||
|
.collect::<Vec<_>>(),
|
||||||
);
|
);
|
||||||
|
|
||||||
let mut startm = 0 as usize;
|
let mut startm = 0 as usize;
|
||||||
|
@ -179,9 +199,19 @@ impl <'a> Widget for Calendar<'a> {
|
||||||
let m = d.0.month() as usize;
|
let m = d.0.month() as usize;
|
||||||
let style = Style::default().bg(Color::Rgb(220, 220, 220));
|
let style = Style::default().bg(Color::Rgb(220, 220, 220));
|
||||||
if m == today.month() as usize && self.year + year as i32 == today.year() {
|
if m == today.month() as usize && self.year + year as i32 == today.year() {
|
||||||
buf.set_string(x as u16, y, "Su Mo Tu We Th Fr Sa", style.add_modifier(Modifier::UNDERLINED));
|
buf.set_string(
|
||||||
|
x as u16,
|
||||||
|
y,
|
||||||
|
"Su Mo Tu We Th Fr Sa",
|
||||||
|
style.add_modifier(Modifier::UNDERLINED),
|
||||||
|
);
|
||||||
} else {
|
} else {
|
||||||
buf.set_string(x as u16, y, "Su Mo Tu We Th Fr Sa", style.add_modifier(Modifier::UNDERLINED));
|
buf.set_string(
|
||||||
|
x as u16,
|
||||||
|
y,
|
||||||
|
"Su Mo Tu We Th Fr Sa",
|
||||||
|
style.add_modifier(Modifier::UNDERLINED),
|
||||||
|
);
|
||||||
}
|
}
|
||||||
x += 21 + 1;
|
x += 21 + 1;
|
||||||
}
|
}
|
||||||
|
@ -224,12 +254,16 @@ impl <'a> Widget for Calendar<'a> {
|
||||||
startm += self.months_per_row;
|
startm += self.months_per_row;
|
||||||
y += 2;
|
y += 2;
|
||||||
if y + 8 > area.height {
|
if y + 8 > area.height {
|
||||||
break
|
break;
|
||||||
} else if startm >= 12 {
|
} else if startm >= 12 {
|
||||||
startm = 0;
|
startm = 0;
|
||||||
year += 1;
|
year += 1;
|
||||||
let x = area.x;
|
let x = area.x;
|
||||||
let s = format!("{year:^width$}", year = self.year as usize + year, width = area.width as usize);
|
let s = format!(
|
||||||
|
"{year:^width$}",
|
||||||
|
year = self.year as usize + year,
|
||||||
|
width = area.width as usize
|
||||||
|
);
|
||||||
let mut style = Style::default().add_modifier(Modifier::UNDERLINED);
|
let mut style = Style::default().add_modifier(Modifier::UNDERLINED);
|
||||||
if self.year + year as i32 == today.year() {
|
if self.year + year as i32 == today.year() {
|
||||||
style = style.add_modifier(Modifier::BOLD)
|
style = style.add_modifier(Modifier::BOLD)
|
||||||
|
|
|
@ -41,6 +41,34 @@ pub struct TConfig {
|
||||||
pub uda_calendar_months_per_row: usize,
|
pub uda_calendar_months_per_row: usize,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
trait TaskWarriorBool {
|
||||||
|
fn get_bool(&self) -> Option<bool>;
|
||||||
|
}
|
||||||
|
|
||||||
|
impl TaskWarriorBool for String {
|
||||||
|
fn get_bool(&self) -> Option<bool> {
|
||||||
|
if self == "true" || self == "1" || self == "y" || self == "yes" || self == "on" {
|
||||||
|
Some(true)
|
||||||
|
} else if self == "false" || self == "0" || self == "n" || self == "no" || self == "off" {
|
||||||
|
Some(false)
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl TaskWarriorBool for str {
|
||||||
|
fn get_bool(&self) -> Option<bool> {
|
||||||
|
if self == "true" || self == "1" || self == "y" || self == "yes" || self == "on" {
|
||||||
|
Some(true)
|
||||||
|
} else if self == "false" || self == "0" || self == "n" || self == "no" || self == "off" {
|
||||||
|
Some(false)
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl TConfig {
|
impl TConfig {
|
||||||
pub fn default() -> Self {
|
pub fn default() -> Self {
|
||||||
let bool_collection = Self::get_bool_collection();
|
let bool_collection = Self::get_bool_collection();
|
||||||
|
@ -265,34 +293,33 @@ impl TConfig {
|
||||||
|
|
||||||
fn get_uda_selection_bold() -> bool {
|
fn get_uda_selection_bold() -> bool {
|
||||||
let s = Self::get_config("uda.taskwarrior-tui.selection.bold");
|
let s = Self::get_config("uda.taskwarrior-tui.selection.bold");
|
||||||
if s == "yes" {
|
match s.get_bool() {
|
||||||
true
|
Some(b) => b,
|
||||||
} else if s == "no" {
|
None => true,
|
||||||
false
|
|
||||||
} else {
|
|
||||||
true
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get_uda_selection_italic() -> bool {
|
fn get_uda_selection_italic() -> bool {
|
||||||
let s = Self::get_config("uda.taskwarrior-tui.selection.italic");
|
let s = Self::get_config("uda.taskwarrior-tui.selection.italic");
|
||||||
if s == "yes" {
|
match s.get_bool() {
|
||||||
true
|
Some(b) => b,
|
||||||
} else if s == "no" {
|
None => false,
|
||||||
false
|
|
||||||
} else {
|
|
||||||
false
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get_uda_selection_dim() -> bool {
|
fn get_uda_selection_dim() -> bool {
|
||||||
let s = Self::get_config("uda.taskwarrior-tui.selection.dim");
|
let s = Self::get_config("uda.taskwarrior-tui.selection.dim");
|
||||||
if s == "yes" {
|
match s.get_bool() {
|
||||||
true
|
Some(b) => b,
|
||||||
} else if s == "no" {
|
None => false,
|
||||||
false
|
}
|
||||||
} else {
|
}
|
||||||
false
|
|
||||||
|
fn get_uda_selection_blink() -> bool {
|
||||||
|
let s = Self::get_config("uda.taskwarrior-tui.selection.blink");
|
||||||
|
match s.get_bool() {
|
||||||
|
Some(b) => b,
|
||||||
|
None => false,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -303,17 +330,6 @@ impl TConfig {
|
||||||
Err(e) => 4,
|
Err(e) => 4,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get_uda_selection_blink() -> bool {
|
|
||||||
let s = Self::get_config("uda.taskwarrior-tui.selection.blink");
|
|
||||||
if s == "yes" {
|
|
||||||
true
|
|
||||||
} else if s == "no" {
|
|
||||||
false
|
|
||||||
} else {
|
|
||||||
false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue