From 74433eccbe6d3ec0a32256280931b42d400fce02 Mon Sep 17 00:00:00 2001 From: Joscha Date: Mon, 2 May 2022 11:49:57 +0200 Subject: [PATCH] Highlight current birthdays --- CHANGELOG.md | 3 +++ src/cli/layout/line.rs | 40 +++++++++++++++++++++++++--------------- src/cli/print.rs | 11 ++++++++++- src/cli/util.rs | 4 ++++ 4 files changed, 42 insertions(+), 16 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 18b3029..2c219af 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,9 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). ## Unreleased +### Changed +- Birthdays for current day are now highlighted + ## 0.2.0 - 2022-03-18 ### Added diff --git a/src/cli/layout/line.rs b/src/cli/layout/line.rs index fffaab6..a63d45e 100644 --- a/src/cli/layout/line.rs +++ b/src/cli/layout/line.rs @@ -56,7 +56,7 @@ pub enum Times { FromTo(Time, Time), } -#[derive(Debug, Clone, Copy)] +#[derive(Debug, Clone, Copy, PartialEq, Eq)] pub enum LineKind { Task, Done, @@ -79,6 +79,7 @@ pub enum LineEntry { Entry { number: Option, spans: Vec>, + today: bool, time: Times, kind: LineKind, text: String, @@ -121,17 +122,18 @@ impl LineLayout { self.step_spans(); for day in layout.range.days() { + let today = day == layout.today; let spans = self.spans_for_line(); self.line(LineEntry::Day { spans, date: day, - today: day == layout.today, + today, has_log: files.log(day).is_some(), }); let layout_entries = layout.days.get(&day).expect("got nonexisting day"); 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)) } - 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 { DayEntry::End(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 { spans: self.spans_for_line(), @@ -169,17 +171,17 @@ impl LineLayout { }), DayEntry::TimedEnd(i, t) => { 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) => { let time = t2 .map(|t2| Times::FromTo(*t, t2)) .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) => { 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) => { let extra = if *d == 1 { @@ -187,22 +189,22 @@ impl LineLayout { } else { 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) => { - self.line_entry(entries, *i, Times::Untimed, None); + self.line_entry(entries, *i, today, Times::Untimed, None); } DayEntry::ReminderWhile(i, d) => { let plural = if *d == 1 { "" } else { "s" }; 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) => { - self.line_entry(entries, *i, Times::Untimed, None); + self.line_entry(entries, *i, today, Times::Untimed, None); } DayEntry::Start(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) => { let extra = if *d == 1 { @@ -210,7 +212,7 @@ impl LineLayout { } else { 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(); } - fn line_entry(&mut self, entries: &[Entry], index: usize, time: Times, extra: Option) { + fn line_entry( + &mut self, + entries: &[Entry], + index: usize, + today: bool, + time: Times, + extra: Option, + ) { let entry = &entries[index]; let number = match self.numbers.get(&index) { @@ -292,6 +301,7 @@ impl LineLayout { self.line(LineEntry::Entry { number: Some(number), spans: self.spans_for_line(), + today, time, kind: Self::entry_kind(entry), text: Self::entry_title(entry), diff --git a/src/cli/print.rs b/src/cli/print.rs index 1cb8caf..471cd85 100644 --- a/src/cli/print.rs +++ b/src/cli/print.rs @@ -35,12 +35,14 @@ impl ShowLines { LineEntry::Entry { number, spans, + today, time, kind, text, has_desc, 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, number: Option, spans: &[Option], + today: bool, time: Times, kind: LineKind, text: &str, @@ -110,6 +113,12 @@ impl ShowLines { None => "".to_string(), }; + let text = if kind == LineKind::Birthday && today { + util::display_current_birthday_text(text) + } else { + text.into() + }; + self.push(&format!( "{:>nw$} {} {}{} {}{}{}\n", num.bright_black(), diff --git a/src/cli/util.rs b/src/cli/util.rs index 5d1c3d5..e862088 100644 --- a/src/cli/util.rs +++ b/src/cli/util.rs @@ -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 { edit::edit(input).map_err(Error::EditingIo) }