Highlight current birthdays
This commit is contained in:
parent
f231fee508
commit
74433eccbe
4 changed files with 42 additions and 16 deletions
|
|
@ -4,6 +4,9 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
|
||||||
|
|
||||||
## Unreleased
|
## Unreleased
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
- Birthdays for current day are now highlighted
|
||||||
|
|
||||||
## 0.2.0 - 2022-03-18
|
## 0.2.0 - 2022-03-18
|
||||||
|
|
||||||
### Added
|
### Added
|
||||||
|
|
|
||||||
|
|
@ -56,7 +56,7 @@ pub enum Times {
|
||||||
FromTo(Time, Time),
|
FromTo(Time, Time),
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone, Copy)]
|
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
||||||
pub enum LineKind {
|
pub enum LineKind {
|
||||||
Task,
|
Task,
|
||||||
Done,
|
Done,
|
||||||
|
|
@ -79,6 +79,7 @@ pub enum LineEntry {
|
||||||
Entry {
|
Entry {
|
||||||
number: Option<usize>,
|
number: Option<usize>,
|
||||||
spans: Vec<Option<SpanSegment>>,
|
spans: Vec<Option<SpanSegment>>,
|
||||||
|
today: bool,
|
||||||
time: Times,
|
time: Times,
|
||||||
kind: LineKind,
|
kind: LineKind,
|
||||||
text: String,
|
text: String,
|
||||||
|
|
@ -121,17 +122,18 @@ impl LineLayout {
|
||||||
self.step_spans();
|
self.step_spans();
|
||||||
|
|
||||||
for day in layout.range.days() {
|
for day in layout.range.days() {
|
||||||
|
let today = day == layout.today;
|
||||||
let spans = self.spans_for_line();
|
let spans = self.spans_for_line();
|
||||||
self.line(LineEntry::Day {
|
self.line(LineEntry::Day {
|
||||||
spans,
|
spans,
|
||||||
date: day,
|
date: day,
|
||||||
today: day == layout.today,
|
today,
|
||||||
has_log: files.log(day).is_some(),
|
has_log: files.log(day).is_some(),
|
||||||
});
|
});
|
||||||
|
|
||||||
let layout_entries = layout.days.get(&day).expect("got nonexisting day");
|
let layout_entries = layout.days.get(&day).expect("got nonexisting day");
|
||||||
for layout_entry in layout_entries {
|
for layout_entry in layout_entries {
|
||||||
self.render_layout_entry(entries, layout_entry);
|
self.render_layout_entry(entries, layout_entry, today);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -157,11 +159,11 @@ impl LineLayout {
|
||||||
.ok_or(Error::NoSuchEntry(number))
|
.ok_or(Error::NoSuchEntry(number))
|
||||||
}
|
}
|
||||||
|
|
||||||
fn render_layout_entry(&mut self, entries: &[Entry], l_entry: &DayEntry) {
|
fn render_layout_entry(&mut self, entries: &[Entry], l_entry: &DayEntry, today: bool) {
|
||||||
match l_entry {
|
match l_entry {
|
||||||
DayEntry::End(i) => {
|
DayEntry::End(i) => {
|
||||||
self.stop_span(*i);
|
self.stop_span(*i);
|
||||||
self.line_entry(entries, *i, Times::Untimed, None);
|
self.line_entry(entries, *i, today, Times::Untimed, None);
|
||||||
}
|
}
|
||||||
DayEntry::Now(t) => self.line(LineEntry::Now {
|
DayEntry::Now(t) => self.line(LineEntry::Now {
|
||||||
spans: self.spans_for_line(),
|
spans: self.spans_for_line(),
|
||||||
|
|
@ -169,17 +171,17 @@ impl LineLayout {
|
||||||
}),
|
}),
|
||||||
DayEntry::TimedEnd(i, t) => {
|
DayEntry::TimedEnd(i, t) => {
|
||||||
self.stop_span(*i);
|
self.stop_span(*i);
|
||||||
self.line_entry(entries, *i, Times::At(*t), None);
|
self.line_entry(entries, *i, today, Times::At(*t), None);
|
||||||
}
|
}
|
||||||
DayEntry::TimedAt(i, t, t2) => {
|
DayEntry::TimedAt(i, t, t2) => {
|
||||||
let time = t2
|
let time = t2
|
||||||
.map(|t2| Times::FromTo(*t, t2))
|
.map(|t2| Times::FromTo(*t, t2))
|
||||||
.unwrap_or_else(|| Times::At(*t));
|
.unwrap_or_else(|| Times::At(*t));
|
||||||
self.line_entry(entries, *i, time, None);
|
self.line_entry(entries, *i, today, time, None);
|
||||||
}
|
}
|
||||||
DayEntry::TimedStart(i, t) => {
|
DayEntry::TimedStart(i, t) => {
|
||||||
self.start_span(*i);
|
self.start_span(*i);
|
||||||
self.line_entry(entries, *i, Times::At(*t), None);
|
self.line_entry(entries, *i, today, Times::At(*t), None);
|
||||||
}
|
}
|
||||||
DayEntry::ReminderSince(i, d) => {
|
DayEntry::ReminderSince(i, d) => {
|
||||||
let extra = if *d == 1 {
|
let extra = if *d == 1 {
|
||||||
|
|
@ -187,22 +189,22 @@ impl LineLayout {
|
||||||
} else {
|
} else {
|
||||||
format!("{d} days ago")
|
format!("{d} days ago")
|
||||||
};
|
};
|
||||||
self.line_entry(entries, *i, Times::Untimed, Some(extra));
|
self.line_entry(entries, *i, today, Times::Untimed, Some(extra));
|
||||||
}
|
}
|
||||||
DayEntry::At(i) => {
|
DayEntry::At(i) => {
|
||||||
self.line_entry(entries, *i, Times::Untimed, None);
|
self.line_entry(entries, *i, today, Times::Untimed, None);
|
||||||
}
|
}
|
||||||
DayEntry::ReminderWhile(i, d) => {
|
DayEntry::ReminderWhile(i, d) => {
|
||||||
let plural = if *d == 1 { "" } else { "s" };
|
let plural = if *d == 1 { "" } else { "s" };
|
||||||
let extra = format!("{d} day{plural} left");
|
let extra = format!("{d} day{plural} left");
|
||||||
self.line_entry(entries, *i, Times::Untimed, Some(extra));
|
self.line_entry(entries, *i, today, Times::Untimed, Some(extra));
|
||||||
}
|
}
|
||||||
DayEntry::Undated(i) => {
|
DayEntry::Undated(i) => {
|
||||||
self.line_entry(entries, *i, Times::Untimed, None);
|
self.line_entry(entries, *i, today, Times::Untimed, None);
|
||||||
}
|
}
|
||||||
DayEntry::Start(i) => {
|
DayEntry::Start(i) => {
|
||||||
self.start_span(*i);
|
self.start_span(*i);
|
||||||
self.line_entry(entries, *i, Times::Untimed, None);
|
self.line_entry(entries, *i, today, Times::Untimed, None);
|
||||||
}
|
}
|
||||||
DayEntry::ReminderUntil(i, d) => {
|
DayEntry::ReminderUntil(i, d) => {
|
||||||
let extra = if *d == 1 {
|
let extra = if *d == 1 {
|
||||||
|
|
@ -210,7 +212,7 @@ impl LineLayout {
|
||||||
} else {
|
} else {
|
||||||
format!("in {d} days")
|
format!("in {d} days")
|
||||||
};
|
};
|
||||||
self.line_entry(entries, *i, Times::Untimed, Some(extra));
|
self.line_entry(entries, *i, today, Times::Untimed, Some(extra));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -277,7 +279,14 @@ impl LineLayout {
|
||||||
self.step_spans();
|
self.step_spans();
|
||||||
}
|
}
|
||||||
|
|
||||||
fn line_entry(&mut self, entries: &[Entry], index: usize, time: Times, extra: Option<String>) {
|
fn line_entry(
|
||||||
|
&mut self,
|
||||||
|
entries: &[Entry],
|
||||||
|
index: usize,
|
||||||
|
today: bool,
|
||||||
|
time: Times,
|
||||||
|
extra: Option<String>,
|
||||||
|
) {
|
||||||
let entry = &entries[index];
|
let entry = &entries[index];
|
||||||
|
|
||||||
let number = match self.numbers.get(&index) {
|
let number = match self.numbers.get(&index) {
|
||||||
|
|
@ -292,6 +301,7 @@ impl LineLayout {
|
||||||
self.line(LineEntry::Entry {
|
self.line(LineEntry::Entry {
|
||||||
number: Some(number),
|
number: Some(number),
|
||||||
spans: self.spans_for_line(),
|
spans: self.spans_for_line(),
|
||||||
|
today,
|
||||||
time,
|
time,
|
||||||
kind: Self::entry_kind(entry),
|
kind: Self::entry_kind(entry),
|
||||||
text: Self::entry_title(entry),
|
text: Self::entry_title(entry),
|
||||||
|
|
|
||||||
|
|
@ -35,12 +35,14 @@ impl ShowLines {
|
||||||
LineEntry::Entry {
|
LineEntry::Entry {
|
||||||
number,
|
number,
|
||||||
spans,
|
spans,
|
||||||
|
today,
|
||||||
time,
|
time,
|
||||||
kind,
|
kind,
|
||||||
text,
|
text,
|
||||||
has_desc,
|
has_desc,
|
||||||
extra,
|
extra,
|
||||||
} => self.display_line_entry(*number, spans, *time, *kind, text, *has_desc, extra),
|
} => self
|
||||||
|
.display_line_entry(*number, spans, *today, *time, *kind, text, *has_desc, extra),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -99,6 +101,7 @@ impl ShowLines {
|
||||||
&mut self,
|
&mut self,
|
||||||
number: Option<usize>,
|
number: Option<usize>,
|
||||||
spans: &[Option<SpanSegment>],
|
spans: &[Option<SpanSegment>],
|
||||||
|
today: bool,
|
||||||
time: Times,
|
time: Times,
|
||||||
kind: LineKind,
|
kind: LineKind,
|
||||||
text: &str,
|
text: &str,
|
||||||
|
|
@ -110,6 +113,12 @@ impl ShowLines {
|
||||||
None => "".to_string(),
|
None => "".to_string(),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
let text = if kind == LineKind::Birthday && today {
|
||||||
|
util::display_current_birthday_text(text)
|
||||||
|
} else {
|
||||||
|
text.into()
|
||||||
|
};
|
||||||
|
|
||||||
self.push(&format!(
|
self.push(&format!(
|
||||||
"{:>nw$} {} {}{} {}{}{}\n",
|
"{:>nw$} {} {}{} {}{}{}\n",
|
||||||
num.bright_black(),
|
num.bright_black(),
|
||||||
|
|
|
||||||
|
|
@ -13,6 +13,10 @@ pub fn display_kind(kind: LineKind) -> ColoredString {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn display_current_birthday_text(text: &str) -> ColoredString {
|
||||||
|
text.yellow()
|
||||||
|
}
|
||||||
|
|
||||||
pub fn edit(input: &str) -> Result<String> {
|
pub fn edit(input: &str) -> Result<String> {
|
||||||
edit::edit(input).map_err(Error::EditingIo)
|
edit::edit(input).map_err(Error::EditingIo)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue