From befb05730fc233bd8f96564f4ab7e790630654a4 Mon Sep 17 00:00:00 2001 From: PlexSheep Date: Wed, 10 Jul 2024 01:34:29 +0200 Subject: [PATCH 01/40] feat: early timebar implementation --- src/clock.rs | 272 ++++++++++++++++++++++++++++++++++++++++++--------- src/main.rs | 16 +++ 2 files changed, 241 insertions(+), 47 deletions(-) diff --git a/src/clock.rs b/src/clock.rs index ff72ed9..8a38c49 100644 --- a/src/clock.rs +++ b/src/clock.rs @@ -1,31 +1,176 @@ #![warn(clippy::pedantic, clippy::style, clippy::nursery)] #![allow(clippy::question_mark_used)] -use clap::Parser; -use libpt::cli::{args::VerbosityLevel, args::HELP_TEMPLATE, clap}; -use chrono::SubsecRound; +use chrono::{DateTime, Datelike, Local, NaiveDateTime, SubsecRound, Timelike}; +use clap::Parser; +use libpt::cli::args::HELP_TEMPLATE; +use libpt::cli::clap::ArgGroup; +use libpt::cli::{args::VerbosityLevel, clap}; +use libpt::log::{debug, trace}; use ratatui::backend::CrosstermBackend; use ratatui::crossterm::event::{self, poll, Event, KeyCode, KeyModifiers}; use ratatui::layout::{Alignment, Constraint, Direction, Layout, Rect}; use ratatui::style::{Style, Stylize}; -use ratatui::widgets::{Block, Padding, Paragraph}; +use ratatui::widgets::{Block, LineGauge, Padding, Paragraph}; use ratatui::Terminal; use std::io::Stdout; -use std::time::Duration; +use std::time::{Duration, Instant}; + +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum TimeBarLength { + Minute, + Hour, + Custom(i64), + Day, +} + +impl TimeBarLength { + pub(crate) const fn as_secs(self) -> i64 { + match self { + Self::Minute => 60, + Self::Day => 24 * 60 * 60, + Self::Hour => 60 * 60, + Self::Custom(secs) => secs, + } + } +} + +impl Default for TimeBarLength { + fn default() -> Self { + TimeBarLength::Minute + } +} /// Make your terminal into a big clock -#[derive(Parser, Debug, Clone, PartialEq, Eq, Hash)] +#[derive(Parser, Debug, Clone)] #[command(help_template = HELP_TEMPLATE, author, version)] -pub struct Clock { +#[clap(group( ArgGroup::new("timebarlen") .args(&["minute","day", "hour", "custom"]),))] +pub(crate) struct Clock { #[command(flatten)] pub verbose: VerbosityLevel, + /// Show time since start + #[clap(short, long)] + pub timer: bool, + + // timebar options + #[clap(short, long)] + pub minute: bool, + #[clap(short, long)] + pub day: bool, + #[clap(short = 'o', long)] + pub hour: bool, + #[clap(short, long)] + pub custom: Option, + #[clap(skip)] + last_reset: Option>, } impl Clock { + #[must_use] + #[allow(clippy::missing_const_for_fn)] + fn timebar_len(&self) -> Option { + if self.minute { + Some(TimeBarLength::Minute) + } else if self.day { + Some(TimeBarLength::Day) + } else if self.hour { + Some(TimeBarLength::Hour) + } else { + // this feels weird but is the same + self.custom.map(TimeBarLength::Custom) + } + } + + fn timebar_ratio(&self) -> Option { + let len = self.timebar_len()?; + let since = (Local::now() + .signed_duration_since(self.last_reset.unwrap()) + .num_seconds() + + 1) as f64; + Some((since / len.as_secs() as f64).min(1.0).max(0.0)) + } + + fn maybe_reset_since_zero(&mut self) { + if let Some(len) = self.timebar_len() { + trace!("Local Time: {}", Local::now()); + // BUG: these resets trigger multiple times + match len { + TimeBarLength::Custom(_) => { + if Local::now() + .signed_duration_since(self.last_reset.unwrap()) + .num_seconds() + == 0 + { + self.last_reset = Some(Local::now()); + } + } + TimeBarLength::Minute => { + if Local::now().second() == 0 { + self.last_reset = Some(Local::now()); + debug!("reset the time of the time bar (minute)"); + } + } + TimeBarLength::Hour => { + if Local::now().minute() == 0 { + self.last_reset = Some(Local::now()); + debug!("reset the time of the time bar (hour)"); + } + } + TimeBarLength::Day => { + if Local::now().hour() == 0 { + self.last_reset = Some(Local::now()); + debug!("reset the time of the time bar (day)"); + } + } + } + } + } + + fn setup_last_reset(&mut self) { + if let Some(len) = self.timebar_len() { + trace!("Local Time: {}", Local::now()); + match len { + TimeBarLength::Custom(_) => { + self.last_reset = Some(Local::now()); + } + TimeBarLength::Minute => { + self.last_reset = Some( + Local::now() + .with_second(0) + .expect("tried to use a time that does not exist"), + ); + } + TimeBarLength::Hour => { + self.last_reset = Some( + Local::now() + .with_minute(0) + .expect("tried to use a time that does not exist"), + ); + } + TimeBarLength::Day => { + self.last_reset = Some( + Local::now() + .with_hour(0) + .expect("tried to use a time that does not exist"), + ); + } + } + debug!("set up initial last reset as {:#?}", self.last_reset); + } + } + + fn setup(&mut self) -> anyhow::Result<()> { + self.setup_last_reset(); + Ok(()) + } + pub(crate) fn run( - self, + mut self, terminal: &mut Terminal>, ) -> anyhow::Result<()> { + let tick_rate = Duration::from_millis(100); + let mut last_tick = Instant::now(); + self.setup()?; loop { let raw_time = chrono::Local::now().round_subsecs(0); let splits: Vec = raw_time @@ -36,60 +181,93 @@ impl Clock { .collect(); let fdate: String = splits[0].clone(); let ftime: String = splits[1].clone(); - terminal.draw(|frame| { - let root = frame.size(); - let space = Block::bordered() - .padding(Padding::new( - root.width / 8, - root.width / 8, - root.height / 8, - root.height / 8, - )) - .title(env!("CARGO_PKG_NAME")) - .title_bottom(env!("CARGO_PKG_VERSION")) - .title_alignment(Alignment::Center) - .title_style(Style::new().bold()); - let a = space.inner(root); - let parts = Self::partition(a); - let timew = tui_big_text::BigText::builder() - .style(Style::new().red()) - .lines(vec![ftime.into()]) - .alignment(Alignment::Center) - .build() - .expect("could not render time widget"); - let datew = Paragraph::new(fdate) - .blue() - .alignment(Alignment::Left) - .block(Block::new().padding(Padding::new( - parts.0.left(), - parts.0.right() / 3, - 0, - 0, - ))); - frame.render_widget(space, root); - frame.render_widget(timew, parts.1); - frame.render_widget(datew, parts.0); - })?; - if poll(Duration::from_millis(100))? { + self.ui(terminal, ftime, fdate)?; + let timeout = tick_rate.saturating_sub(last_tick.elapsed()); + if poll(timeout)? { if let Event::Key(key) = event::read()? { if key.code == KeyCode::Char('q') || key.code == KeyCode::Esc || (key.modifiers.contains(KeyModifiers::CONTROL) && key.code == KeyCode::Char('c')) { - break; + return Ok(()); } } } + if last_tick.elapsed() >= tick_rate { + self.on_tick(); + last_tick = Instant::now(); + } } + } + fn on_tick(&mut self) { + self.maybe_reset_since_zero(); + } + fn ui( + &self, + terminal: &mut Terminal>, + ftime: String, + fdate: String, + ) -> anyhow::Result<()> { + terminal.draw(|frame| { + let root = frame.size(); + let space = Block::bordered() + .padding(Padding::new( + root.width / 8, + root.width / 8, + root.height / 8, + root.height / 8, + )) + .title(env!("CARGO_PKG_NAME")) + .title_bottom(env!("CARGO_PKG_VERSION")) + .title_alignment(Alignment::Center) + .title_style(Style::new().bold()); + let a = space.inner(root); + let parts = Self::partition(a); + let clockw = tui_big_text::BigText::builder() + .style(Style::new().red()) + .lines(vec![ftime.into()]) + .alignment(Alignment::Center) + .build() + .expect("could not render time widget"); + let datew = Paragraph::new(fdate) + .blue() + .alignment(Alignment::Left) + .block(Block::new().padding(Padding::new( + parts[1].left(), + parts[1].right() / 3, + 0, + 0, + ))); + + frame.render_widget(space, root); + frame.render_widget(clockw, parts[0]); + frame.render_widget(datew, parts[1]); + if self.timebar_len().is_some() { + let timebarw = LineGauge::default() + .block(Block::new().padding(Padding::new( + parts[2].left() / 10, + parts[2].right() / 6, + 0, + 0, + ))) + .ratio(self.timebar_ratio().unwrap()); + debug!("time bar ration: {}", self.timebar_ratio().unwrap()); + frame.render_widget(timebarw, parts[2]); + } + })?; Ok(()) } - fn partition(r: Rect) -> (Rect, Rect) { + fn partition(r: Rect) -> Vec { let part = Layout::default() .direction(Direction::Vertical) - .constraints([Constraint::Percentage(13), Constraint::Min(0)]) + .constraints([Constraint::Percentage(43), Constraint::Min(0)]) .split(r); + let subparts = Layout::default() + .direction(Direction::Horizontal) + .constraints([Constraint::Min(10), Constraint::Ratio(1, 2)]) + .split(part[1]); - (part[0], part[1]) + vec![part[0], subparts[0], subparts[1]] } } diff --git a/src/main.rs b/src/main.rs index dc59d91..20e8a56 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,6 +1,7 @@ use std::io; use libpt::cli::clap::Parser; +use libpt::log::{debug, Level, Logger}; use ratatui::backend::CrosstermBackend; use ratatui::crossterm::event::{DisableMouseCapture, EnableMouseCapture}; use ratatui::crossterm::execute; @@ -16,7 +17,19 @@ mod clock; fn main() -> anyhow::Result<()> { // setup the cli let clock = Clock::parse(); + if clock.verbose.level() >= Level::DEBUG { + let _logger = Logger::builder() + .log_to_file(true) + .log_dir("/tmp/crock/".into()) + .set_level(clock.verbose.level()) + .display_time(false) + .build()?; + } else { + // no logger + } + debug!("set up logger"); + debug!("taking over terminal"); // setup terminal enable_raw_mode()?; let mut stdout = io::stdout(); @@ -24,8 +37,10 @@ fn main() -> anyhow::Result<()> { let backend = CrosstermBackend::new(stdout); let mut terminal = Terminal::new(backend)?; + debug!("entering clock"); let result = clock.run(&mut terminal); + debug!("restoring terminal"); // restore terminal disable_raw_mode()?; execute!( @@ -35,5 +50,6 @@ fn main() -> anyhow::Result<()> { )?; terminal.show_cursor()?; + debug!("done"); result } From 18ca798988fde4797e02d147010fc69f7f406b28 Mon Sep 17 00:00:00 2001 From: PlexSheep Date: Tue, 9 Jul 2024 23:35:57 +0000 Subject: [PATCH 02/40] automatic cargo CI changes --- src/clock.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/clock.rs b/src/clock.rs index 8a38c49..c22456e 100644 --- a/src/clock.rs +++ b/src/clock.rs @@ -1,7 +1,7 @@ #![warn(clippy::pedantic, clippy::style, clippy::nursery)] #![allow(clippy::question_mark_used)] -use chrono::{DateTime, Datelike, Local, NaiveDateTime, SubsecRound, Timelike}; +use chrono::{DateTime, Datelike, Local, SubsecRound, Timelike}; use clap::Parser; use libpt::cli::args::HELP_TEMPLATE; use libpt::cli::clap::ArgGroup; @@ -37,7 +37,7 @@ impl TimeBarLength { impl Default for TimeBarLength { fn default() -> Self { - TimeBarLength::Minute + Self::Minute } } @@ -45,7 +45,7 @@ impl Default for TimeBarLength { #[derive(Parser, Debug, Clone)] #[command(help_template = HELP_TEMPLATE, author, version)] #[clap(group( ArgGroup::new("timebarlen") .args(&["minute","day", "hour", "custom"]),))] -pub(crate) struct Clock { +pub struct Clock { #[command(flatten)] pub verbose: VerbosityLevel, /// Show time since start From 967590d61158b1069c9ddc9c1bbf498163d3be13 Mon Sep 17 00:00:00 2001 From: PlexSheep Date: Wed, 10 Jul 2024 01:39:05 +0200 Subject: [PATCH 03/40] refactor: style timebar and fix custom resets --- src/clock.rs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/clock.rs b/src/clock.rs index 8a38c49..c949329 100644 --- a/src/clock.rs +++ b/src/clock.rs @@ -4,6 +4,7 @@ use chrono::{DateTime, Datelike, Local, NaiveDateTime, SubsecRound, Timelike}; use clap::Parser; use libpt::cli::args::HELP_TEMPLATE; +use libpt::cli::clap::builder::styling::Color; use libpt::cli::clap::ArgGroup; use libpt::cli::{args::VerbosityLevel, clap}; use libpt::log::{debug, trace}; @@ -99,7 +100,7 @@ impl Clock { if Local::now() .signed_duration_since(self.last_reset.unwrap()) .num_seconds() - == 0 + >= len.as_secs() { self.last_reset = Some(Local::now()); } @@ -245,6 +246,8 @@ impl Clock { frame.render_widget(datew, parts[1]); if self.timebar_len().is_some() { let timebarw = LineGauge::default() + .filled_style(Style::default().blue()) + .unfilled_style(Style::default()) .block(Block::new().padding(Padding::new( parts[2].left() / 10, parts[2].right() / 6, From e59725c0d4e91944b844ec349433fa0e9cc96a19 Mon Sep 17 00:00:00 2001 From: PlexSheep Date: Wed, 10 Jul 2024 01:39:49 +0200 Subject: [PATCH 04/40] chore: bump version --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index 2ddba8d..7b3882b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "crock" -version = "0.1.4" +version = "0.2.0-alpha0" edition = "2021" publish = true authors = ["Christoph J. Scherr "] From 681206f8e4a20106b90a6567b6f5f02e34d5c334 Mon Sep 17 00:00:00 2001 From: PlexSheep Date: Tue, 9 Jul 2024 23:40:29 +0000 Subject: [PATCH 05/40] automatic cargo CI changes --- src/clock.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/clock.rs b/src/clock.rs index 3bba61a..f8d1118 100644 --- a/src/clock.rs +++ b/src/clock.rs @@ -4,7 +4,6 @@ use chrono::{DateTime, Datelike, Local, SubsecRound, Timelike}; use clap::Parser; use libpt::cli::args::HELP_TEMPLATE; -use libpt::cli::clap::builder::styling::Color; use libpt::cli::clap::ArgGroup; use libpt::cli::{args::VerbosityLevel, clap}; use libpt::log::{debug, trace}; From a34e15b4e207f9995275817057c6856d4cd0f61d Mon Sep 17 00:00:00 2001 From: PlexSheep Date: Tue, 9 Jul 2024 23:41:17 +0000 Subject: [PATCH 06/40] automatic cargo CI changes --- src/clock.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/clock.rs b/src/clock.rs index 3bba61a..f8d1118 100644 --- a/src/clock.rs +++ b/src/clock.rs @@ -4,7 +4,6 @@ use chrono::{DateTime, Datelike, Local, SubsecRound, Timelike}; use clap::Parser; use libpt::cli::args::HELP_TEMPLATE; -use libpt::cli::clap::builder::styling::Color; use libpt::cli::clap::ArgGroup; use libpt::cli::{args::VerbosityLevel, clap}; use libpt::log::{debug, trace}; From 468a77da993da861fceab1c338e65c963e97bc1d Mon Sep 17 00:00:00 2001 From: PlexSheep Date: Wed, 10 Jul 2024 01:49:50 +0200 Subject: [PATCH 07/40] feat: sunparts fixed length under time --- src/clock.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/clock.rs b/src/clock.rs index f8d1118..72881c8 100644 --- a/src/clock.rs +++ b/src/clock.rs @@ -263,7 +263,7 @@ impl Clock { fn partition(r: Rect) -> Vec { let part = Layout::default() .direction(Direction::Vertical) - .constraints([Constraint::Percentage(43), Constraint::Min(0)]) + .constraints([Constraint::Length(8), Constraint::Min(0)]) .split(r); let subparts = Layout::default() .direction(Direction::Horizontal) From 4da80e8f0ffd8f2c62ad3c5bba19d802bb754ca8 Mon Sep 17 00:00:00 2001 From: "Christoph J. Scherr" Date: Wed, 10 Jul 2024 11:56:27 +0200 Subject: [PATCH 08/40] refactor: move some things around and make them more clear --- src/clock.rs | 41 +++++++++++++++++++++++------------------ src/main.rs | 2 +- 2 files changed, 24 insertions(+), 19 deletions(-) diff --git a/src/clock.rs b/src/clock.rs index 72881c8..580ed6a 100644 --- a/src/clock.rs +++ b/src/clock.rs @@ -83,10 +83,9 @@ impl Clock { fn timebar_ratio(&self) -> Option { let len = self.timebar_len()?; - let since = (Local::now() + let since = Local::now() .signed_duration_since(self.last_reset.unwrap()) - .num_seconds() - + 1) as f64; + .num_seconds() as f64; Some((since / len.as_secs() as f64).min(1.0).max(0.0)) } @@ -94,30 +93,29 @@ impl Clock { if let Some(len) = self.timebar_len() { trace!("Local Time: {}", Local::now()); // BUG: these resets trigger multiple times + let since_last_reset = Local::now().signed_duration_since(self.last_reset.unwrap()); match len { TimeBarLength::Custom(_) => { - if Local::now() - .signed_duration_since(self.last_reset.unwrap()) - .num_seconds() - >= len.as_secs() + if since_last_reset.num_seconds() >= 1 + && since_last_reset.num_seconds() >= len.as_secs() { self.last_reset = Some(Local::now()); } } TimeBarLength::Minute => { - if Local::now().second() == 0 { + if since_last_reset.num_seconds() >= 1 && Local::now().second() == 0 { self.last_reset = Some(Local::now()); debug!("reset the time of the time bar (minute)"); } } TimeBarLength::Hour => { - if Local::now().minute() == 0 { + if since_last_reset.num_minutes() >= 1 && Local::now().minute() == 0 { self.last_reset = Some(Local::now()); debug!("reset the time of the time bar (hour)"); } } TimeBarLength::Day => { - if Local::now().hour() == 0 { + if since_last_reset.num_hours() >= 1 && Local::now().hour() == 0 { self.last_reset = Some(Local::now()); debug!("reset the time of the time bar (day)"); } @@ -181,7 +179,8 @@ impl Clock { .collect(); let fdate: String = splits[0].clone(); let ftime: String = splits[1].clone(); - self.ui(terminal, ftime, fdate)?; + let timebar_ratio = self.timebar_ratio(); + self.ui(terminal, ftime, fdate, timebar_ratio)?; let timeout = tick_rate.saturating_sub(last_tick.elapsed()); if poll(timeout)? { if let Event::Key(key) = event::read()? { @@ -208,6 +207,7 @@ impl Clock { terminal: &mut Terminal>, ftime: String, fdate: String, + timebar_ratio: Option, ) -> anyhow::Result<()> { terminal.draw(|frame| { let root = frame.size(); @@ -241,10 +241,8 @@ impl Clock { ))); frame.render_widget(space, root); - frame.render_widget(clockw, parts[0]); - frame.render_widget(datew, parts[1]); - if self.timebar_len().is_some() { - let timebarw = LineGauge::default() + let timebarw: Option = if self.timebar_len().is_some() { + let tmp = LineGauge::default() .filled_style(Style::default().blue()) .unfilled_style(Style::default()) .block(Block::new().padding(Padding::new( @@ -253,10 +251,17 @@ impl Clock { 0, 0, ))) - .ratio(self.timebar_ratio().unwrap()); + .ratio(timebar_ratio.unwrap()); debug!("time bar ration: {}", self.timebar_ratio().unwrap()); - frame.render_widget(timebarw, parts[2]); - } + Some(tmp) + } else { + None + }; + debug!("rendering the configured widgets"); + frame.render_widget(clockw, parts[0]); + frame.render_widget(&timebarw, parts[2]); + frame.render_widget(datew, parts[1]); + debug!("done rendering"); })?; Ok(()) } diff --git a/src/main.rs b/src/main.rs index 20e8a56..80091a1 100644 --- a/src/main.rs +++ b/src/main.rs @@ -22,7 +22,7 @@ fn main() -> anyhow::Result<()> { .log_to_file(true) .log_dir("/tmp/crock/".into()) .set_level(clock.verbose.level()) - .display_time(false) + .display_time(true) .build()?; } else { // no logger From 217b8f2f8577c45309a54802fe2434eefe3fffee Mon Sep 17 00:00:00 2001 From: "Christoph J. Scherr" Date: Wed, 10 Jul 2024 11:56:48 +0200 Subject: [PATCH 09/40] fix: sync timebar with clock with a horrible hack --- src/clock.rs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/clock.rs b/src/clock.rs index 580ed6a..0601de9 100644 --- a/src/clock.rs +++ b/src/clock.rs @@ -259,6 +259,9 @@ impl Clock { }; debug!("rendering the configured widgets"); frame.render_widget(clockw, parts[0]); + sleep(500); // HACK: through black magic, this works around the problem that the time bar is + // not rendered at the same time as the clock, and yes, it needs to be + // 500ms for some reason, and yes it makes starting the app slower frame.render_widget(&timebarw, parts[2]); frame.render_widget(datew, parts[1]); debug!("done rendering"); @@ -278,3 +281,7 @@ impl Clock { vec![part[0], subparts[0], subparts[1]] } } + +fn sleep(ms: u64) { + std::thread::sleep(std::time::Duration::from_millis(ms)); +} From 107092b55848ad5924b7c069e02ad58dccb0004b Mon Sep 17 00:00:00 2001 From: "Christoph J. Scherr" Date: Wed, 10 Jul 2024 12:39:25 +0200 Subject: [PATCH 10/40] refactor(data): add UiData struct and remove the hacky fix that broke --- src/clock.rs | 74 +++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 61 insertions(+), 13 deletions(-) diff --git a/src/clock.rs b/src/clock.rs index 0601de9..d634e83 100644 --- a/src/clock.rs +++ b/src/clock.rs @@ -65,6 +65,52 @@ pub struct Clock { last_reset: Option>, } +#[derive(Debug, Clone, PartialEq, Default)] +pub(crate) struct UiData { + fdate: [String; 2], + ftime: [String; 2], + timebar_ratio: [Option; 2], + + data_idx: usize, +} + +impl UiData { + pub fn update(&mut self, fdate: String, ftime: String, timebar_ratio: Option) { + self.data_idx ^= 1; + self.fdate[self.data_idx] = fdate; + self.ftime[self.data_idx] = ftime; + self.timebar_ratio[self.data_idx] = timebar_ratio; + } + + /// did the data change with the last update? + #[must_use] + #[inline] + pub fn changed(&self) -> bool { + !(self.fdate[0] == self.fdate[1] + && self.ftime[0] == self.fdate[1] + && self.timebar_ratio[0] == self.timebar_ratio[1]) + } + + #[must_use] + #[inline] + pub(crate) fn fdate(&self) -> &str { + &self.fdate[self.data_idx] + } + + #[must_use] + #[inline] + pub(crate) fn ftime(&self) -> &str { + &self.ftime[self.data_idx] + } + + #[must_use] + #[inline] + #[allow(clippy::missing_const_for_fn)] // no it's not const + pub(crate) fn timebar_ratio(&self) -> Option { + self.timebar_ratio[self.data_idx] + } +} + impl Clock { #[must_use] #[allow(clippy::missing_const_for_fn)] @@ -168,6 +214,7 @@ impl Clock { ) -> anyhow::Result<()> { let tick_rate = Duration::from_millis(100); let mut last_tick = Instant::now(); + let mut uidata: UiData = UiData::default(); self.setup()?; loop { let raw_time = chrono::Local::now().round_subsecs(0); @@ -177,10 +224,11 @@ impl Clock { .split_whitespace() .map(str::to_string) .collect(); - let fdate: String = splits[0].clone(); - let ftime: String = splits[1].clone(); - let timebar_ratio = self.timebar_ratio(); - self.ui(terminal, ftime, fdate, timebar_ratio)?; + + uidata.update(splits[0].clone(), splits[1].clone(), self.timebar_ratio()); + if uidata.changed() { + self.ui(terminal, &uidata)?; + } let timeout = tick_rate.saturating_sub(last_tick.elapsed()); if poll(timeout)? { if let Event::Key(key) = event::read()? { @@ -205,9 +253,7 @@ impl Clock { fn ui( &self, terminal: &mut Terminal>, - ftime: String, - fdate: String, - timebar_ratio: Option, + data: &UiData, ) -> anyhow::Result<()> { terminal.draw(|frame| { let root = frame.size(); @@ -226,11 +272,11 @@ impl Clock { let parts = Self::partition(a); let clockw = tui_big_text::BigText::builder() .style(Style::new().red()) - .lines(vec![ftime.into()]) + .lines(vec![data.ftime().into()]) .alignment(Alignment::Center) .build() .expect("could not render time widget"); - let datew = Paragraph::new(fdate) + let datew = Paragraph::new(data.fdate()) .blue() .alignment(Alignment::Left) .block(Block::new().padding(Padding::new( @@ -251,19 +297,21 @@ impl Clock { 0, 0, ))) - .ratio(timebar_ratio.unwrap()); + .ratio(data.timebar_ratio().unwrap()); debug!("time bar ration: {}", self.timebar_ratio().unwrap()); Some(tmp) } else { None }; debug!("rendering the configured widgets"); + #[cfg(debug_assertions)] + let prerender = Instant::now(); frame.render_widget(clockw, parts[0]); - sleep(500); // HACK: through black magic, this works around the problem that the time bar is - // not rendered at the same time as the clock, and yes, it needs to be - // 500ms for some reason, and yes it makes starting the app slower + trace!("{:?} after render clockw", prerender.elapsed()); frame.render_widget(&timebarw, parts[2]); + trace!("{:?} after render timebarw", prerender.elapsed()); frame.render_widget(datew, parts[1]); + trace!("{:?} to render all widgets", prerender.elapsed()); debug!("done rendering"); })?; Ok(()) From 7be6df7aa545692a91f28efe7d8e93f2c5f44725 Mon Sep 17 00:00:00 2001 From: cscherrNT Date: Wed, 10 Jul 2024 10:40:51 +0000 Subject: [PATCH 11/40] automatic cargo CI changes --- src/clock.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/clock.rs b/src/clock.rs index d634e83..ee51bcb 100644 --- a/src/clock.rs +++ b/src/clock.rs @@ -66,7 +66,7 @@ pub struct Clock { } #[derive(Debug, Clone, PartialEq, Default)] -pub(crate) struct UiData { +pub struct UiData { fdate: [String; 2], ftime: [String; 2], timebar_ratio: [Option; 2], From 2be3470587b10a66ebd90c8a6766b026f3cba987 Mon Sep 17 00:00:00 2001 From: "Christoph J. Scherr" Date: Wed, 10 Jul 2024 14:57:59 +0200 Subject: [PATCH 12/40] fix: sync timebar with clock --- src/clock.rs | 73 ++++++++++++++++++++++++++++------------------------ 1 file changed, 40 insertions(+), 33 deletions(-) diff --git a/src/clock.rs b/src/clock.rs index d634e83..786f06d 100644 --- a/src/clock.rs +++ b/src/clock.rs @@ -14,6 +14,7 @@ use ratatui::style::{Style, Stylize}; use ratatui::widgets::{Block, LineGauge, Padding, Paragraph}; use ratatui::Terminal; use std::io::Stdout; +use std::thread::{sleep, sleep_ms}; use std::time::{Duration, Instant}; #[derive(Debug, Clone, Copy, PartialEq, Eq)] @@ -80,15 +81,24 @@ impl UiData { self.fdate[self.data_idx] = fdate; self.ftime[self.data_idx] = ftime; self.timebar_ratio[self.data_idx] = timebar_ratio; + trace!( + "data after update: {:#?}\nconsidered changed: {}", + self, + self.changed() + ); } /// did the data change with the last update? #[must_use] #[inline] pub fn changed(&self) -> bool { - !(self.fdate[0] == self.fdate[1] - && self.ftime[0] == self.fdate[1] - && self.timebar_ratio[0] == self.timebar_ratio[1]) + let r = + self.fdate[0] != self.fdate[1] || self.ftime[0] != self.ftime[1] + //&& self.timebar_ratio[0] == self.timebar_ratio[1] + // NOTE: the timebar ratio is discarded, so that we only render the ui when the time (second) changes + ; + trace!("changed: {r}"); + r } #[must_use] @@ -255,7 +265,14 @@ impl Clock { terminal: &mut Terminal>, data: &UiData, ) -> anyhow::Result<()> { + let clockw = tui_big_text::BigText::builder() + .style(Style::new().red()) + .lines(vec![data.ftime().into()]) + .alignment(Alignment::Center) + .build() + .expect("could not render time widget"); terminal.draw(|frame| { + debug!("rendering the ui"); let root = frame.size(); let space = Block::bordered() .padding(Padding::new( @@ -269,25 +286,14 @@ impl Clock { .title_alignment(Alignment::Center) .title_style(Style::new().bold()); let a = space.inner(root); - let parts = Self::partition(a); - let clockw = tui_big_text::BigText::builder() - .style(Style::new().red()) - .lines(vec![data.ftime().into()]) - .alignment(Alignment::Center) - .build() - .expect("could not render time widget"); - let datew = Paragraph::new(data.fdate()) - .blue() - .alignment(Alignment::Left) - .block(Block::new().padding(Padding::new( - parts[1].left(), - parts[1].right() / 3, - 0, - 0, - ))); - frame.render_widget(space, root); + let parts = Self::partition(a); + + // render the timebar which counts up to the full minute and so on + // + // Will not be rendered if it is None let timebarw: Option = if self.timebar_len().is_some() { + debug!("time bar ration: {:?}", data.timebar_ratio()); let tmp = LineGauge::default() .filled_style(Style::default().blue()) .unfilled_style(Style::default()) @@ -298,22 +304,27 @@ impl Clock { 0, ))) .ratio(data.timebar_ratio().unwrap()); - debug!("time bar ration: {}", self.timebar_ratio().unwrap()); Some(tmp) } else { None }; - debug!("rendering the configured widgets"); - #[cfg(debug_assertions)] - let prerender = Instant::now(); - frame.render_widget(clockw, parts[0]); - trace!("{:?} after render clockw", prerender.elapsed()); + + // render the small date + let datew = Paragraph::new(data.fdate()) + .blue() + .alignment(Alignment::Left) + .block(Block::new().padding(Padding::new( + parts[1].left(), + parts[1].right() / 3, + 0, + 0, + ))); frame.render_widget(&timebarw, parts[2]); - trace!("{:?} after render timebarw", prerender.elapsed()); frame.render_widget(datew, parts[1]); - trace!("{:?} to render all widgets", prerender.elapsed()); - debug!("done rendering"); + // render the clock + frame.render_widget(clockw, parts[0]); })?; + debug!("done rendering the ui"); Ok(()) } fn partition(r: Rect) -> Vec { @@ -329,7 +340,3 @@ impl Clock { vec![part[0], subparts[0], subparts[1]] } } - -fn sleep(ms: u64) { - std::thread::sleep(std::time::Duration::from_millis(ms)); -} From dbb1cfa0d03c50b9e7758238cf7a47230d3a3992 Mon Sep 17 00:00:00 2001 From: "Christoph J. Scherr" Date: Wed, 10 Jul 2024 14:57:59 +0200 Subject: [PATCH 13/40] fix: sync timebar with clock #9 --- src/clock.rs | 79 +++++++++++++++++++++++++++++----------------------- 1 file changed, 44 insertions(+), 35 deletions(-) diff --git a/src/clock.rs b/src/clock.rs index d634e83..fb0d0ba 100644 --- a/src/clock.rs +++ b/src/clock.rs @@ -80,15 +80,24 @@ impl UiData { self.fdate[self.data_idx] = fdate; self.ftime[self.data_idx] = ftime; self.timebar_ratio[self.data_idx] = timebar_ratio; + trace!( + "data after update: {:#?}\nconsidered changed: {}", + self, + self.changed() + ); } /// did the data change with the last update? #[must_use] #[inline] pub fn changed(&self) -> bool { - !(self.fdate[0] == self.fdate[1] - && self.ftime[0] == self.fdate[1] - && self.timebar_ratio[0] == self.timebar_ratio[1]) + let r = + self.fdate[0] != self.fdate[1] || self.ftime[0] != self.ftime[1] + //&& self.timebar_ratio[0] == self.timebar_ratio[1] + // NOTE: the timebar ratio is discarded, so that we only render the ui when the time (second) changes + ; + trace!("changed: {r}"); + r } #[must_use] @@ -127,11 +136,14 @@ impl Clock { } } + // FIXME: This generally works, but we want 0% at the start and 100% at the end, which does not + // fully work. + // We also want 50% at the half etc fn timebar_ratio(&self) -> Option { let len = self.timebar_len()?; - let since = Local::now() + let since = (Local::now() .signed_duration_since(self.last_reset.unwrap()) - .num_seconds() as f64; + .num_seconds()+1) as f64; Some((since / len.as_secs() as f64).min(1.0).max(0.0)) } @@ -255,7 +267,14 @@ impl Clock { terminal: &mut Terminal>, data: &UiData, ) -> anyhow::Result<()> { + let clockw = tui_big_text::BigText::builder() + .style(Style::new().red()) + .lines(vec![data.ftime().into()]) + .alignment(Alignment::Center) + .build() + .expect("could not render time widget"); terminal.draw(|frame| { + debug!("rendering the ui"); let root = frame.size(); let space = Block::bordered() .padding(Padding::new( @@ -269,25 +288,14 @@ impl Clock { .title_alignment(Alignment::Center) .title_style(Style::new().bold()); let a = space.inner(root); - let parts = Self::partition(a); - let clockw = tui_big_text::BigText::builder() - .style(Style::new().red()) - .lines(vec![data.ftime().into()]) - .alignment(Alignment::Center) - .build() - .expect("could not render time widget"); - let datew = Paragraph::new(data.fdate()) - .blue() - .alignment(Alignment::Left) - .block(Block::new().padding(Padding::new( - parts[1].left(), - parts[1].right() / 3, - 0, - 0, - ))); - frame.render_widget(space, root); + let parts = Self::partition(a); + + // render the timebar which counts up to the full minute and so on + // + // Will not be rendered if it is None let timebarw: Option = if self.timebar_len().is_some() { + debug!("time bar ration: {:?}", data.timebar_ratio()); let tmp = LineGauge::default() .filled_style(Style::default().blue()) .unfilled_style(Style::default()) @@ -298,22 +306,27 @@ impl Clock { 0, ))) .ratio(data.timebar_ratio().unwrap()); - debug!("time bar ration: {}", self.timebar_ratio().unwrap()); Some(tmp) } else { None }; - debug!("rendering the configured widgets"); - #[cfg(debug_assertions)] - let prerender = Instant::now(); - frame.render_widget(clockw, parts[0]); - trace!("{:?} after render clockw", prerender.elapsed()); + + // render the small date + let datew = Paragraph::new(data.fdate()) + .blue() + .alignment(Alignment::Left) + .block(Block::new().padding(Padding::new( + parts[1].left(), + parts[1].right() / 3, + 0, + 0, + ))); frame.render_widget(&timebarw, parts[2]); - trace!("{:?} after render timebarw", prerender.elapsed()); frame.render_widget(datew, parts[1]); - trace!("{:?} to render all widgets", prerender.elapsed()); - debug!("done rendering"); + // render the clock + frame.render_widget(clockw, parts[0]); })?; + debug!("done rendering the ui"); Ok(()) } fn partition(r: Rect) -> Vec { @@ -329,7 +342,3 @@ impl Clock { vec![part[0], subparts[0], subparts[1]] } } - -fn sleep(ms: u64) { - std::thread::sleep(std::time::Duration::from_millis(ms)); -} From d6183246a64f5d8f85176abdb553a4cd2e42b032 Mon Sep 17 00:00:00 2001 From: "Christoph J. Scherr" Date: Wed, 10 Jul 2024 15:04:07 +0200 Subject: [PATCH 14/40] chore: change a fixme --- src/clock.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/clock.rs b/src/clock.rs index 36174fd..12d36d8 100644 --- a/src/clock.rs +++ b/src/clock.rs @@ -138,8 +138,7 @@ impl Clock { } // FIXME: This generally works, but we want 0% at the start and 100% at the end, which does not - // fully work. - // We also want 50% at the half etc + // fully work. We also want 50% at the half etc. #10 fn timebar_ratio(&self) -> Option { let len = self.timebar_len()?; let since = (Local::now() From d6d9e32c735619efb1acc8facf54d6bf8998bdb9 Mon Sep 17 00:00:00 2001 From: "Christoph J. Scherr" Date: Wed, 10 Jul 2024 15:07:41 +0200 Subject: [PATCH 15/40] chore: change a format because rustfmt errored --- src/clock.rs | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/src/clock.rs b/src/clock.rs index 12d36d8..f37709c 100644 --- a/src/clock.rs +++ b/src/clock.rs @@ -92,11 +92,9 @@ impl UiData { #[must_use] #[inline] pub fn changed(&self) -> bool { - let r = - self.fdate[0] != self.fdate[1] || self.ftime[0] != self.ftime[1] - //&& self.timebar_ratio[0] == self.timebar_ratio[1] - // NOTE: the timebar ratio is discarded, so that we only render the ui when the time (second) changes - ; + // NOTE: the timebar ratio is discarded, so that we only render the ui when the time + // (second) changes + let r = self.fdate[0] != self.fdate[1] || self.ftime[0] != self.ftime[1]; trace!("changed: {r}"); r } @@ -137,13 +135,14 @@ impl Clock { } } - // FIXME: This generally works, but we want 0% at the start and 100% at the end, which does not + // FIXME: This generally works, but we want 0% at the start and 100% at the end, which does not // fully work. We also want 50% at the half etc. #10 fn timebar_ratio(&self) -> Option { let len = self.timebar_len()?; let since = (Local::now() .signed_duration_since(self.last_reset.unwrap()) - .num_seconds()+1) as f64; + .num_seconds() + + 1) as f64; Some((since / len.as_secs() as f64).min(1.0).max(0.0)) } From 04869baf22e4af7116c875b0ec5bbb0ee3a1af6e Mon Sep 17 00:00:00 2001 From: cscherrNT Date: Wed, 10 Jul 2024 13:09:04 +0000 Subject: [PATCH 16/40] automatic cargo CI changes --- src/clock.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/clock.rs b/src/clock.rs index f37709c..c82a2fc 100644 --- a/src/clock.rs +++ b/src/clock.rs @@ -14,7 +14,6 @@ use ratatui::style::{Style, Stylize}; use ratatui::widgets::{Block, LineGauge, Padding, Paragraph}; use ratatui::Terminal; use std::io::Stdout; -use std::thread::{sleep, sleep_ms}; use std::time::{Duration, Instant}; #[derive(Debug, Clone, Copy, PartialEq, Eq)] From bab3be0a8a5968e25434f3a7252d81947d9d4bdb Mon Sep 17 00:00:00 2001 From: "Christoph J. Scherr" Date: Wed, 10 Jul 2024 15:13:28 +0200 Subject: [PATCH 17/40] chore: make version semver compliant again --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index 7b3882b..9997367 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "crock" -version = "0.2.0-alpha0" +version = "0.2.0-alpha.0" edition = "2021" publish = true authors = ["Christoph J. Scherr "] From 80210bd181be6c93aa164f1cdf86650c9f1800b6 Mon Sep 17 00:00:00 2001 From: "Christoph J. Scherr" Date: Wed, 10 Jul 2024 15:17:25 +0200 Subject: [PATCH 18/40] refactor: address clippy warnings --- src/clock.rs | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/clock.rs b/src/clock.rs index c82a2fc..307909e 100644 --- a/src/clock.rs +++ b/src/clock.rs @@ -1,7 +1,7 @@ #![warn(clippy::pedantic, clippy::style, clippy::nursery)] #![allow(clippy::question_mark_used)] -use chrono::{DateTime, Datelike, Local, SubsecRound, Timelike}; +use chrono::{DateTime, Local, SubsecRound, Timelike}; use clap::Parser; use libpt::cli::args::HELP_TEMPLATE; use libpt::cli::clap::ArgGroup; @@ -45,6 +45,8 @@ impl Default for TimeBarLength { #[derive(Parser, Debug, Clone)] #[command(help_template = HELP_TEMPLATE, author, version)] #[clap(group( ArgGroup::new("timebarlen") .args(&["minute","day", "hour", "custom"]),))] +#[allow(clippy::struct_excessive_bools)] // the struct is for cli parsing and we already use an + // ArgGroup pub struct Clock { #[command(flatten)] pub verbose: VerbosityLevel, @@ -136,13 +138,15 @@ impl Clock { // FIXME: This generally works, but we want 0% at the start and 100% at the end, which does not // fully work. We also want 50% at the half etc. #10 + #[allow(clippy::cast_precision_loss)] // okay, good to know, but I accept the loss. It + // shouldn't come to more than 2^52 seconds anyway fn timebar_ratio(&self) -> Option { let len = self.timebar_len()?; let since = (Local::now() .signed_duration_since(self.last_reset.unwrap()) .num_seconds() + 1) as f64; - Some((since / len.as_secs() as f64).min(1.0).max(0.0)) + Some((since / len.as_secs() as f64).clamp(0.0, 1.0)) } fn maybe_reset_since_zero(&mut self) { @@ -213,6 +217,7 @@ impl Clock { } } + #[allow(clippy::unnecessary_wraps)] // we have that to be future proof fn setup(&mut self) -> anyhow::Result<()> { self.setup_last_reset(); Ok(()) From cdc912b7bf575a73dfe9e254b018d5507cf32d13 Mon Sep 17 00:00:00 2001 From: "Christoph J. Scherr" Date: Wed, 10 Jul 2024 15:19:31 +0200 Subject: [PATCH 19/40] chore: remove old todo comments --- src/clock.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/clock.rs b/src/clock.rs index 307909e..6452cdf 100644 --- a/src/clock.rs +++ b/src/clock.rs @@ -93,7 +93,7 @@ impl UiData { #[must_use] #[inline] pub fn changed(&self) -> bool { - // NOTE: the timebar ratio is discarded, so that we only render the ui when the time + // the timebar ratio is discarded, so that we only render the ui when the time // (second) changes let r = self.fdate[0] != self.fdate[1] || self.ftime[0] != self.ftime[1]; trace!("changed: {r}"); @@ -152,7 +152,6 @@ impl Clock { fn maybe_reset_since_zero(&mut self) { if let Some(len) = self.timebar_len() { trace!("Local Time: {}", Local::now()); - // BUG: these resets trigger multiple times let since_last_reset = Local::now().signed_duration_since(self.last_reset.unwrap()); match len { TimeBarLength::Custom(_) => { From c316e71d465ca89496dac155e166b9320d21c26b Mon Sep 17 00:00:00 2001 From: PlexSheep Date: Thu, 11 Jul 2024 16:16:25 +0200 Subject: [PATCH 20/40] fix: add one second to the live timebar_ratio now time to align percentages with expectations #10 --- src/clock.rs | 65 +++++++++++++++++++++++++++++++++------------------- src/main.rs | 38 ++++++++++++++++++++++++++++++ 2 files changed, 79 insertions(+), 24 deletions(-) diff --git a/src/clock.rs b/src/clock.rs index 6452cdf..220682e 100644 --- a/src/clock.rs +++ b/src/clock.rs @@ -1,12 +1,12 @@ #![warn(clippy::pedantic, clippy::style, clippy::nursery)] #![allow(clippy::question_mark_used)] -use chrono::{DateTime, Local, SubsecRound, Timelike}; +use chrono::{DateTime, Local, SubsecRound, TimeZone, Timelike}; use clap::Parser; use libpt::cli::args::HELP_TEMPLATE; use libpt::cli::clap::ArgGroup; use libpt::cli::{args::VerbosityLevel, clap}; -use libpt::log::{debug, trace}; +use libpt::log::{debug, info, trace}; use ratatui::backend::CrosstermBackend; use ratatui::crossterm::event::{self, poll, Event, KeyCode, KeyModifiers}; use ratatui::layout::{Alignment, Constraint, Direction, Layout, Rect}; @@ -64,7 +64,7 @@ pub struct Clock { #[clap(short, long)] pub custom: Option, #[clap(skip)] - last_reset: Option>, + pub(crate) last_reset: Option>, } #[derive(Debug, Clone, PartialEq, Default)] @@ -82,11 +82,10 @@ impl UiData { self.fdate[self.data_idx] = fdate; self.ftime[self.data_idx] = ftime; self.timebar_ratio[self.data_idx] = timebar_ratio; - trace!( - "data after update: {:#?}\nconsidered changed: {}", - self, - self.changed() - ); + #[cfg(debug_assertions)] + if self.changed() { + trace!("update with change: {:#?}", self); + } } /// did the data change with the last update? @@ -95,27 +94,25 @@ impl UiData { pub fn changed(&self) -> bool { // the timebar ratio is discarded, so that we only render the ui when the time // (second) changes - let r = self.fdate[0] != self.fdate[1] || self.ftime[0] != self.ftime[1]; - trace!("changed: {r}"); - r + self.fdate[0] != self.fdate[1] || self.ftime[0] != self.ftime[1] } #[must_use] #[inline] - pub(crate) fn fdate(&self) -> &str { + pub fn fdate(&self) -> &str { &self.fdate[self.data_idx] } #[must_use] #[inline] - pub(crate) fn ftime(&self) -> &str { + pub fn ftime(&self) -> &str { &self.ftime[self.data_idx] } #[must_use] #[inline] #[allow(clippy::missing_const_for_fn)] // no it's not const - pub(crate) fn timebar_ratio(&self) -> Option { + pub fn timebar_ratio(&self) -> Option { self.timebar_ratio[self.data_idx] } } @@ -136,22 +133,22 @@ impl Clock { } } - // FIXME: This generally works, but we want 0% at the start and 100% at the end, which does not - // fully work. We also want 50% at the half etc. #10 #[allow(clippy::cast_precision_loss)] // okay, good to know, but I accept the loss. It // shouldn't come to more than 2^52 seconds anyway - fn timebar_ratio(&self) -> Option { + pub(crate) fn timebar_ratio(&self, current_time: DateTime) -> Option { let len = self.timebar_len()?; - let since = (Local::now() + let since = current_time .signed_duration_since(self.last_reset.unwrap()) - .num_seconds() - + 1) as f64; + .num_seconds() as f64; + #[cfg(debug_assertions)] + if since < 1.0 { + trace!("ratio calculation since is now <1: {:#?}", since); + } Some((since / len.as_secs() as f64).clamp(0.0, 1.0)) } - fn maybe_reset_since_zero(&mut self) { + pub(crate) fn maybe_reset_since_zero(&mut self) { if let Some(len) = self.timebar_len() { - trace!("Local Time: {}", Local::now()); let since_last_reset = Local::now().signed_duration_since(self.last_reset.unwrap()); match len { TimeBarLength::Custom(_) => { @@ -217,7 +214,7 @@ impl Clock { } #[allow(clippy::unnecessary_wraps)] // we have that to be future proof - fn setup(&mut self) -> anyhow::Result<()> { + pub(crate) fn setup(&mut self) -> anyhow::Result<()> { self.setup_last_reset(); Ok(()) } @@ -239,7 +236,27 @@ impl Clock { .map(str::to_string) .collect(); - uidata.update(splits[0].clone(), splits[1].clone(), self.timebar_ratio()); + // We somehow fill timebar_ratio with a bad value here if we don't add 1 second. It's + // always the value that would be right for now-1s. The start of the minute is + // special, with this strategy it is 100%. #10 + // + // If we manually add a second, it works as expected, but it feels weird. We use the + // same time for all of the datapoints here, so it can't be because of time diff in + // calculation. I noticed that we don't start at 0% this way (with len=minute) + // . Normally, chrono does not include 60 seconds, only letting it range between 0 and + // 59. This makes sense but feels weird to the human understanding, of course there are + // seconds in a minute! If we do it this way, we don't quite start at 0%, but 100%, + // which feels correct. + // + // In short: if we add a second here, we get the correct percentages. 01:00 is 100%, + // 01:30 is 50%, 01:59 is 98%, 01:60 does not exist because that's how counting from + // 0 works. + + uidata.update( + splits[0].clone(), + splits[1].clone(), + self.timebar_ratio(raw_time + chrono::Duration::seconds(1)), + ); if uidata.changed() { self.ui(terminal, &uidata)?; } diff --git a/src/main.rs b/src/main.rs index 80091a1..065a46b 100644 --- a/src/main.rs +++ b/src/main.rs @@ -29,6 +29,9 @@ fn main() -> anyhow::Result<()> { } debug!("set up logger"); + #[cfg(debug_assertions)] + mock_tests(); + debug!("taking over terminal"); // setup terminal enable_raw_mode()?; @@ -53,3 +56,38 @@ fn main() -> anyhow::Result<()> { debug!("done"); result } + +#[cfg(debug_assertions)] +#[allow(clippy::cast_precision_loss)] +fn mock_tests() { + use chrono::{Local, Timelike}; + use libpt::log::info; + + use self::clock::UiData; + info!("doing the mock tests"); + { + let mut c = Clock::parse_from(["some exec", "-mvvv"]); + let now = Local::now(); + c.last_reset = Some(now.with_second(0).unwrap()); + + assert_eq!(c.timebar_ratio(now.with_second(30).unwrap()), Some(0.5)); + info!("30s=0.5"); + assert_eq!( + c.timebar_ratio(now.with_second(59).unwrap()), + Some(0.9833333333333333) + ); + info!("60s=1.0"); + assert_eq!(c.timebar_ratio(now.with_second(0).unwrap()), Some(0.0)); + info!("0s=0.0"); + } + { + let mut data = UiData::default(); + data.update("date".to_owned(), "time".to_owned(), Some(0.1)); + assert_eq!(data.timebar_ratio(), Some(0.1)); + data.update("date".to_owned(), "time".to_owned(), Some(0.2)); + assert_eq!(data.timebar_ratio(), Some(0.2)); + data.update("date".to_owned(), "time".to_owned(), Some(0.3)); + assert_eq!(data.timebar_ratio(), Some(0.3)); + } + info!("finished the mock tests"); +} From 35b357097476f47491f4ac70c2948b5d8a389d96 Mon Sep 17 00:00:00 2001 From: PlexSheep Date: Thu, 11 Jul 2024 14:57:19 +0000 Subject: [PATCH 21/40] automatic cargo CI changes --- src/clock.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/clock.rs b/src/clock.rs index 220682e..5c7e8bd 100644 --- a/src/clock.rs +++ b/src/clock.rs @@ -1,12 +1,12 @@ #![warn(clippy::pedantic, clippy::style, clippy::nursery)] #![allow(clippy::question_mark_used)] -use chrono::{DateTime, Local, SubsecRound, TimeZone, Timelike}; +use chrono::{DateTime, Local, SubsecRound, Timelike}; use clap::Parser; use libpt::cli::args::HELP_TEMPLATE; use libpt::cli::clap::ArgGroup; use libpt::cli::{args::VerbosityLevel, clap}; -use libpt::log::{debug, info, trace}; +use libpt::log::{debug, trace}; use ratatui::backend::CrosstermBackend; use ratatui::crossterm::event::{self, poll, Event, KeyCode, KeyModifiers}; use ratatui::layout::{Alignment, Constraint, Direction, Layout, Rect}; From 260ee4c562cca5529d135e6e2c240afe073e434b Mon Sep 17 00:00:00 2001 From: "Christoph J. Scherr" Date: Thu, 11 Jul 2024 17:07:59 +0200 Subject: [PATCH 22/40] feat(countup): simple countup that stays at 100% after finish #1 --- src/clock.rs | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/src/clock.rs b/src/clock.rs index 220682e..9a95849 100644 --- a/src/clock.rs +++ b/src/clock.rs @@ -1,12 +1,12 @@ #![warn(clippy::pedantic, clippy::style, clippy::nursery)] #![allow(clippy::question_mark_used)] -use chrono::{DateTime, Local, SubsecRound, TimeZone, Timelike}; +use chrono::{DateTime, Local, SubsecRound, Timelike}; use clap::Parser; use libpt::cli::args::HELP_TEMPLATE; use libpt::cli::clap::ArgGroup; use libpt::cli::{args::VerbosityLevel, clap}; -use libpt::log::{debug, info, trace}; +use libpt::log::{debug, trace}; use ratatui::backend::CrosstermBackend; use ratatui::crossterm::event::{self, poll, Event, KeyCode, KeyModifiers}; use ratatui::layout::{Alignment, Constraint, Direction, Layout, Rect}; @@ -21,6 +21,9 @@ pub enum TimeBarLength { Minute, Hour, Custom(i64), + /// implementing a bar that would grow smaller would be weird, so it's a count up instead of + /// a countdown + Countup(i64), Day, } @@ -31,6 +34,7 @@ impl TimeBarLength { Self::Day => 24 * 60 * 60, Self::Hour => 60 * 60, Self::Custom(secs) => secs, + Self::Countup(secs) => secs, } } } @@ -44,7 +48,7 @@ impl Default for TimeBarLength { /// Make your terminal into a big clock #[derive(Parser, Debug, Clone)] #[command(help_template = HELP_TEMPLATE, author, version)] -#[clap(group( ArgGroup::new("timebarlen") .args(&["minute","day", "hour", "custom"]),))] +#[clap(group( ArgGroup::new("timebarlen") .args(&["minute","day", "hour", "custom", "count_up"]),))] #[allow(clippy::struct_excessive_bools)] // the struct is for cli parsing and we already use an // ArgGroup pub struct Clock { @@ -63,6 +67,8 @@ pub struct Clock { pub hour: bool, #[clap(short, long)] pub custom: Option, + #[clap(short = 'u', long)] + pub count_up: Option, #[clap(skip)] pub(crate) last_reset: Option>, } @@ -127,6 +133,8 @@ impl Clock { Some(TimeBarLength::Day) } else if self.hour { Some(TimeBarLength::Hour) + } else if self.count_up.is_some() { + self.count_up.map(TimeBarLength::Countup) } else { // this feels weird but is the same self.custom.map(TimeBarLength::Custom) @@ -151,6 +159,9 @@ impl Clock { if let Some(len) = self.timebar_len() { let since_last_reset = Local::now().signed_duration_since(self.last_reset.unwrap()); match len { + TimeBarLength::Countup(_) => { + // the count up should not reset. If the time is over, just keep it at 100% + } TimeBarLength::Custom(_) => { if since_last_reset.num_seconds() >= 1 && since_last_reset.num_seconds() >= len.as_secs() @@ -184,7 +195,7 @@ impl Clock { if let Some(len) = self.timebar_len() { trace!("Local Time: {}", Local::now()); match len { - TimeBarLength::Custom(_) => { + TimeBarLength::Custom(_) | TimeBarLength::Countup(_) => { self.last_reset = Some(Local::now()); } TimeBarLength::Minute => { From 4bf849a5f73adde3a422cbe5f5e4b4b504027c4d Mon Sep 17 00:00:00 2001 From: "Christoph J. Scherr" Date: Thu, 11 Jul 2024 17:08:13 +0200 Subject: [PATCH 23/40] chore: bump alpha version --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index 9997367..6ea8d60 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "crock" -version = "0.2.0-alpha.0" +version = "0.2.0-alpha.1" edition = "2021" publish = true authors = ["Christoph J. Scherr "] From 128cc3621ef79a8f4f70367a2dd72380b9f4b52b Mon Sep 17 00:00:00 2001 From: "Christoph J. Scherr" Date: Thu, 11 Jul 2024 17:37:18 +0200 Subject: [PATCH 24/40] feat(countup): notify with tui and desktop integration --- Cargo.toml | 5 +++++ src/clock.rs | 44 ++++++++++++++++++++++++++++++++++++++------ 2 files changed, 43 insertions(+), 6 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 6ea8d60..ca4f837 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -12,10 +12,15 @@ repository = "https://git.cscherr.de/PlexSheep/crock" keywords = ["time", "clock", "tui"] categories = ["date-and-time"] +[features] +default = ["desktop"] +desktop = ["dep:notify-rust"] + [dependencies] anyhow = "1.0.86" chrono = "0.4.38" libpt = { version = "0.6.0", features = ["cli"] } +notify-rust = { version = "4.11.0", optional = true } ratatui = "0.27.0" tui-big-text = "0.4.5" diff --git a/src/clock.rs b/src/clock.rs index 9a95849..7369ad6 100644 --- a/src/clock.rs +++ b/src/clock.rs @@ -6,7 +6,7 @@ use clap::Parser; use libpt::cli::args::HELP_TEMPLATE; use libpt::cli::clap::ArgGroup; use libpt::cli::{args::VerbosityLevel, clap}; -use libpt::log::{debug, trace}; +use libpt::log::{debug, error, trace}; use ratatui::backend::CrosstermBackend; use ratatui::crossterm::event::{self, poll, Event, KeyCode, KeyModifiers}; use ratatui::layout::{Alignment, Constraint, Direction, Layout, Rect}; @@ -33,8 +33,7 @@ impl TimeBarLength { Self::Minute => 60, Self::Day => 24 * 60 * 60, Self::Hour => 60 * 60, - Self::Custom(secs) => secs, - Self::Countup(secs) => secs, + Self::Custom(secs) | Self::Countup(secs) => secs, } } } @@ -71,6 +70,8 @@ pub struct Clock { pub count_up: Option, #[clap(skip)] pub(crate) last_reset: Option>, + #[clap(skip)] + pub(crate) did_notify: bool, } #[derive(Debug, Clone, PartialEq, Default)] @@ -293,7 +294,7 @@ impl Clock { self.maybe_reset_since_zero(); } fn ui( - &self, + &mut self, terminal: &mut Terminal>, data: &UiData, ) -> anyhow::Result<()> { @@ -326,8 +327,39 @@ impl Clock { // Will not be rendered if it is None let timebarw: Option = if self.timebar_len().is_some() { debug!("time bar ration: {:?}", data.timebar_ratio()); + let ratio = data.timebar_ratio().unwrap(); + + if !self.did_notify && (ratio - 1.0).abs() < 0.000_001 { + if let Some(TimeBarLength::Countup(_)) = self.timebar_len() { + #[cfg(feature = "desktop")] + { + let mut notify = notify_rust::Notification::new(); + notify.appname(env!("CARGO_BIN_NAME")); + notify.summary(&format!( + "Your countdown of {} is up.", + self.count_up.unwrap() + )); + // FIXME: does not appear to be working on my WSL2 + let _ = notify.show().inspect_err(|e| { + error!("could not notify of finished countup: {e}"); + debug!(": {e:#?}"); + }); + } + } + self.did_notify = true; + } + let tmp = LineGauge::default() - .filled_style(Style::default().blue()) + .filled_style(if self.did_notify { + Style::default() + .slow_blink() + .bold() + .underlined() + .yellow() + .crossed_out() + } else { + Style::default().blue() + }) .unfilled_style(Style::default()) .block(Block::new().padding(Padding::new( parts[2].left() / 10, @@ -335,7 +367,7 @@ impl Clock { 0, 0, ))) - .ratio(data.timebar_ratio().unwrap()); + .ratio(ratio); Some(tmp) } else { None From 99b81be0abccce9cf431676b5ff31dc32764b84d Mon Sep 17 00:00:00 2001 From: PlexSheep Date: Thu, 11 Jul 2024 18:00:39 +0200 Subject: [PATCH 25/40] feat: allow input of duration in seconds and minutes too --- Cargo.toml | 1 + src/clock.rs | 59 ++++++++++++++++++++++++++++++++++++++++++---------- 2 files changed, 49 insertions(+), 11 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index ca4f837..f2c2b83 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -20,6 +20,7 @@ desktop = ["dep:notify-rust"] [dependencies] anyhow = "1.0.86" chrono = "0.4.38" +humantime = "2.1.0" libpt = { version = "0.6.0", features = ["cli"] } notify-rust = { version = "4.11.0", optional = true } ratatui = "0.27.0" diff --git a/src/clock.rs b/src/clock.rs index 7369ad6..32b1d15 100644 --- a/src/clock.rs +++ b/src/clock.rs @@ -3,6 +3,7 @@ use chrono::{DateTime, Local, SubsecRound, Timelike}; use clap::Parser; +use humantime; use libpt::cli::args::HELP_TEMPLATE; use libpt::cli::clap::ArgGroup; use libpt::cli::{args::VerbosityLevel, clap}; @@ -47,7 +48,7 @@ impl Default for TimeBarLength { /// Make your terminal into a big clock #[derive(Parser, Debug, Clone)] #[command(help_template = HELP_TEMPLATE, author, version)] -#[clap(group( ArgGroup::new("timebarlen") .args(&["minute","day", "hour", "custom", "count_up"]),))] +#[clap(group( ArgGroup::new("timebarlen") .args(&["minute","day", "hour", "custom", "countdown"]),))] #[allow(clippy::struct_excessive_bools)] // the struct is for cli parsing and we already use an // ArgGroup pub struct Clock { @@ -58,16 +59,23 @@ pub struct Clock { pub timer: bool, // timebar options + /// show a time bar that tracks progress of the minute #[clap(short, long)] pub minute: bool, + /// show a time bar that tracks progress of the day #[clap(short, long)] pub day: bool, + /// show a time bar that tracks progress of the hour #[clap(short = 'o', long)] pub hour: bool, - #[clap(short, long)] - pub custom: Option, - #[clap(short = 'u', long)] - pub count_up: Option, + /// show a time bar that tracks progress of a custom duration + #[clap(short, long, value_parser = humantime::parse_duration)] + pub custom: Option, + /// show a time bar that tracks progress of a custom duration without resetting + #[clap(short = 'u', long, value_parser = humantime::parse_duration)] + pub countdown: Option, + + // internal variables #[clap(skip)] pub(crate) last_reset: Option>, #[clap(skip)] @@ -134,11 +142,14 @@ impl Clock { Some(TimeBarLength::Day) } else if self.hour { Some(TimeBarLength::Hour) - } else if self.count_up.is_some() { - self.count_up.map(TimeBarLength::Countup) + } else if self.countdown.is_some() { + Some(TimeBarLength::Countup( + self.countdown.unwrap().as_secs() as i64 + )) } else { - // this feels weird but is the same - self.custom.map(TimeBarLength::Custom) + Some(TimeBarLength::Custom( + self.countdown.unwrap().as_secs() as i64 + )) } } @@ -334,12 +345,38 @@ impl Clock { #[cfg(feature = "desktop")] { let mut notify = notify_rust::Notification::new(); + notify.appname(env!("CARGO_BIN_NAME")); + + // see [FreeDesktop Sound Naming Specification](http://0pointer.de/public/sound-naming-spec.html) + // a sound exists for our use-case + // + // NOTE: sadly, notify_rust does not (yet) support KDE plasma, because + // they have a weird way of making sounds and notifications in general + // work. At least we get a little notification. + // + // TODO: add something to make a sound without the notification system, + // as that is not reliable but the user might depend on it. + notify.sound_name("alarm-clock-elapsed"); + + // The user sets the time with the expectation to be notified, but it's + // not like the moon is crashing into the earth + notify.urgency(notify_rust::Urgency::Normal); + + // The user wants to be notified, otherwise he wouldn't set this + // option. The notification should stay, until the user makes it go + // away. This is useful when the user leaves their workstation, comes + // back some time later, and the duration has been reached during the + // time he was away. + notify.timeout(notify_rust::Timeout::Never); + notify.summary(&format!( "Your countdown of {} is up.", - self.count_up.unwrap() + humantime::Duration::from(self.countdown.unwrap()) )); - // FIXME: does not appear to be working on my WSL2 + // NOTE: this will only work on machines with a proper desktop, not + // with things like WSL2 or a docker container. Therefore, it is behind + // the desktop feature. let _ = notify.show().inspect_err(|e| { error!("could not notify of finished countup: {e}"); debug!(": {e:#?}"); From 6ee826a91d73005a2b6ba9507fed73f8993eaa2c Mon Sep 17 00:00:00 2001 From: PlexSheep Date: Thu, 11 Jul 2024 18:13:45 +0200 Subject: [PATCH 26/40] docs: document that durations are only accurately honored to seconds --- src/clock.rs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/clock.rs b/src/clock.rs index 32b1d15..7a327bf 100644 --- a/src/clock.rs +++ b/src/clock.rs @@ -69,9 +69,13 @@ pub struct Clock { #[clap(short = 'o', long)] pub hour: bool, /// show a time bar that tracks progress of a custom duration + /// + /// Precision: only to seconds #[clap(short, long, value_parser = humantime::parse_duration)] pub custom: Option, /// show a time bar that tracks progress of a custom duration without resetting + /// + /// Precision: only to seconds #[clap(short = 'u', long, value_parser = humantime::parse_duration)] pub countdown: Option, From 0271b111e020e4d6d2eae7bc57ddb7e32bc17bd6 Mon Sep 17 00:00:00 2001 From: PlexSheep Date: Thu, 11 Jul 2024 18:33:28 +0200 Subject: [PATCH 27/40] refactor: make notification and countdown more clear and address clippy findings --- src/clock.rs | 128 +++++++++++++++++++++++++++++---------------------- 1 file changed, 74 insertions(+), 54 deletions(-) diff --git a/src/clock.rs b/src/clock.rs index 7a327bf..8194695 100644 --- a/src/clock.rs +++ b/src/clock.rs @@ -3,7 +3,6 @@ use chrono::{DateTime, Local, SubsecRound, Timelike}; use clap::Parser; -use humantime; use libpt::cli::args::HELP_TEMPLATE; use libpt::cli::clap::ArgGroup; use libpt::cli::{args::VerbosityLevel, clap}; @@ -14,22 +13,22 @@ use ratatui::layout::{Alignment, Constraint, Direction, Layout, Rect}; use ratatui::style::{Style, Stylize}; use ratatui::widgets::{Block, LineGauge, Padding, Paragraph}; use ratatui::Terminal; -use std::io::Stdout; +use std::io::{Stdout, Write}; use std::time::{Duration, Instant}; #[derive(Debug, Clone, Copy, PartialEq, Eq)] pub enum TimeBarLength { Minute, Hour, - Custom(i64), + Custom(i128), /// implementing a bar that would grow smaller would be weird, so it's a count up instead of /// a countdown - Countup(i64), + Countup(i128), Day, } impl TimeBarLength { - pub(crate) const fn as_secs(self) -> i64 { + pub(crate) const fn as_secs(self) -> i128 { match self { Self::Minute => 60, Self::Day => 24 * 60 * 60, @@ -147,13 +146,15 @@ impl Clock { } else if self.hour { Some(TimeBarLength::Hour) } else if self.countdown.is_some() { - Some(TimeBarLength::Countup( - self.countdown.unwrap().as_secs() as i64 - )) + Some(TimeBarLength::Countup(i128::from( + self.countdown.unwrap().as_secs(), + ))) + } else if self.custom.is_some() { + Some(TimeBarLength::Custom(i128::from( + self.countdown.unwrap().as_secs(), + ))) } else { - Some(TimeBarLength::Custom( - self.countdown.unwrap().as_secs() as i64 - )) + None } } @@ -180,7 +181,7 @@ impl Clock { } TimeBarLength::Custom(_) => { if since_last_reset.num_seconds() >= 1 - && since_last_reset.num_seconds() >= len.as_secs() + && i128::from(since_last_reset.num_seconds()) >= len.as_secs() { self.last_reset = Some(Local::now()); } @@ -246,6 +247,13 @@ impl Clock { Ok(()) } + /// Run the clock TUI + /// + /// # Errors + /// + /// * The [setup](Self::setup) fails + /// * Drawing the [ui](Self::ui) fails + /// * Polling or reading an event fails pub(crate) fn run( mut self, terminal: &mut Terminal>, @@ -345,48 +353,11 @@ impl Clock { let ratio = data.timebar_ratio().unwrap(); if !self.did_notify && (ratio - 1.0).abs() < 0.000_001 { - if let Some(TimeBarLength::Countup(_)) = self.timebar_len() { - #[cfg(feature = "desktop")] - { - let mut notify = notify_rust::Notification::new(); - - notify.appname(env!("CARGO_BIN_NAME")); - - // see [FreeDesktop Sound Naming Specification](http://0pointer.de/public/sound-naming-spec.html) - // a sound exists for our use-case - // - // NOTE: sadly, notify_rust does not (yet) support KDE plasma, because - // they have a weird way of making sounds and notifications in general - // work. At least we get a little notification. - // - // TODO: add something to make a sound without the notification system, - // as that is not reliable but the user might depend on it. - notify.sound_name("alarm-clock-elapsed"); - - // The user sets the time with the expectation to be notified, but it's - // not like the moon is crashing into the earth - notify.urgency(notify_rust::Urgency::Normal); - - // The user wants to be notified, otherwise he wouldn't set this - // option. The notification should stay, until the user makes it go - // away. This is useful when the user leaves their workstation, comes - // back some time later, and the duration has been reached during the - // time he was away. - notify.timeout(notify_rust::Timeout::Never); - - notify.summary(&format!( - "Your countdown of {} is up.", - humantime::Duration::from(self.countdown.unwrap()) - )); - // NOTE: this will only work on machines with a proper desktop, not - // with things like WSL2 or a docker container. Therefore, it is behind - // the desktop feature. - let _ = notify.show().inspect_err(|e| { - error!("could not notify of finished countup: {e}"); - debug!(": {e:#?}"); - }); - } - } + if let Some(TimeBarLength::Countup(_)) = self.timebar_len() {} + let _ = self.notify().inspect_err(|e| { + error!("could not notify: {e}"); + debug!("complete error: {e:#?}"); + }); self.did_notify = true; } @@ -432,6 +403,55 @@ impl Clock { debug!("done rendering the ui"); Ok(()) } + fn notify(&mut self) -> anyhow::Result<()> { + Self::beep()?; + #[cfg(feature = "desktop")] + { + let mut notify = notify_rust::Notification::new(); + + notify.appname(env!("CARGO_BIN_NAME")); + + // see [FreeDesktop Sound Naming Specification](http://0pointer.de/public/sound-naming-spec.html) + // a sound exists for our use-case + // + // NOTE: sadly, notify_rust does not (yet) support KDE plasma, because + // they have a weird way of making sounds and notifications in general + // work. At least we get a little notification. + // + // TODO: add something to make a sound without the notification system, + // as that is not reliable but the user might depend on it. + notify.sound_name("alarm-clock-elapsed"); + + // The user sets the time with the expectation to be notified, but it's + // not like the moon is crashing into the earth + notify.urgency(notify_rust::Urgency::Normal); + + // The user wants to be notified, otherwise he wouldn't set this + // option. The notification should stay, until the user makes it go + // away. This is useful when the user leaves their workstation, comes + // back some time later, and the duration has been reached during the + // time he was away. + notify.timeout(notify_rust::Timeout::Never); + + notify.summary(&format!( + "Your countdown of {} is up.", + humantime::Duration::from(self.countdown.unwrap()) + )); + // NOTE: this will only work on machines with a proper desktop, not + // with things like WSL2 or a docker container. Therefore, it is behind + // the desktop feature. + let _ = notify.show().inspect_err(|e| { + error!("could not notify of finished countup: {e}"); + debug!(": {e:#?}"); + }); + } + Ok(()) + } + fn beep() -> anyhow::Result<()> { + print!("\x07"); + std::io::stdout().flush()?; + Ok(()) + } fn partition(r: Rect) -> Vec { let part = Layout::default() .direction(Direction::Vertical) From 6465f38c68d4acb5922126ff8d1de513309b94d8 Mon Sep 17 00:00:00 2001 From: "Christoph J. Scherr" Date: Fri, 12 Jul 2024 12:52:09 +0200 Subject: [PATCH 28/40] feat(notify): play a bundled sound #12 --- Cargo.toml | 4 +++- README.md | 18 ++++++++++++++++++ data/media/alarm.mp3 | Bin 0 -> 31200 bytes src/clock.rs | 21 ++++++++++++++++++++- 4 files changed, 41 insertions(+), 2 deletions(-) create mode 100755 data/media/alarm.mp3 diff --git a/Cargo.toml b/Cargo.toml index f2c2b83..cac8b7d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -13,8 +13,9 @@ keywords = ["time", "clock", "tui"] categories = ["date-and-time"] [features] -default = ["desktop"] +default = ["desktop", "sound"] desktop = ["dep:notify-rust"] +sound = ["dep:rodio", "desktop"] [dependencies] @@ -24,4 +25,5 @@ humantime = "2.1.0" libpt = { version = "0.6.0", features = ["cli"] } notify-rust = { version = "4.11.0", optional = true } ratatui = "0.27.0" +rodio = { version = "0.19.0", optional = true } tui-big-text = "0.4.5" diff --git a/README.md b/README.md index 0010af8..9bc9bf1 100644 --- a/README.md +++ b/README.md @@ -13,3 +13,21 @@ A little clock for your terminal, written in rust. * [Original Repository](https://git.cscherr.de/PlexSheep/crock) * [GitHub Mirror](https://github.com/PlexSheep/crock) * [crates.io](https://crates.io/crates/crock) + +## Compilation + +The `desktop` and `sound` features require additional system dependencies: + +| Feature | Dependency | PKG Name on Debian based Distributions | +|-----------|------------|----------------------------------------| +| `desktop` | dbus | `libdbus-1-dev` | +| `sound` | alsa | `libasound2-dev` | + +If you want to compile without these features, you will not have notifications +and sound alerts for countdown mode. (Use `cargo build -r --no-default-features`) + +## Acknoledgements + +The included alarm sound is from pixabay, royalty free: + +-> ["Alarm Clock 1"](https://pixabay.com/?utm_source=link-attribution&utm_medium=referral&utm_campaign=music&utm_content=105903) diff --git a/data/media/alarm.mp3 b/data/media/alarm.mp3 new file mode 100755 index 0000000000000000000000000000000000000000..26d6c330722f0b10f31364c6505a8b06f8188890 GIT binary patch literal 31200 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 anyhow::Result<()> { Self::beep()?; + #[cfg(feature = "sound")] + { + trace!("playing bundled sound"); + use rodio::{source::Source, Decoder, OutputStream}; + + // only 30 KiB, so let's just include it in the binary and not worry about reading it + // from the fs and somehow making the file be there + let sound: Cursor<_> = std::io::Cursor::new(include_bytes!("../data/media/alarm.mp3")); + + // Get an output stream handle to the default physical sound device + let (_stream, stream_handle) = OutputStream::try_default().unwrap(); + let source = Decoder::new(sound).expect("could not load the included sound"); + stream_handle.play_raw(source.convert_samples())?; // the sound plays in another thread + debug!("played bundled sound"); + } #[cfg(feature = "desktop")] { let mut notify = notify_rust::Notification::new(); @@ -420,6 +435,10 @@ impl Clock { // // TODO: add something to make a sound without the notification system, // as that is not reliable but the user might depend on it. + + // only play this when we don't use built in sound, this + // isn't as consistent + #[cfg(not(feature = "sound"))] notify.sound_name("alarm-clock-elapsed"); // The user sets the time with the expectation to be notified, but it's From ed929df3c2767124eac180988e5858887075edc7 Mon Sep 17 00:00:00 2001 From: "Christoph J. Scherr" Date: Fri, 12 Jul 2024 14:06:55 +0200 Subject: [PATCH 29/40] fix(notify): sound did not play #12 fixup: maybe please work --- Cargo.toml | 6 ++-- README.md | 4 +-- .../278142__ricemaster__effect_notify.wav | Bin 0 -> 229420 bytes data/media/alarm.mp3 | Bin 31200 -> 19820 bytes src/clock.rs | 32 ++++++++++++------ 5 files changed, 27 insertions(+), 15 deletions(-) create mode 100755 data/media/278142__ricemaster__effect_notify.wav diff --git a/Cargo.toml b/Cargo.toml index cac8b7d..f616812 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -15,7 +15,7 @@ categories = ["date-and-time"] [features] default = ["desktop", "sound"] desktop = ["dep:notify-rust"] -sound = ["dep:rodio", "desktop"] +sound = ["dep:rodio"] [dependencies] @@ -25,5 +25,7 @@ humantime = "2.1.0" libpt = { version = "0.6.0", features = ["cli"] } notify-rust = { version = "4.11.0", optional = true } ratatui = "0.27.0" -rodio = { version = "0.19.0", optional = true } +rodio = { version = "0.19.0", optional = true, default-features = false, features = [ + "mp3", +] } tui-big-text = "0.4.5" diff --git a/README.md b/README.md index 9bc9bf1..6f6c313 100644 --- a/README.md +++ b/README.md @@ -28,6 +28,6 @@ and sound alerts for countdown mode. (Use `cargo build -r --no-default-features` ## Acknoledgements -The included alarm sound is from pixabay, royalty free: +The included alarm sound is from [freesound.org](https://freesound.org): --> ["Alarm Clock 1"](https://pixabay.com/?utm_source=link-attribution&utm_medium=referral&utm_campaign=music&utm_content=105903) +-> ["effect_notify.wav" by ricemaster (CC-0)](https://freesound.org/people/ricemaster/sounds/278142/) diff --git a/data/media/278142__ricemaster__effect_notify.wav b/data/media/278142__ricemaster__effect_notify.wav new file mode 100755 index 0000000000000000000000000000000000000000..a396dcd08be7d2ee1130899b14ac25625071464e GIT binary patch literal 229420 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�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 literal 0 HcmV?d00001 diff --git a/data/media/alarm.mp3 b/data/media/alarm.mp3 index 26d6c330722f0b10f31364c6505a8b06f8188890..eeabdfcade6511555664400f3a45763b4ac2d170 100755 GIT binary patch literal 19820 zcmZs?bx>5_AOC+hSh{QJ?r>?OT)MlvyGubucj*?82I=lbK?NykX-TC!L_pq%us{8L z=Qs2HGXsG=6OauTBE&InV;s`+zK_LX< zf1Us519NNie_j2*o9aF;zJGg&{~jU$pp68u2?$6@si^4an3*{^czGW@5EXs+P)<%! zQB6%-+rYrY#M08v&e_?+!`C+`C^YoNi-_3Rq@=X8tgQU};^K;m+S;b3_V%u>o}Ph$ zk&(&C+1bU#wYAO7y}je(^YdT7Zf`OFM)G&aj{h6-zl;Ar*dfUO)6_;H$PfaU+jJ!W z7c39g(ns_5Dj@M0plqN~<^)FXb8#gNlDVXTqLPd(H#~1L$G;N2TAhut5Nl1Pc1sF;!Yfo_pOw*|D~o ziOalA@I4T*9xm_{+YjD zJi}m+AS1ocY6Q=5#us%KE{AJh^Sc$jt9_nLD3vi=Pb{fdBhftg!YXg-1pij#w4H8J z(Yc$RwCJ_Jhg;Nh|3<#@EGh)IWPP5vKTi^d1o<&}#g1VHSbYl`q92VEL~#hGvnK0} z*rN`LH}r*El07ONV_{*LQBY87g@;FD zUSr*jb^-B4%-fk7PT(4Oa>MEWn21Ql?*EH0PyOeR{@o+woO9*j=k6$Q&WD-l3K6)XAxN6BZ)ZumD%$(EL ziEcG3&sx^P{08~A2a!SCb6w# zCS<9Cw`AqMAK}gtG7%AU3?{Jx%+cnW?A1OezVWT1sbTzi;!E^48M$ya&TAE7F8H8= z*Zrqr4TtGyMhZ!2Tx$`Med0+$6iVCevFLvldBlB;$;#h8|LSJ8VU8s+^ahHi^l(B) zI{oc~n1t}Nt5^m7>Bo#;=OtjY_I~`+KQH0W0vcs}nME?AezjEpTo-&NXEMPfC$t7Z ziF~1(0<$WFh!7kNK{gU?yNKd!&u)@%YXwn^&sQ7I%v*_v3-yK2kbWUa9vS(vhBc9z zgB_0ixULk_G>v%D<&wvL;4t??as-6e(k#;&R>Vv-lKC*}{zsV~2|hT{MUgG~LSdJT zt&*3P-og^{?C>G?|iM4y~KNm2yam$W4)D%)#@-nt6roz9@gt9(I$c5b@3{4;1H zaR~z`k$%I&nvII%|v5met%SwwGpB*mpk3WA>UjdC$0>dzg zsUtVqu?vc~>P|xNgc+@!STgc;`v-A&EB(xCeJ*mrudVX^2ox5mYJ2?K6CbTMjleS^N$PNova@ZEkAo7H!wkMh}PR#WW^F;{h)2aqL?@QF}js!aJ`BdgmAUY=11#Z zMnH=zfaoFF8U=s(SY1hl3NRkLxh{pd*UcNfWC#zH$=$ZW_olzbT@QME&!H%6fzOX1 z%UE`coH3sf6D+=g;$Q97kCK@!vxhJhueUjvwB=wH3y*}nf`af+y8s$S!0AfI+Zz=* zNh0gc2LnEHc;N;9G!7_^z>np35@KW3YG!@)+hA7WA*=Hn;+|x$M&Gs@_g?I<+gDPPp~!~Aivp6X`bSrn zo+USs!;-}Fv#c>Mb5GtGD^w%2KhE%)4%gvb-=>ieVslEy4pGHbkQlfeXsSHJak+}!C5%|N*P;L?VfCS;N$p6# zQr<*38P&J>75o;^jc z=y&>S8q}9?7sRy8s-ayLoSQ_#7aJhf0OP2mfvEJyTm7FDi6WOAEj$B&A$RhpIMDD{ zYN^n%2;q{!7J}19Jx4!gb=8!i4Ni3?j2oWFjprl{SM+mPwv=cKk_gL-{F>G z41!Sn&pg}Gluy8DBmiI`l-4uc(%GtuJW+0v9X#tOeP+sKGuZkt!w_TNl45DTaO!`f zUr!6m)tQ_YA4orbpz~P4yEjG5Au&p{=aiN8!M*c8vKWkuE%iHx&p&Rb0O(B}GuRY! zFTsQYh{93)B5u_4a z1V-Z10;CY?2hBOk*x8&O3s0_?4&`kzM}LYB4(tH(qQ8%Q%g4(nC;+F`PG<@|mhuDV z1sDE>ROF+A)9(rI*^#|%ZuwIs{H=Z7;8+43l>Ei6J1IGjwITW3YHZG(b_03fDC>UCd~Kg<@NoazkKOn>)i zwnGA6+VuwFUQ};f@{0zTjMWfY{~2xZM@8ZV0Q8V@j4$SoDSkf+mjql32SZFaPwnzq zL)C2T;Dq`C4~bUswJQ%6U+>T+X!!T|99LWs5H;2GDKWY|tr%srt#lEW%Sw^j@6Os% z8_H|8kT%KlU>^<$6}-ZfV}9EC;GVx%15iK_UOT$DI!f-Q#37_ghKSi1e}pXB^1TfY z?&D3uZ#2P2k1i5xCFiC8{F2Arb}+8gk+K=;_}QP{l65AiAM68~xX8065*=XrE06zf zw*Gsf2khvhs6g#m1Gurc;dyLh}|;=Cex$l^1@k9X6xSbvnE?SH5TG6lKyW_&v_0M- zf%YN+1WAsb)Ia_NvEUZOxO9bVidi(Rfd8dn0>z-1&OiRyE^kiW_~DRVxh<*jI8FBN zJk4c`AdEAM5*&he!%(GMpHd9+t5?+m!tp6_$GfR4dg^M8y~)XCVSVx6F_=w1yZI?x zl@vhY7(gnoh9<(Ju-_*jIIGYNr4m{3CMx2pQ(8GD%~Wo`YWZ7Z%?L>RI2Kct;`Q`% z-yM8fcwO}SZq3PUg=Aa9kzI%MGlB3%$&v0=SX9*mzi~kTD42t=A39f%8n27s!a*p$ z=f_I6pEc-WDleKaddTTz&+`MLkF)JOKK+p0MnxA)qLyi4=?Yfkhmn6JB4CqC^vxZ-cJh(1lHe(zQWQ&;E)61;o{ulq$c!nGN$Dz z*>pP;B44^2)#aI9aa2bqs|NU(v zp;^6L$0-p4O~B|z&^CyUzP^4er@!GJe>@bpR@}@JW+G@5J$mBo{UQNpMOAy?7pZSv z)zt(~z+`EvszU~*bm;E+P1Mtu_b+#+%sPaI-oEkuR{apOju_e7W%1;)SzK9aUjq7< z73Te!X74`eam4jh_Z5lb$Y;j{*Q1=j`!RL&#D!tszL;a=ucdlwB8smaVAj3V?I$Xk zw=4gsG5yn)=!oNc2vxLjm`LvN_p_|qje^khYk{JGdtL+QcCEr5!H7>^uF_n#F@tL$ z4-`(@HZg62=muaGrthKI3g+i8o(-@zA5M>_e&gOn{hHrf2F`loHZ zp%rh$?(=akdrg5>F0?AXJ7uZcxkgpeK1FnhX?$Rh*hD{=W?2z*(h z-`OoeAb@;FD6Nj%=0uhCYdEQXx&8{7zlG0+ncu8QOJZB(>L776A?yf#y1aZ($sAj;SVJZZLOiK{Z}7fmq&D=+jZQ}9^6ruDwz zf@NBo{^S4G|HH{v4mLGK)x*cM5no*5A`NZpIQCMxQ;*xOl4>{bjY@sVlYtFK;qxKmpPDU1lb zwP3`T7XXkB429HMep2!DU`|DvXzec}Ewhc8@~&Z2ko@KVIhp<7$TS9bv$!WF!IkeR zNdra-q(4ws-Z$*>?|T5N9jx?eV-c4%*JOSQUeEE-iX9zOy)O_4uLTn zFms&c+UEOWec>WKDWf6vEJu!+D?BDQoGAL&PbHSQRL14qF+w;WZ)osVTs9M}YU%z6 z!44CDiYX2~ZOEdf0b>-+ztO#q%JaB~mi%0OpvT0K759<)dP}WhTF@k_i&Gf{p&Gi<$n2N?d|vP zySA9lM$BT2r?u?tOi>{4)cMN~7;=rv5ZT{Sqm|V}gPT0(RR~sgKn7|=7S#7#lmyRI& zZO+YsIe3i0l&#}=rBDR7;dp<5we#vL#$yxJ*2(015Y03urP;sU`^R4b1Pbkx zpx{V*VxJ_HIM3mz#qFDeo9HEaUUeYe!Qg%9;HQ@B0!5hRc?Z?mQ962gH_jWr{JHmB zans6&H!^e61u3Qn5NUe589yD;C!v`eDo6_`ka)wvDY}!fUwNlPOM<137GmT1<%tVe zXkza82EGR>txmK0R_xhE_F%}8{Wr<;6$(%NnZpB>8g$&ylWb5GxRT#F=qEBcl_qe2 z7!8&q=r9AwGnfIgG1Xf&Q2GvQ&3~vfQqMKHp7ncUonPmEHWGhza(MyiU3U!^*CmlN zBb^bp-^AXF_J-U2z`0o;Tf-d9+d)^=P=-F5_KgGSA#Lp8_z2M`dA*ATJuii}E&BU= zg);5{)?rH5CodZTbH$blEXE)s0y`x^!9I7b4c2#9}&5=fkRnJzMAU#YZGW8;#op~j_h+$a=| zgF7l+<9ed%&MbR?^yB?6Qqao_!QLT##!2ozvG_XXo+dG>{)H>tiklFXe~r8l7r zStJ_kGZvbxjvXi^cF;r*h0+%|bRI2ebkYxZ_?C2YH4Jw%9Dl%czr^_r`SGyIEKB3-P^f9vddJ< z(=RV7oLbPe;uy@t!?L{KW(v;kA2E0?D(EUEc8TH|WtKldd~0H*W^>-bvIM@yIEiEA zp8JbapbyfsK7$TcLwv1bdB1OzXlt}XyV)id%iE19d%OogQ88FGRS!Lz;u$*i(iJSk zGWve#4E*#rXUAvxBK39jClkh+aSwYaQfccb76Rsnr+)a@!!}oQVss#WJud}1ungn; zBsixn68f7Dt+QtlzoFQMeh&9wAgdOtv=9 z*1uwG-!Fya5n?g8UJaYc$;Z)SrE)IEPY!H582<8P3I+fIvrcLR; zkeAXkeb{kmCYV)7+{Gt4CAC+;s{)*5q0cDdF9b7etf3JD!zij9btrwBUN2(9pe>uO z9+v8_$D5+{!<3*ZWjSi8#go@Lj*5MJR0mmo{!|+ZY{zMFj2RGRTN{^OGkT;YV4679 z^49FSs@7Rol%Np*-e3JKz1?6c;|O<(u;T22rvjEF@J9JGL}}A;)IeO#jfh!-r^@?} zX}ymqTk-I-KTJjRf$MN>Fpz{~kiiL-UAMTV1clj0yr#w#@B(F`{I z6>s}Fsy<6cKG0X7^ie2}fk57dOsVl2ZxoZ9d#zBkar4&DMm?iwGRBUqRQVQX`=_mw zMYGHek*5P~J$*t1v3uKDIKKOP(6}~>UDk2-^yoLrgfoYdkw3|2a36}vc{FXFG9vs) zsN+)n>Mwt#L;$P?UpjaNpVRE;t+(@a!Ig3JtRO^8i?IucUg9>m_MBXqT-Nm%bR1l} zlC@$x5$H}wQn#ljmUr5{AT58$N;$3dfS9tv?5Y6rXG9V9?zh^-0h8AWLxXQ-np=$B zfDT=y|5smJt#wSYN~TG$@K+Sa$mtlnOs39F`@*9_E>Ly#qG@)w8i7;aw@}N}=isk4yX341`!`bwnK&0@X4N!ZcdsG*!d`I!>1F znl&Xb#ipvI+WJ+lL4NVaub%L}JKpbcu@rNk_*T(PjJ(3jW}TgUa^!@~<`!+}04j0$ zqYPusE*~RZjLua4K)cwGW|y2Q`Y2D3b*{{g0^UuR{H(_XN_~xKH#+#Ld*3({3ER?& zn|I_1FDFE;!Sv3T;h#Z4Ne|x$e|V7@_fP+2An+D^@vr}gOG4-fWgY}2q+i?C$!JdP zC3=dUH_sr#8w@HQku=3d2m5Sxug40#XbJx;AJgt>Dz9Qm&Hu9!l$Ppb_G7F|BpW28 zdeqykM`9U(4U^STsQ!aY;>cruQKwW&vO~~BNR0n*Iw;=z_QkW`lx}KAx)GtsTq78UeBUTPTD>_GIN?iMsM5# ztxy}NU$U~Q!8UxXMuP2exb|Np1gkM>`QcYdI&5ZA$ZjR0@v%%*DmHu@b0a_MT)MDR z3Uzuj#5Evx`3zkm5x+*7K}pX(>j1Gg7T5UvLgS3}Y+s2X=z3I$^VYCjVMG2&gJ73( zu3paD67;!KGp_p}Xd{)C-XbF2vR#eM;6fwhdMT4d zM`CZ45i3luzUlvtM_mkJPwgI`BMtNY5xGM06pDrKKpm^(!CPwQ)22$35xDRX%QFcl z<=R6F_{ye4RtnIzwM)#kuR5n90=y%4?8rQ(hlkVZ4J4#~P5hjfOi>Z`_NwZ#=f-vo z6V7=XWL8zvtT3*}3jh7wwPLYt{Id5_S|h ziGWqwlud9{4t!B^0F1*{43(O^67stc@Ko~8*>cz=ypS7Z{!->3oASEzent!HyQ$U4 zG`f0DG*-9H2rK+2sTtn38nyNy*O=TJ=?$g#U+a@gZe>=lKo#l$F8ew{Gzf~7#1uZy zUSqK%it8o0@=yOWXs|bY!TnghOb3E@Vjm+FyYFmTC*(FQNx&D3YQPhhq%PwV95eRO zVNBCNIMmfn{QQrxWaUWwTPtcv5pv?_v*K1HK)fUC$g#)5b(Sqh&I|8b*O%rwD&l z@2`}a*B8DT+(ujgnS$^LT>gM!n1j8pfiZJITnZhHmXgUg9E69l&BP$?Q`AIVl;=OZdmJ)6ofecATafDA)v*Z;rrc}#iAOIaY zV-ikH40bwYsmsTs_7JNf(yVsjOCuKnrGFFfeQPz{1;BPqw4M&^nM~6zu%9u+gf5VN z)>9)1B6TD^?ZNESV?F|;9Z0Yy3XlIE|9t>F!#U@PPy5R-f>zf1ff>Q`>qpv=7V_kY z?(XUJ7P(0iijyU*zo10umZXm6W+i;dIBw{FhhN>&%Gt5!B%(f5?wzh+V51yBTbzN_ zFf1;CvZ>&ZU=41N4l74uNpN?hY4W4ux)Lb?*);xp!NnCnIYRD07K_p{VJi3uWGv4> z*@|?L0uij5w?{qSlmj`?#!UFMzW)={9k9Gb+1@{pZNw+-@oMWOX7P0XyUmC1f)O<2 z^+uS-Kcwd&*F|)s5;Z+cDtA=?Bv;EkcGn~NSRhp>9xtQ zzWCLLD@|cHJDS}8Y5*w!yw+=}{0m^!5a(m|q_GotXy%kIU5uVZqBPjCrrL3&`|SqP z6fJH+1ExR6kG_4DGis%U;3~){rRW`|ibjOvTM2W=7PWKOi8B{xa8gxzS)*!FNb*v! zin55BSt4kh`ujOqI6YH4kSA=3uglFA$9M~cb>kiN>RE%Jmvu3I%BlVr1OmDdfs*dsp|&#Xu$Y}46-T(nkaf5<4@W4 z7w4i1$>09-|2-7=9sAr7G1;XFw#J(MmhI@2qr6rtkGxT0amN~O*RJ1u?>(nWIhmIxyMs&$Z@6fSci? zv9AZ4-|EhOQQhmrQXPB6pLC(_P(1Q0#^o>nqGrkl@-s9X()=o#wB6KO?!^bHt!J3CoFh{p= zicSzw9o=y89`iB1-n~DMpc;EA9;_8;^z zyj`R^7DFd=1}KRj3x861_1UTpDZRYMs$K%moUffZMrgt~$Ac&b$**s`d&opMno3@!ZoZg>Q=w8dz z7;G;*%yCi+*RB#$7N=jI{x}6z8WIsiak0gM>C=H>DlvmTQ~*cqOnv+VXuaugMD?mF z5h_OUu++WL%9oc&#ZD%U@wej|J&8i+%YiTI5_hSO-|J2TBa5EA;*L7Bc3&Q2g6*(q zxnUHUs1Fq^#hLwo(}S;@niugh*?BvqFJ@NRsh!0R>UFhVUK|~mm1K_?5Dqw!r}C;r z4KEkC31FW5Hjl<7;;NI>$oWMQTgU;yC5t|a=O-eLe_0E_{%3(vym##3N%4UQ<@*5YL#?xwG?j8O z9xgG{hc#xP2Z@tvc=lie{mICm=8wOOn>Ms1bW>Dfu6MeE5=(lLwh$qLjC&27>k#Sd zuX@zI0JbDJEQ7C=xe@W&kW!qNc+fN-cKYeTv(|t5-$$_yiRmA4F;bWfJ*9Quw;Da} zm(_~2h*Qn2;;Bd;eFRaxDEmzpy5ZXHeq-;2R%0-|8>S&QCG|8796hNSsKW9Kk(f~r zbG@aMc-JP7RAal;QwZm-J7U0l-O&wj(IH88=CI40rFfwqakQSTJRRq}0E72>`Rn`w zSj;s^`8-@PdXeoU`FM&D3v#6&j99NQPG_+*vNWLvCEpFpznRY4lqZyITclOd=hjBK zP~T$G__P4G4d|8Fe-RPnp&Xx5{uqkh?`GT2GArE!vA#|}fI&P< zy7KN7Gs`~rM=8Wa>}Aw&S4{b@w?7nhTA!-!h+}p`@9yFJMcN|2y_Q_pUm>YL>C-iMOo9mLO{ z<<{PhgiMNJsJ#7vclq>Z?aj+orKZUWvl`2@OyO@O_=k!%r!$K*;&D(OZqWH_YD)g( zH}c`>G9Fd*=NsUM_hr&kY~aDeJjZpxw3#fomWso6l9j>Piv@!gD7i)?H$D2!K3@Rt-^0L%- zIw~CIZcc4~o!di;6p^of8`$`S~4ANgjM%PhqL*Bmi(&J9|CIMqR?CVx zv@upJ%|_VozhffCixHMUzty!`B4E7~4K^ss_ zeDvEHMcdqh8?X*JBmQb%Ka9o&A%2gx^Vr4dd-c|-2qVwS=nL{Q!4`<;JfE+Ficye9 z=jxe)7+Lp{Hg`#Wp=YUoax43CMgS`ii5CR}6;+Cib{UdSyHE`YBk4Jrgd1bkKJX0E z7Fdkt>lf{896VG^xp4a)j++Y_GSeQyq3&QmQ1BXZn!Z!z>bk=+CAEDPSat-vm8aj= za)wP5&?^{;4pd#zG)Z6euY+^|mU&}m+?pW8fBe^>5W>Ip5B5|gk07-5_5!9!>=E2L zZk{7>0-oT=;)Lu%5Rp+ta8%nqiQ-5!Je}->m=d%DjtYkzp zyCM#Pdt?Qzqq{$Gk6S)yLrB@&7wr{ePt$R;CMUjq+onj1e3(5qFxZITFa9h_ra5Cs z|3J9Jo!!no(8a|bY)OZtdje4C_~q)XKVhWd@`Iflp}K=yxcAI(kYCS0g8qe=F?6RF z4-UMlHaASjv9Umb;(SjX(HfNjh3$jtp+LG`A1)#!{ZpGr5J*$Tu9x-@{TZnhHPZIy z>x&(6rV*oXNDTW$!w0rwEFA0evXh4yd4l+v1kY@^6CDD`bqR4&q6z%>ypAY;yV-7d z=_rtcVq(R0=*#4Ul!ZNiEdqQ<{6ks*qJl;3@(OS^_ZmRX34)}8bjHg5@!uta(6Ee> z=hFVr?O*!rF7&t5)tTStkt*tvz$56KWApdtk6hZ1tK8~kZtVa3{}e?oz&=KoOZ(FfE7b9cqKyW!RDK0kkf-l4 z+=Mq9&JC}cDe%k6&Ujf6Ae#LHKr4!Va0c`;5SCq>oudb4#RRg7*%xT71v`#463>Jw ze&&U6kv?27$`&R0n%VbwIsci5EBQ-Y5Lo3EPj;eDHXqCunbczbe)W0hwb)vga~`5L z{pB}H4fLO0J540bC!uqF^if;0BPT^ziX0h^d*tuD4^xPj!Iw9ybEuTQlq8l3|6zvC zmn7aj=gL|S*InVE{^cz3sT?rM^JsL{4>S7@70&Vb4kF9XL+I@hIChfo+@f9*70RiW zuR?LcqFBPbE-Ym6O6GK?sBa4m!>Zsn!Ij(z>4&-L&~@u=`{7N>2l+V} zdZn%S6~~7_pGa%PvXg359c_W_OK+DOfNF{MpZ<@CAmtpxqy+%s2_p!HECOmL0Y4@*givQ5GA8T$}Ih*~6U%qgnaj<}%? z(N&M@#QT^-Af}qzjbqyMDUep8?yi%#rYYP}^ zhC3M{p|y7|%DV)KDZqOr2L!Kcz_AvVS$O;ay&gj>D@adxxo7<2>wJ2OB}7WDHhQS> z&-KR&yckX^s=teqVfcv~y$Y5thj$)x?0lLnCT3Y*`sc{gUB#4@slwpC>2F_{V>b7~;#T zhTlc|3&};ORSp<@I z*3!vDv7)xC_SPSdpY}#29tN5gcl%}XFVBk=hS@V<)VLgz+0GgL8e7l2pu6IjP4zdp zv}KYn>mRb082LR{4w%anoB;$yQDEO*{1eM>po!TEF9ZqFAUK5KGPA3=h*?MY6^+c? z*IeBm$t;wW{19?P58DB6R3>x|UH6e;vr|7zOn^3cbssO3;4KTJD9c%F9`J)wAeh~P zXdUhzhD&h5aH509Z780gSU5mhMuso>gt$om3n-o3vVF!ei*QnoF?KFx)rl4rGhwb$ zR1UUX3;UTk*=G~BzyWBzvHk30(uZJ0Dj3mK_~VG*OVkyh)j`fC<)KvYdGqytk*LlsvLgveg+oBOheg zv&T!2bC#R^PPRttqOQ8&`n;x;IZ0%b5lLokK{gN+t6NqehOoY`!H z(0(Q&A(n&-hBuq^(FH^egX>$nZ^w8%)iv#~GKFyE{C1XE6J9R1znlmZzI38^{p>(t zHXhI2ixR*>f>ejVFg^fIIqIP{9Ny+6L>dl~M^W5ZV=cLQT}{Ol@2_ZP4DqmbY-C0K zmy?rc?5K$J3?JmD#w%6Fsk^$>f1~W;%+n!TpP+j$clmXH;<0M?p-_=d_Ix(@@8-4A zJwkXg5j<)*FA6Vvu`*u}KnM*?uxHR~F3l4pE>(m_%K+GHrld<6(2WubTge1J6lo;TxGU7RB2puUo z^^{+8BAd{JS=(AyVuPU93@#p}8m-4&Pry}ym4?AtM_3MiAzLa__`uL^oCNXS{Vf_Z zEN=x6_L|WH#>)Yt+;~*INr%6EIZ{=3pNc5TGnK~&3{hVdFr2i92Y%Rht#222AG~Ik zUrbv69fSBU#e!7sCn8m=J?B^%-?0Y3MuHd50)MlDfRcIJQmWlsTd^s$NvNb{=u!D zmrM530dfFy>;kL*apXT~Kg4qea~uDvS;90%#jDNwH%}g!Hh0?I=r!QTKk@Vn;z2(FK=kd#2|#!kqJ`sO z)iT1}T{IRSag6<_j(&H}i9j|+(a-3p8tWauM*t7K9^U!8z4JFsrNPhD(ohk2Fh??D z>XMS8iVu_WWq{T@6?N6FA2~DNK6LIS5(L0w)u09h&n*Aepf4mDT0b+X2~RT{W*G%= z{Ap#3dX7oE{_#IXLuk21=yG{~nkzjN3FMbkZ|aobk6hMQOxkfD*x});nj$A0&_j(s z@=|~k(dM{r`RGm*X|N=6&%iapy2_?-eU&{eIyj%^dS1 z;-0#CA8=9!xcne+;fzqWUz8Mp0^@`qu>gVy4!w1pBCGX!rwh}%%N!?X&PZ|!$JkII9k@hw9eBbMs5$YJT>Gcn(-RN*0v;F zBR#u^g&>?sMH8z4y=nqrp|E5Us`L-w z9lX;$O8d%zn5VWh&xoS`yMut8r=?Rd73hn3QU2w!f$Ufi`x`f#gUjR-6JO^n;al|M zDtZ4T7H0B7F-r!YUCi{+a`b6K<0XQwy-ofvf2R{7h!?FI-P`G2<$-u@`8xz}uBrwv9}hA_J0K18KMm!5Tcb9@RfmE1lWU_Ov!Br?nq@ zUhmc32R}XKc_q!)BjCJ6KbnC;0A?(nob&`L)Ph`0s}6(q-(J!BhoIci6gw!K8ctO1 zEFl?DX*-dcK;LExG)BXj+Xrdj%B`2;fb8GuHOqgf)j~-hy=s;~3^NrQT@JhPe#-0B zKL$kR2oZe|`+Dp9+J7w^1#ts3aFJ1cSk?KJLy}}snkm+p3`xJ0@ws)izf(G&_<)EV z3E|4VI>|tHxWmC{BF|TfThWk!!BGXZioiV2lTDMmBogHKM)mcW?d-$BXyET15oi=F zgorjj;QcPt0q4lPy5HNi-dI%qzMrG7KkThBdrb2=PurpWq zy!O`0CV`q<``9i-Y` z)v?>ERe5}zt$AxQ!3wbRat(n1T+E3uXq1Y^7f$lGIa-YVtn%?#b{n`evHMQTibA{` zbEje*J=i*p@3b}CH7yc8^nZfHfD@}7F2tko=(UW}HLuk{YF_=YGw19l#O;O-l;1w* zSXrv@DDx8F0|3b*1Y8jzT`VGBBeWwW6#_-fQDOu8L^^uhNJ)YUJx*_q=%LMt_hZYW zj4=*tlb4?qDn_RK#zxWHkAesRrH@)^1%Ar*Xe4*w(PFFv;r+6YWr`w-sN|ZPzoiohz1k2 zo%W{EcrRs{a6oa$QDrjX51f4mxX=zx;okHPpUZNH?@w%N@8f$gHEA3z9n5Jc@bEJp zjS?73-}B!CMV!h!FpZY{&!A^EUw>o>wdz{C;(Y3TWd1BmBo=*x9)G*o>Thm8G)x7q z5KeNdSza84|lylH8*R7!Sy22p3VS*|<;JEBWDxD|)Qebnl2p<=Q=^ZzbFh zqZOSXz;v5g{L@E&3zd2){{S2)(6V%-!2jOAwum4Mj6(_Cv_GXGJQL2`7UKin^gcbB zz#jtl;K+=}k{!XxC&c~y2XYQVy;gSi@*L~zm zha(ga@&mSYW0hitTAXO5K9HMM%qT&Bdw|v-$n#!iY=T8YUK(ue9N=wwU0_NM=mAL2 zp*Y(xFwFTX=cg&3Ms->g0%!6-FQOl$uAA41>>l}fQDbqg_2%#gse z^197Q>C5m*Uriyc;iS6_!{X>{2#LpylI(DMNnHRAfr6h>KLFq%-pd6Fk}{HVjKtaz z)w@xAsM3)qqe0ffK3hf7Kj0G$g#Ul-ocTZ0Ya7SEv)G5m7|bAKsWFPNPr@0DH6w-v0dm45q+shSy@t*j=Z?Mpf3I0_u5Mbl#**2->Tn4Qm1s2`yX5YdV0$HF%0 z$H>bGiS>W3QA7?`FOPu~2%soHQZRS2*Ct2zm;QV{0BKR`PVpU9{w)CA9`wO1S2+P8 zoNI21k(ocu!9m6pZ|c8I8)EUH8>UI?UcW=#?1oN5bHW(hVp z8tJFoC-R(zL;6%08Gkwn!rA1h&B`KaVhp?o$yvbQ`Ck|3_0H{r5NKPNw?5*+&xpkI z4CQe1D0XLA4}kz02P9(+!p%c?>gzf+F>H0B5XoRZlr_N#;rmwjTAE_%i>~7>l8<*J zMNsMdcsG!jvMf-SDYsz8xI1diR+*RgfG827zhle3ZRvvKQ{>N_WLV zc@0t!L`emSt6iGRgcMGE4VMVeq183ReDfcBHNKi@>*3&dy&qo?q5zTmPaRWtI1hGg zSNP9S`v$%XPGujxaf4r`%m(hX9Bq0{m5qo1Dgh7I$yOD_04lIRywr>7Rxhu%0E^p@%LRM^=_@cU#LAqR(Yp4=-c zVW#I@Hs!A^Bj3`Dqog1yDaxIeVh|~@442I}jE*@;(z%qwtdzxzsc*K~+QLlB{R!=i#Ee*#nN!?v{4XHNoiVj3*#bTZqW5h zw|? zsgqczC@n7>l{z8O!3QmQ=f1mN6VV~SyXR=TJ{G!lwU;PgN2uys(Pa)wov`$|msZgn z-i$xzWK5{@+7f#;l@Q6^bS*bQ#*j`d1gdbkh!pc1hGxTJ1y8at)8H;5`#xDCuJh;^ zIW3IM9I-ZYFsk4@NmRk~l&Z1k_ZN81#K1S-F4TJj(V5-J9`>7&5Bz)V1!#xE0Kvs3 zIH8+CjWMDBwxx$DGvrR%i-29+fKFNUfxAv4E+qTmMe)&{sVvcLOq4nS!%M>|^l>fN z)<$MapX@^?hqHHm=T0C0JRM;4tRwSk`z@tkj?{Sg13-uY_!LxNn16hi%oaxvYK!L2 zQNfB>69Z$n3)eHP{>i_8I}(Ms&fFpFG{pO0*ZpNzUFBmUjOLkCu#)V8qx_3T5d zc%hZ*8&CnMzV*JQEmM03Gb6h-(&1oo9BndCt?8kYD#zR$<@XmX$d7zE!;ngC_ZPk- zA#ZMuH5BH$0!MgCl-HJ3H;+ypJd^Wb_ipGgKhC(MB?1FQJ8I#JX3J6taDhX0n*M34 zdauHY$s!^;&YZa_tASgJ6RO(Z;7nl)!4*KJxZr_}r4Ym6D*AY5;6VB8n#vTVv9sT| zX5RJ9nW~iLNu|GHO}?CZF)!oCPUs+*0@IP)*+cO?jkk(!oW#Uc2?Gi^=wg5u{VQ*Q z%UxCozqPm0K|8Zu-TJ;^gCYzs^-D@-R-SMXzL zY)9or7fEIOEX&1_u(437iVv65w$YtETvwC;6-{ z#Ove6gqHZ;)sHo2oh`CkdnbfZ9?1|vZ6y?&NFR-^`nQb+K~SteB@HYL2i~@L2aZ1? z%l7Bz2-&A@w9E#V0ERLVi#j|x{Tc9qIDG1o#-k?s(jf1Y_&e4VJq-Z~><>PCRZ3gH z&taJwnr;OPsQR-65G=_K1jEIZWl%f25hWT-ETC0zjZwW)x_XXPXVqB#kN)Sep37T{ zDNG~1QbG#o^1Al!K`3!L)mb)Yq58pGk=@aUrJtr88W1ja!54x=_uy7?3X83JuB0m=0)s<6iwzG3zfIRzl5W*n zSFqS;k-ty1Nw*i4P0Gc@Lh(|kePxvj{DQCie4L7eh+K1T3OG8J8L&O#DSGMyR+;$Z z_TUj#e|?9KbuwNU8jCoDXb@^}1PoSd=3L|=%5d?)gq-WGzM(e~s9O0$()}sy!Q7N8 zBbnFUvQL{f!Jl1`DSw~XUUaR@ zC5nH~yX)dUf8x4052eXqlrAcT^kJ9hvnY zlo4R7-!fWmPNJ6NKV2P?Dh=V>sR!|7k_rk04Y2pJ2SQcJ4g0~2y$xO))KeSsB3qqz zNh%0nk4|(JKa6dS`gOOjdW|uA=TE@`l+!i}x`5F_D-C@DAQ%Sc0{VB9_s2A#&nD+) zsqf2ESh=X^bl2Gd*O4YD>daq66D@z#u`;@@L)1-%;v%RJhVaoL=&mFMjbQSu`;WHE zth_@f+jBz38`kBBXN81ZDC-i(0+5MPoeGsjss|4wQuqvZ^nWv*f~ z_cpC=lWc}P7CubX?rrCBY=1}!y{)B0?){M3`$<5%f(THFY6o?QA6i)rnq^0nR6j{H zw{Z3+){dySZtCTR%7AYpjo`k?k1+hSud>g5g#TL#-iZHrD*Aah?eE{DXXxOk8l1{? zP34Bn5RE6IeVX$n$oHbZ`hS@rICy&W6Ach75)HjPGz5q(IL@1N0m84-ODtJ9V0I#z zn;%j_5lsu0hT4%;qzxjVP|P?+bQms)!&!h^irJuqzA|NQj-r?LDeXi(qy{wK8dKc~t+ z_$qWOmk|Pr{_k7Ad|*6a^T(vhMe?jkxmWu3^Dmk>bWUA0(3pi@vF&Y(ZMkyj2TC*f zgAZq%PbuLekW-WgJ{==Qc+~n7ScQCVHRROp`(?Y*3?!5`>XMTK+O*av_g7&q&dP;3 zu+H$Zpqmqwet5&4!D?ExcgaR6xDhP(snEE~4wwy%SS#G&rF;WxkzXvL*v>aZL}k zTC{7+(owNV@ou_O6t(o?IUV1hy??S^Z+`jhC%yy#Ed2RK{)c5L%lNsA^n*h;RXJ|1 z^38E-Jlg%k@$RELoP`&=2TrAw7pC}c_Wvk{qTaP*+d(4so50f z1_NaTa^4u3VuU2P$vP~NNoFbs+tP-;dHeEFXbe`4MFL{g1&7R`HSmu45Ypz>~p9Y6h&dzxTMlA?~y%mI{|xaOdKD- zvtIS{5Td!3m&{;#PBmB&9}L`_v3|cnh1aOra0VU$kQKfDAEUjpjqJlw#}tgE%DSLodKv-I_f5gi_(r04eLQw&a@a~~Sf z<^Q&`S5ZMKE1sMhZzq#xYsV@qdz)5(rPt4pR?l0F8MJI3?yTcm?LOap0Jw7ZGvD9N zl>a{Hy)=8ktQU=VD3ca=n)O))3g1ajcCYu-Jz=mc`wgi5iF6Bvc!Vb2pE&>vS}OU8 zcl15sc{6)8DJu#*VF4MTAuE0|;ZR2@?a7JSWm%AfZZnd|-z`crc3BOt$0`9`UAhD( zTML`@MQ9Ra1)e5DJCFn5OEBw>t_y!s)Su7CYB%-;I`?3agy;4v8yVxQ_xIv|5M+f) z>W_bHovuqJ$mnk9gnW9^t84xFXTGR$0A?2G2|+~%#%wMii_gCJu-lGE+URfiZ0S!) zQ^~0YGIl^?BbgR;-JRKF-oz~LhDbc&%n(>%zaKVS29k^gRjV30;{D(xa-xN|z;-(T zU;%@VQmaWJ1A!UeQ|j;5WU^ycX=-0!1ZUfR%8-*u4BjaTD`oD=Gk>^STWY*j)Zyf& zomaIbmcbC)VMhmh8S{Pg39s(HN67!lNf@DnpGG6eAC8Q8wQH{8k4X9(IAO%Tu%!$jL%M% z84@N(r$}BD0|5Yx!)S_`$hFMVaHQi|EZ1ZiBZHCa;J@)Smq$7TsW}Ae^thS9nF?<_ z#3dNyBekpgp4)_X0;)ln5AX+Z`vP@8Q@o7}c0#F^+QObnw^WtdMh23mW)J9<9p40s z#>MwC0ArIC>-vPNQqSa?lKc2zDZS{Q9Qy&|yP>gA0Tgro)NI3HuV_GuYTS@H&EqrQ zf3bZ37B};*Y1CHzRG$mq&3ouQy!P0eg|{|`350LLkVR2K$)B4`C*N2xQ@TV3hziN|hH5l`nW2}d8kZEHU**%4 z8^7Mbi7nb-%~pt+A}_tO!V2n-cB=2ptKzE@J0ZR+2RZ4C~BE|T|6)*wyJ)|c+wEh3~b5@oD#1=s`N!=W8f2>PhHXA zg;}$y^at+`tnZoGo;%Cv)JYxRM?ODs_`t7!@g?cEFfa>SK-Fzzu1pu*sl}2@K#+zk0ge#$Lm|udIK$N!JMk|$2&rbI6a3RzLk;OP} z)NQ2F#%nFBT(X&IgNUZt@dNP#NG?ZI408gxZllr_u`CHyb%mn(SyJL0*=VCStxu{? zGF97T<4qmQHveL^|KhIbu#uvRz5s#8Mo{5fb+54SY_6L}47a414K;Ca_ZWs5!?eTq zo*>#h;|V5##aL)nGcA&$=r6^LcWK;^a)FL-mrn`DN^$Hjz9InN;qFM4nQd8oS#e5u zV#jojNNj;wfEk#DA~s#uF~tn3KV71jnRY3poNbPmn5TFpTu#-P!Ish_yclX#mb3P| z*|FB9OZq>Kq@QKJ+gC*3I1V)#sgjuDN~A-M$-zVhU{05Fs!w05D@XT^7T>~S4bkf7!ORoa<)Wmb!E6HRoLQ_Z@MAG*k7|NM=m40c;XOuGUj$ zT-z}SfmGJbG1sRAZ5-gwg#fDECSrNxn87lH7~Y;0DORQGU5%y&lwhz`!bIx1FMikQ zftCkUGCVeVvxL#Gh8tZ$c~2drA?`54eKC2AY)kswsOpm@)K#7G2Q9cz8a!fExhNC%MYhV}tCLp&79l z7q~$EK9~(IW7s)k{ag((mR1ku$vWvQ((!%bYicIwZTiRl+&zrp=%-U5#%0?ZE;&vM zIH3Fe_mLPEeuFMK7I}*PHBzatl(V*T2(eN11B&jSKxG}CsZS4;6za*sb6WUr7bxnw zhE(gxW)Q=u55cmyhLHMdy=^ln>Jng%Z?S!naBdLYH!3I^?9KFO0F>26E?1}=z-rWT$OwtEV;2_Sou0jA9cJr9+G-sP#x2-V-g9N>g#6|;g z45-twf?j)ck`nGhKo~35@$K(K&j>p#DL`9|HWLQb$%;cre69>OX&4CdpGBGQ8| zHU^j9rrZQPaB+<^s4BcdCyJta`H%)j5uVCAYy;#UmZ~|Z25|&oDp}{)I$d<|p>CjV zLX|tv*F8d6)(yp&0l4D@%CwUol}^_`Fyf;a-Nz1*1p|m>0&(O?aG)U<9n*AoFhWWo zoHPe6LWM#S1BK)UhLDtig{m^6b4`XrYsqA~xEd@bEk0@OwcBu761|N9r_)^jC0{JT zn4dC+Vws>Fm&G&QZK_4TM;*|H2^Z9xhskosxBpCm3OiFZ3`quVm#)5fE$(vH-FDkw z>(eX*WX2|HpxGp(`Glrfaqe=`^2=vJj+h8ri7wkLjmN4BbmpLt=Iz$)08t}#!n2xJ4efQbu`-b^5x0la}A zPo?PO$LU9#fpuA)_#q51!D5zrBv~7}g)w0nn|;%Dqj`0sM@K_pW5Y>tLu60WE3*p2 z95Rs^;NWZ?0s$L*6ot4Uj@um5^-h=MD;+?{Se$Ug$=jj|(+`f7=Z@t%nR9b}3t{HQ zVCQ_;z93kyAb4g`?vl!2$DD3As}vL7b}AdD@6YEMtNmfFVvs z#S;tqe)^Yu|Chb`zxM$pUO6Wz*ctkc@=tFfw@x2UjcIh(L-Q{J9{WJ)@iHKJ9y-Kl zLRSI9jzfw8$vZ#P#SaV@VTH3EjpAEvjHx39^I^aM+@3GOALdz}oAAz0qz5S2nRxp3 zYEK@v0P%Kt^duOF%c+!f3`ukf;_j#H;(sXK3g$^gB6GK{61~*jEv1+jfcOE% zsZIz>N-6`tkM&#oZ^M^a5V-GZs&}lLc~*d;;*Gw(N7v(N(OcihqQ=BL2%7t5^k^^T zo2box>Nzlv=s=@Q6bar2(i{&I_L!(at@8K4IqiOyKByu-%s?ttc z9-*ac-$jB!1y;o)>*a%CP?2ZFVBo2Ui&WuJpcIiEgQ)>KSVg2G!7M)J4U^<8y3{cf zh6qnLV2W;8nbSX|8c^|=!aqA0Yx>&AuK?F@u2Kky>%k` zn-J@-4m1E|QTJguv!ct`8|Kkt7+^?fyU2nK0b+eHqP`3I_@{BM778dthcaGS^u=MQ z7aX6l<1^oXd4B$He;7gic6@Z*qv)=Xf(si(2P*|q3AySJldzW=>#j7pGhRtK9=Sx zG7XBDM0I9;PeA-8s%g0K)Py`COrLxJDdCxG3)E-$0DPf)qdC`_>N^XGX2~Myv7_Dw zczm@4FwO+{t_TCt|BudB|GgXXU#*!u;07!HLKRK=ahq$(k(R<+q#~@zv%2q1@sUIpbZD1WLbXb$#}wtTebTrP?WCC_ z36W)fqS);>mVVCy=lK=XZ}hHOPCc%8J!zP>b^ktNVdFkz^c~6V!465DbBhKlsK-T% zsUk_M!|RpDS`aQ<{Wg4Jd9CLJ-znOf5tKH9dL2Q%bEe)?&S8oWr?iKMtr-xpI7y?h zp+3;Z6=&*HBxw*m>3mqrgQhUQA(nk>AzwZJ*-*%(^*seiNe`%fFjpjp)KZo_vt zt!W>o{yj6l^}dB^P`KG5L#r_i5s$?55TgcWJ=+LL+cD5??VvU$L@~h4hYyNEo@^WP z^a1tZwb5~dg$s?Lu6Q+x3F@)bU$TsC`wa~uT@=2(%Qscftf`wizR6B@9AWRea|M6r z>$v(l1{f@v?OZ1?EH5=-GQL|oy-W0iYv*FR3iak-p$}{L!f8{BtvMOxzG7Ug?>_lK z&j;kBE|;QynVS2=+)Q&(xa@f@D>t-e=vH;8%Sc_$>o}~b$Y|r;Kr4@^TVZz{7_&M} z4#y6>^QTl7DC$UB*P(T>=?Nw#Tb1z0L5}NUvroU;BcXJey{mqyHA&kT7tHpK%QNQV zQPVSibo71Clu)XlU+maZyG_HqF+Djp?f}3qZ4AmC4Dp8$W6Yw4b~*q1^8F{&7O}K} zv+d~8aO2vWi|^m{+VI36J-%gHY5x9Wn3(J3H^=++qOnY&r?H65vu^R7>s?j;J@Hrk_h{th z^H=wuPkM&pg_ilnO@nroVTIOU@~^f2BNmU7(6zLd6EcjNJ4hwRBlg^{oK7^S)3&6& zDede|olNRRWpSO+dwXM^mBXPUDrjru&}q(R)vrJ1J$1V@duPCeut0=y&SglvO+BV-qxpeH2lz|&3tn6^c6ZwJO4@A@&TW?nr^oDf}2h;)`9E> zM}twb*7;Lf$&(HK;NBxO+`FD6{}F4V`3vltxdqr_GrIF$!aI9hQ6-H%of9G3cfZZ7B zxgm4mo+D1S#@pxF{;aq08-izNdYK=}_}jbD8IeF63I2+U0ES z!%??%d6d@o_=FKV1v2HEM=>uh^1S1DReDpE)3kqn%w4%=k)T=Tk#VAO4!_L>V2hx6 z-yz?Pp0Eoct!tvN4oi&W3@>ZH5+$nPzS&P@CF<;zSn%Cf%e&Skv# ziLEKKvgP{+sY~_j0)3K4XXQNzC=8mP2dUy+Hu=7sbiB@BX$o69cgKk3gSlogt4`-m zDw`l&^kT>~Ud@ilw@+j*_}eU=iHLV?NZhYy?eSiwZ$)`u zs+g3EhE@JN-aWQ|LQqNBuUUt3ZTiy;JUU}m=xuWBr*OlABPu>JqBcl#Cn(p-$3--R zZYX-ScHFC;9XIbcmuD>aQ{&%?)j@_ zXWsq73F(Mdbdunjr9iWAOXwKv@Iy&hq! z(%12&k2es<48Nc$G_G5d!?z4Pv(BPgfS%d<_+mZHU?&%)eAGU+6# zSyDhC?a5QZePfm5*^<@zm?|qS?#@_ z_!0m>zewNNUW;^byK_CHb-F+0o!Bv^tXd&!u`8^<3;puw_@*sDfg49u;a*L%!Ta925NhoCnL86 zXdcCo9ZkUAN_KCWQBck@b)Mg-si5fDavm7uuT^TmBFC1gdKT0lsQkv%7kN&xCkTPD z`NlPKsSZ0$9>QYMJ*1u$i%n|o858*AL~+a#c{4G8^orN#r!i0s&mq~PXJ}rIj_D8yE>p1+YU1nn4ew%0oVcKT__Ds-;mPP0_cdN z5X@4JGNBC)CN0UBeim>maI|#e@}Jp}{kBJpd5Eh5-P} z5db8y;x_F{HcV_wg}P z)PoM;0(eihbdzovB7p8Os;jO04Pc|7Es&_B^+t};^@e@$H>wxsv87^s5Cc-o=*{E7 zpa>JN{OkGCVHPU{TPT%^H)}{&6Ntd4+JhT$SJ)(T)aU*AUs*(4YT(r3-{^?R0Gc&< zT~DQ8&=VpCu`rjj!%7F1mL^A(T{$%PQF!T}hwfPlWLIN$(kmn7vdBkP|`l!csEx%m_mnA6m#iN z%Dc2^oFq+UrbHYW$C4o;QYA=fkNBBguO5kv9FLQYtW8s5qpnr8rGG513)U#aJQhL5 z(P5S*NK=frnFnLGEsN`epTv8{fH>x1zN_}x$&V4O6BPBVCRWGyp-&CRO8jdds5?J{ zBmg9Iu4SRzEZgjsrKqG@%v&4gFD*t`2MBYBIFTm#@X_JjG5iB`X>#oHTaZ+m)h9#A zoss*LDRK#;4|N0-LMFIe-)#ilFFI8<_ouH(6A|t#Fp;S=_Z%_aYjA)Umc*>NrijGp z{?67)(@s)77P@d7_2hu)B#2uG!Tc>tI^<|ppE2ta?J8fYw0QgRMg5j51Ww~DQY9?s zoao_|!!S@1pTtSYPz~V4X0(Z%fD2(q!a`JgixU06*uOMjKX5+v+`HEQLmEF+b5l_J zOc|SSO`56UCnUOHsZIK6d+sD%7?CuuW#e7^EmVdtm14L*(1tq_#dJhagS&@k>(h>S z(FN-5EnU}6&|Qj#P>b6!0VWbfA0Ett+(TTJUKR_3#&Uqgo zndJoU+9&(zL1p!(4B0ZV2TciMk+h#D&wM)6V(}^bNc9ZTmb38U*hE@2m^s5(5QaKd zo!+ue4}_A~x&WU@fmxJPd=#2Ubqw!JhB}jdKgJije2O?c@hWYGjxW7M076@ zlcu9g7*_0Cq$OYjh1Jeb>B?*%JNg8B>C7wCfN#Z(XGPbOnDrV#zCvM%O$4G1`141^ za$fB{&0<;-g@6Iz^=y&NeF?pydMu{A^$NN>9n`JgyWZU#YsIpE@Rbb;CP}OKp`P&f zit~5^91H^HfnbmAO1rK5qv_h(_!*+b_ufvi0-(oo77;JSxbm>FY8OSA5oussn%4rJ zThwqRLf5T^KgtKW#NH`oiFj5(6F~UlMMk-xfNAy zk-;{mmOcY{%91jJEmxdx=vpK z0Z=8>aR5`){iJPhPzFfLV^UjBG~o;HoTkrXh!^j!GC*|hkngqqLCIiJo2R$cHMcUld6syUVJ0j zXXYb|opLK+QqCzkI6n0P!;3A<};(m!$10$*icuFP@(s3#m^PIGd7*s$!(l4Wa~1E z`<2TkG`ND>_5ma|Ce>wPQv`eEqUR~IVy!llQTqU)O7pkf-`PDzfCA!>bb_tykmZ%4 znLBcA^TvzNW0;@8gq|GX;Wr)sAJ*@`dNcp0o_%;UYqUQ_wI{pgpW(d}h45l0z#GE| zJHw6TrA|xMzB+!o+xuqO!_|vUwVr|D)B2Vj^V3?5SfSs~8@h2Rb;&h#zSZmi{J?bv z!xJ=&ZOBnCb7@LlJJGt@X^O2hAr)Zc?=*=TxnvX7e`V*~pcU2$$v7fU47}b-de+Ds zBiow(cKcYM+lw14HllD_b9=Ld((3qbA9k6;2A0h%(Ah`2{n_tVuW7l}MPNHIWi;|* z&bpC2)*eRElRWfRp5{>M(2KTlG;Zp%zl%GWU^QPIXOL_$}$- zOoZo$o#4mb7#dY>NxRElFY<(&^aq(0GgW@Y*V_1FYq@!&^i!O8W9QG`vr70b_T2YY zd!JO*WKA;9$qup#EPcfuW_(7Uh*3&sP8~ZoYsF{2|Ku+Ecl>eue2o)Rb$aYx00fAh z4J%U|^YFWa^A}tRy%dcYdOaqv@>`r@d}o zeV=_H(lXfhm#0+w%BrY4oY|#A?xa5c7(bffFxjv`zbc6)`^o;jkv65^#k|R}Eza>v z&a7K|sQp@yU8LO3_w}jnqPww;d(3vUz6(3NG;&hnjz<}H$7%hyJ{~DNH0SQI0AR}5 zqC*SwpPkOzpU~v}`s~`xO^=rR@Zr+ZyFc7JiLop52d}<4YojZ1cl8DvI%_%YyZCeW z7~igAIlydLz}=F0n|c~A4*6sli$67J@fWu97`;lRVnle zD)dN+ah-nhNP~PTeN0@*h|W;30bzZD6Qgb*+W*+5o z8NHl9!f3&(31@R&E#s{}z!=)%{Af0Q`8e%&YtT}4-42sxq)b}9&B-C7zT4vVncO2+ z^D5|}TV5=kH)>^y9gsFgUX=12EllJ>cc+>1oA;U8)6@UgvkS+NFu?v{%YIq=Po@sd zl@scIZkeFG<2P1W|BJ)9#(Y*|$8Qc7=%UoCm!YVWeOUdRgg`{#JzSOZ2X~ENZmw?q zc6!~nz5`qt_{5h000(St?mE;hWs=6NY1*x~Rb$b)A7xPQKJs zim-L!3Yl})%dpE=UxxK9c^M|?ny6pD!K-Uytw(T>r6s4gp5VOKbwHQu{N}@*Pj-E{ zdGPG;$6Es#itR&S@p1wCX{B}Fa{E!la^%qPsU960$9r_>iChVwBxMD=CuNjz&)kpI zKYc9LVjAz}In+pMDOxaZZk^=%{6CW4Tw?@LB^`4Unnu zfRYhBUS&yNt5}|Hp?GlpqHy(ak* z`F$1#7tH?$-~ZGr_3xEzBPdBW@kcoYyFd5u%X+%>!-#%X$qtCjjNEQ-oB48Y#ZUPM zUOpQVZgN`IA(5jD+bjW!qS8!ONpbB3>XVW4q)KP`d0+%{A7?e25 zqz7w_()Xc=6gQONACjw$qj!16<0Y&9J|U^{4Y`^H_!i z2vo%gQg%^ZkDC$-;dJOCVeaPqu~0utAx2TUml_dm7Q)eb8i{8%um0K~sZ>gErNEs3 zBEFwEQ|T$|bB#yOe|7OSxu zIGVn=ieU_6%))$!uSD1B&cqI3ZO%aq<7B}BwOA;)j6-Ps9_@eRORBN&7+ws%KAZ7& zdeHKzzgtnC3~MU95KE%56AC=WFxvWA5@xQ~E8x-+qvz2QX`7KYd@lj+AH5DPgpw<# z^}msSXP1s|&G2Ik6j*zYzJT@Ve6`8s#KvAvxg()OxuH`mX64${|I*vQy4kgn;F~j` zu3{u?oMue+$nkt~uwKqju&QfC-|P*jqz~gVa1E0-`s27@7E%Y#Y~cGEagQQn-0Nni z(j^un<50W-p#7OD5?G7N@46WQ>5t4$`x{H4Z z!-|DMB-g1~cT<@5M^W@rP=gutY!AgOMIM+bVSyol1lwE?f!U}|VPT{MGbKYAKwRwj zYaeUTW28!U)oO4@HN)7njr4$k7JMngJ6?dC!6i~HzLaQ#fgkAwYVOorrSo~wsXtv# z-@%j;!^4Y6+JPlDYGRYKgN;NP-Eb;W#Sp*(UO7i8o!c{rE=;Sh+)>B(XYXr_q2gnI zy?;djaL{d(&gI6e1pD+JLHH;J3qwtnmSRC|&H*>O^iNIEEzTvNLL*JWhq;==5lIkhw8!e3p zn1OO805M?Ft?-Zj=l_F$>nfc`ju`J>(06nPaU#3Lvz!-di<_z~Sy+c-<+)mg*xZ}b z#$cZCqOXG|bfR~70`w$eDT>qO=zKJpB<*U+P1~m=B_;HwPSQq3w1?8OM<#OD+)z7- z>RZakmBYwBED^GY5yej0Ev4J@Aco6UQ5ZT?d{wpD6Lo~<_8B9Hu%WL}T_!6I22=yc z$9+^AJ5^tFl0!_!EEXrq3bmL8?E$3c7buErOd@2<8VdDcf1P${9~@m$NpH70z8zl4 zzwm&6y8j%myvOsD`AY?~Px3%`HtiLJ=pDT;1x2%4a|%66cIsr%iQZADVYf^~S$hlH! z4EK{X-AoX>`2q@eoWA>i@S=VKW{%^-X%7_*(;p=2$T-t>wrqW~g1%%NE1j!*XD}IN zdYVv7V)O{in9KlI^|Rikg#s<{S|KSmr#Jg_*U#(s?{Cuo3ExAej&X`?rl_55vrEn{ zSh3{kBP#a&zMV%-<)Ep9PYzi=IJ2T@s+Ah{T;Y`#`hI?i*SzxLvu?@SJ%3B|wTfIM zd*ORXywk5qB;KLpJK63GyYA8p&8PDf2>{oRwysJ(olH@i-P~s#C~ivko3y?lGRHG0 zWmoUvX`7&*ew-yd+js5So%`N3@=GUV?g+X67ID8=7F1O%aPvc|0DVS7tO&*j&3@>49k}6iNbZ-y?=lI zejiKQc&<_If7&tfMhWiP0UiV^0NVL|YJnFD=Nu~FkG0GzTykV!82Vkqq|+c}?XTE- z{7r-W`w?B|`eyDrA8@+1-Q6nXhDTBG%(Cxizq&hW(H?=3_)t9UO0tT4x!fBV`Wb<*NN7Wx zVFiC>@!$A, + /// Play a notification sound when the countdown is up + #[clap(short, long)] + pub sound: bool, // internal variables #[clap(skip)] @@ -406,19 +409,26 @@ impl Clock { fn notify(&mut self) -> anyhow::Result<()> { Self::beep()?; #[cfg(feature = "sound")] - { - trace!("playing bundled sound"); - use rodio::{source::Source, Decoder, OutputStream}; + if self.sound { + std::thread::spawn(|| { + use rodio::{Decoder, OutputStream, Sink}; + // only 30 KiB, so let's just include it in the binary and not worry about reading it + // from the fs and somehow making the file be there + const SOUND_RAW: &[u8] = include_bytes!("../data/media/alarm.mp3"); - // only 30 KiB, so let's just include it in the binary and not worry about reading it - // from the fs and somehow making the file be there - let sound: Cursor<_> = std::io::Cursor::new(include_bytes!("../data/media/alarm.mp3")); + trace!("playing bundled sound"); - // Get an output stream handle to the default physical sound device - let (_stream, stream_handle) = OutputStream::try_default().unwrap(); - let source = Decoder::new(sound).expect("could not load the included sound"); - stream_handle.play_raw(source.convert_samples())?; // the sound plays in another thread - debug!("played bundled sound"); + let sound_data: Cursor<_> = std::io::Cursor::new(SOUND_RAW); + + let (_stream, stream_handle) = OutputStream::try_default().unwrap(); + let sink = Sink::try_new(&stream_handle).unwrap(); + sink.append( + Decoder::new(sound_data).expect("could not decode the bundled alarm sound"), + ); + sink.sleep_until_end(); + + debug!("played bundled sound"); + }); } #[cfg(feature = "desktop")] { From bf53e6c3ef53145ccd3838d2598b1a5cb2928e17 Mon Sep 17 00:00:00 2001 From: "Christoph J. Scherr" Date: Fri, 12 Jul 2024 15:16:46 +0200 Subject: [PATCH 30/40] refactor(notify): let the desktop notification time out --- src/clock.rs | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/clock.rs b/src/clock.rs index a3c59bc..eb2cdde 100644 --- a/src/clock.rs +++ b/src/clock.rs @@ -455,12 +455,9 @@ impl Clock { // not like the moon is crashing into the earth notify.urgency(notify_rust::Urgency::Normal); - // The user wants to be notified, otherwise he wouldn't set this - // option. The notification should stay, until the user makes it go - // away. This is useful when the user leaves their workstation, comes - // back some time later, and the duration has been reached during the - // time he was away. - notify.timeout(notify_rust::Timeout::Never); + // We don't need to have it be displayed for ever, the TUI shows that the time is up + // (100%) already. + notify.timeout(notify_rust::Timeout::Default); notify.summary(&format!( "Your countdown of {} is up.", From 21e9916cba3ebfd5f064fa8c9e05138c7a1e0e08 Mon Sep 17 00:00:00 2001 From: "Christoph J. Scherr" Date: Fri, 12 Jul 2024 15:21:08 +0200 Subject: [PATCH 31/40] chore: bump alpha version --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index f616812..6f5d01f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "crock" -version = "0.2.0-alpha.1" +version = "0.2.0-alpha.2" edition = "2021" publish = true authors = ["Christoph J. Scherr "] From ec42625516bf97975d5506504a8d9ec5aa9354a5 Mon Sep 17 00:00:00 2001 From: "Christoph J. Scherr" Date: Fri, 12 Jul 2024 15:32:35 +0200 Subject: [PATCH 32/40] chore: add system deps to the CI --- .gitea/workflows/cargo.yaml | 4 ++++ .github/workflows/cargo.yaml | 14 ++++---------- 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/.gitea/workflows/cargo.yaml b/.gitea/workflows/cargo.yaml index 17bbd59..22724f8 100644 --- a/.gitea/workflows/cargo.yaml +++ b/.gitea/workflows/cargo.yaml @@ -21,6 +21,10 @@ jobs: run: | rustup component add rustfmt rustup component add clippy + - name: install additional system dependencies + run: | + apt update + apt install libdbus-1-dev libasound2-dev -y - name: config custom registry run: | mkdir -p ~/.cargo/ diff --git a/.github/workflows/cargo.yaml b/.github/workflows/cargo.yaml index 8695471..e7522ad 100644 --- a/.github/workflows/cargo.yaml +++ b/.github/workflows/cargo.yaml @@ -22,6 +22,10 @@ jobs: run: | rustup component add rustfmt rustup component add clippy + - name: install additional system dependencies + run: | + apt update + apt install libdbus-1-dev libasound2-dev -y - name: config custom registry run: | mkdir -p ~/.cargo/ @@ -33,13 +37,3 @@ jobs: cat ~/.cargo/config.toml - name: cargo clippy check run: cargo clippy --all-features --all-targets --workspace - - name: cargo clippy fix - run: cargo clippy --fix --all-features --all-targets --workspace - - name: cargo fmt - run: cargo fmt --all - - name: commit back to repository - uses: stefanzweifel/git-auto-commit-action@v5 - with: - # Optional. Commit message for the created commit. - # Defaults to "Apply automatic changes" - commit_message: automatic cargo CI changes From 186a96ef7e645ab6ebcda1f8004fbc2fbc2bdaf7 Mon Sep 17 00:00:00 2001 From: "Christoph J. Scherr" Date: Fri, 12 Jul 2024 15:33:10 +0200 Subject: [PATCH 33/40] refactor: remove a lot of unneeded dependencies --- Cargo.toml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index 6f5d01f..e95cb38 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -23,7 +23,9 @@ anyhow = "1.0.86" chrono = "0.4.38" humantime = "2.1.0" libpt = { version = "0.6.0", features = ["cli"] } -notify-rust = { version = "4.11.0", optional = true } +notify-rust = { version = "4.11.0", default-features = false, features = [ + "d", +], optional = true } ratatui = "0.27.0" rodio = { version = "0.19.0", optional = true, default-features = false, features = [ "mp3", From f4eef60a9ecd0b606211b786107bda1e3c0bee62 Mon Sep 17 00:00:00 2001 From: "Christoph J. Scherr" Date: Fri, 12 Jul 2024 15:42:59 +0200 Subject: [PATCH 34/40] fix(notify): only notify in countdown mode (fixes a panic) --- src/clock.rs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/clock.rs b/src/clock.rs index eb2cdde..01e2721 100644 --- a/src/clock.rs +++ b/src/clock.rs @@ -362,6 +362,13 @@ impl Clock { debug!("complete error: {e:#?}"); }); self.did_notify = true; + if let Some(TimeBarLength::Countup(_)) = self.timebar_len() { + let _ = self.notify().inspect_err(|e| { + error!("could not notify: {e}"); + debug!("complete error: {e:#?}"); + }); + self.did_notify = true; + } } let tmp = LineGauge::default() From 9a2629c27323f463412a03a1b35e565dd22e1dd7 Mon Sep 17 00:00:00 2001 From: "Christoph J. Scherr" Date: Fri, 12 Jul 2024 15:46:09 +0200 Subject: [PATCH 35/40] fix(cli): custom option tried to load the countdown duration --- src/clock.rs | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/src/clock.rs b/src/clock.rs index 01e2721..2cc82e9 100644 --- a/src/clock.rs +++ b/src/clock.rs @@ -154,7 +154,7 @@ impl Clock { ))) } else if self.custom.is_some() { Some(TimeBarLength::Custom(i128::from( - self.countdown.unwrap().as_secs(), + self.custom.unwrap().as_secs(), ))) } else { None @@ -325,7 +325,7 @@ impl Clock { data: &UiData, ) -> anyhow::Result<()> { let clockw = tui_big_text::BigText::builder() - .style(Style::new().red()) + .style(Style::new().red().on_light_blue()) .lines(vec![data.ftime().into()]) .alignment(Alignment::Center) .build() @@ -356,12 +356,6 @@ impl Clock { let ratio = data.timebar_ratio().unwrap(); if !self.did_notify && (ratio - 1.0).abs() < 0.000_001 { - if let Some(TimeBarLength::Countup(_)) = self.timebar_len() {} - let _ = self.notify().inspect_err(|e| { - error!("could not notify: {e}"); - debug!("complete error: {e:#?}"); - }); - self.did_notify = true; if let Some(TimeBarLength::Countup(_)) = self.timebar_len() { let _ = self.notify().inspect_err(|e| { error!("could not notify: {e}"); @@ -382,6 +376,7 @@ impl Clock { } else { Style::default().blue() }) + .on_cyan() .unfilled_style(Style::default()) .block(Block::new().padding(Padding::new( parts[2].left() / 10, @@ -399,6 +394,7 @@ impl Clock { let datew = Paragraph::new(data.fdate()) .blue() .alignment(Alignment::Left) + .on_gray() .block(Block::new().padding(Padding::new( parts[1].left(), parts[1].right() / 3, From 83e318559e3cacb452f2e191552d3871544fb060 Mon Sep 17 00:00:00 2001 From: "Christoph J. Scherr" Date: Fri, 12 Jul 2024 16:23:26 +0200 Subject: [PATCH 36/40] refactor(tui): widgets (besides clockw) are now visible in small horizontal terminals #11 --- src/clock.rs | 44 ++++++++++++++++++++------------------------ 1 file changed, 20 insertions(+), 24 deletions(-) diff --git a/src/clock.rs b/src/clock.rs index 2cc82e9..20cc41a 100644 --- a/src/clock.rs +++ b/src/clock.rs @@ -325,7 +325,7 @@ impl Clock { data: &UiData, ) -> anyhow::Result<()> { let clockw = tui_big_text::BigText::builder() - .style(Style::new().red().on_light_blue()) + .style(Style::new().red()) .lines(vec![data.ftime().into()]) .alignment(Alignment::Center) .build() @@ -335,10 +335,10 @@ impl Clock { let root = frame.size(); let space = Block::bordered() .padding(Padding::new( - root.width / 8, - root.width / 8, - root.height / 8, - root.height / 8, + root.width / 16, + root.width / 16, + root.height / 16, + root.height / 16, )) .title(env!("CARGO_PKG_NAME")) .title_bottom(env!("CARGO_PKG_VERSION")) @@ -365,7 +365,7 @@ impl Clock { } } - let tmp = LineGauge::default() + let timebarw = LineGauge::default() .filled_style(if self.did_notify { Style::default() .slow_blink() @@ -376,16 +376,14 @@ impl Clock { } else { Style::default().blue() }) - .on_cyan() .unfilled_style(Style::default()) - .block(Block::new().padding(Padding::new( - parts[2].left() / 10, - parts[2].right() / 6, - 0, - 0, - ))) + .block(Block::default().padding(Padding::right(if root.width > 80 { + (f32::from(parts[2].width) * 0.43) as u16 + } else { + 2 + }))) .ratio(ratio); - Some(tmp) + Some(timebarw) } else { None }; @@ -393,14 +391,8 @@ impl Clock { // render the small date let datew = Paragraph::new(data.fdate()) .blue() - .alignment(Alignment::Left) - .on_gray() - .block(Block::new().padding(Padding::new( - parts[1].left(), - parts[1].right() / 3, - 0, - 0, - ))); + .block(Block::default().padding(Padding::right(2))) + .alignment(Alignment::Right); frame.render_widget(&timebarw, parts[2]); frame.render_widget(datew, parts[1]); // render the clock @@ -484,11 +476,15 @@ impl Clock { fn partition(r: Rect) -> Vec { let part = Layout::default() .direction(Direction::Vertical) - .constraints([Constraint::Length(8), Constraint::Min(0)]) + .constraints([Constraint::Length(8), Constraint::Length(3)]) .split(r); + let hlen_date: u16 = (f32::from(part[1].width) * 0.35) as u16; let subparts = Layout::default() .direction(Direction::Horizontal) - .constraints([Constraint::Min(10), Constraint::Ratio(1, 2)]) + .constraints([ + Constraint::Length(hlen_date), + Constraint::Length(part[1].width - hlen_date), + ]) .split(part[1]); vec![part[0], subparts[0], subparts[1]] From e67c37a9c1c6cead049e99e52bb3d8ad223b72fb Mon Sep 17 00:00:00 2001 From: "Christoph J. Scherr" Date: Fri, 12 Jul 2024 16:50:29 +0200 Subject: [PATCH 37/40] feat(tui): scale clockw font dynamically #11 --- src/clock.rs | 29 ++++++++++++++++++++--------- 1 file changed, 20 insertions(+), 9 deletions(-) diff --git a/src/clock.rs b/src/clock.rs index 20cc41a..855cd25 100644 --- a/src/clock.rs +++ b/src/clock.rs @@ -324,12 +324,6 @@ impl Clock { terminal: &mut Terminal>, data: &UiData, ) -> anyhow::Result<()> { - let clockw = tui_big_text::BigText::builder() - .style(Style::new().red()) - .lines(vec![data.ftime().into()]) - .alignment(Alignment::Center) - .build() - .expect("could not render time widget"); terminal.draw(|frame| { debug!("rendering the ui"); let root = frame.size(); @@ -348,6 +342,20 @@ impl Clock { frame.render_widget(space, root); let parts = Self::partition(a); + let mut clockw = tui_big_text::BigText::builder(); + if a.width > 80 { + clockw.pixel_size(tui_big_text::PixelSize::Full); + } else { + clockw.pixel_size(tui_big_text::PixelSize::Quadrant); + } + + let clockw = clockw + .style(Style::new().red()) + .lines(vec![data.ftime().into()]) + .alignment(Alignment::Center) + .build() + .expect("could not render time widget"); + // render the timebar which counts up to the full minute and so on // // Will not be rendered if it is None @@ -377,10 +385,10 @@ impl Clock { Style::default().blue() }) .unfilled_style(Style::default()) - .block(Block::default().padding(Padding::right(if root.width > 80 { + .block(Block::default().padding(Padding::right(if a.width > 80 { (f32::from(parts[2].width) * 0.43) as u16 } else { - 2 + (f32::from(parts[2].width) * 0.25) as u16 }))) .ratio(ratio); Some(timebarw) @@ -476,7 +484,10 @@ impl Clock { fn partition(r: Rect) -> Vec { let part = Layout::default() .direction(Direction::Vertical) - .constraints([Constraint::Length(8), Constraint::Length(3)]) + .constraints([ + Constraint::Length(if r.width > 80 { 8 } else { 5 }), + Constraint::Length(3), + ]) .split(r); let hlen_date: u16 = (f32::from(part[1].width) * 0.35) as u16; let subparts = Layout::default() From 9b7f36870fb918b9ee70d375d68370db935c7026 Mon Sep 17 00:00:00 2001 From: PlexSheep Date: Fri, 12 Jul 2024 17:00:46 +0200 Subject: [PATCH 38/40] chore: remove github CI, because I cant install system deps there, which we need to compile --- .github/workflows/cargo.yaml | 39 ------------------------------------ README.md | 1 - 2 files changed, 40 deletions(-) delete mode 100644 .github/workflows/cargo.yaml diff --git a/.github/workflows/cargo.yaml b/.github/workflows/cargo.yaml deleted file mode 100644 index e7522ad..0000000 --- a/.github/workflows/cargo.yaml +++ /dev/null @@ -1,39 +0,0 @@ -name: cargo devel CI -on: - push: - branches: - - '**' - # - '!master' - -jobs: - CI: - runs-on: ubuntu-latest - name: cargo CI - permissions: - # Give the default GITHUB_TOKEN write permission to commit and push the - # added or changed files to the repository. - contents: write - steps: - - name: get repo - uses: actions/checkout@v4 - - name: install rust - uses: dtolnay/rust-toolchain@stable - - name: install additional rust things - run: | - rustup component add rustfmt - rustup component add clippy - - name: install additional system dependencies - run: | - apt update - apt install libdbus-1-dev libasound2-dev -y - - name: config custom registry - run: | - mkdir -p ~/.cargo/ - echo "" > ~/.cargo/config.toml - echo "[registry]" >> ~/.cargo/config.toml - echo 'cscherr = "cscherr"' >> ~/.cargo/config.toml - echo '[registries.cscherr]' >> ~/.cargo/config.toml - echo 'index = "https://git.cscherr.de/PlexSheep/_cargo-index.git"' >> ~/.cargo/config.toml - cat ~/.cargo/config.toml - - name: cargo clippy check - run: cargo clippy --all-features --all-targets --workspace diff --git a/README.md b/README.md index 6f6c313..6bca9b3 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,6 @@ ![Crates.io License](https://img.shields.io/crates/l/crock) ![Gitea Release](https://img.shields.io/gitea/v/release/PlexSheep/crock?gitea_url=https%3A%2F%2Fgit.cscherr.de) ![Gitea language count](https://img.shields.io/gitea/languages/count/PlexSheep/crock?gitea_url=https%3A%2F%2Fgit.cscherr.de) -[![cargo checks and tests](https://github.com/PlexSheep/crock/actions/workflows/cargo.yaml/badge.svg)](https://github.com/PlexSheep/crock/actions/workflows/cargo.yaml) A little clock for your terminal, written in rust. From 5eb07fabc88069936bb9d71efe615d7c98621ce5 Mon Sep 17 00:00:00 2001 From: PlexSheep Date: Fri, 12 Jul 2024 17:04:14 +0200 Subject: [PATCH 39/40] refactor: move additional information like date and timebar over clockw --- src/clock.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/clock.rs b/src/clock.rs index 855cd25..162eb0f 100644 --- a/src/clock.rs +++ b/src/clock.rs @@ -485,8 +485,8 @@ impl Clock { let part = Layout::default() .direction(Direction::Vertical) .constraints([ - Constraint::Length(if r.width > 80 { 8 } else { 5 }), Constraint::Length(3), + Constraint::Length(if r.width > 80 { 8 } else { 5 }), ]) .split(r); let hlen_date: u16 = (f32::from(part[1].width) * 0.35) as u16; @@ -494,10 +494,10 @@ impl Clock { .direction(Direction::Horizontal) .constraints([ Constraint::Length(hlen_date), - Constraint::Length(part[1].width - hlen_date), + Constraint::Length(part[0].width - hlen_date), ]) - .split(part[1]); + .split(part[0]); - vec![part[0], subparts[0], subparts[1]] + vec![part[1], subparts[0], subparts[1]] } } From c0bf412c4a84b055ea7bab6bf8138b79693a9898 Mon Sep 17 00:00:00 2001 From: PlexSheep Date: Fri, 12 Jul 2024 19:00:56 +0200 Subject: [PATCH 40/40] chore: bump to v0.2.0 --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index e95cb38..bbd6632 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "crock" -version = "0.2.0-alpha.2" +version = "0.2.0" edition = "2021" publish = true authors = ["Christoph J. Scherr "]