Highlight current birthdays

This commit is contained in:
Joscha 2022-05-02 11:49:57 +02:00
parent f231fee508
commit 74433eccbe
4 changed files with 42 additions and 16 deletions

View file

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

View file

@ -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),

View file

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

View file

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