Add cross-platform notification support
This commit is contained in:
@@ -1,7 +1,7 @@
|
||||
use domasi::Pomodoro;
|
||||
|
||||
fn main() {
|
||||
let mut timer: Pomodoro = Default::default();
|
||||
let mut domasi: Pomodoro = Default::default();
|
||||
|
||||
timer.start();
|
||||
domasi.start();
|
||||
}
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
use std::error::Error;
|
||||
use std::fmt::{Display, Formatter, Result as FmtResult};
|
||||
use std::io::{self, Write};
|
||||
use std::thread;
|
||||
@@ -11,11 +12,12 @@ pub struct Pomodoro {
|
||||
paused: PausedState,
|
||||
}
|
||||
|
||||
static POLLING_RATE: Duration = Duration::from_millis(300);
|
||||
static POMODORO_CYCLES: u64 = 5;
|
||||
static WORK_TIME: u64 = 2;
|
||||
static SBREAK_TIME: u64 = 2;
|
||||
static LBREAK_TIME: u64 = 2;
|
||||
|
||||
static POLLING_RATE: Duration = Duration::from_millis(300);
|
||||
impl Pomodoro {
|
||||
pub fn new() -> Self {
|
||||
Self::default()
|
||||
@@ -30,6 +32,60 @@ impl Pomodoro {
|
||||
}
|
||||
}
|
||||
|
||||
fn notify_complete(&self) -> Result<(), Box<dyn Error>> {
|
||||
let mut toast = notify_rust::Notification::new();
|
||||
toast.summary("Pomodoro cycle complete!");
|
||||
toast.body("domasi will now exit.");
|
||||
toast.show()?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn notify(&self) -> Result<(), Box<dyn Error>> {
|
||||
fn pmdr_cycle_count(i: u64) -> String {
|
||||
let i = i / 4;
|
||||
match i {
|
||||
1 => "After this, you will have completed 1 cycle.".to_string(),
|
||||
_ => format!("After this, you will have completed {} cycles.", i),
|
||||
}
|
||||
}
|
||||
|
||||
fn work_sesh_num(i: u64) -> &'static str {
|
||||
match i % 4 {
|
||||
0 => "Time for your 1st work session.",
|
||||
1 => "Time for your 2nd work session.",
|
||||
2 => "Time for your 3rd work session.",
|
||||
3 => "Time for your 4th work session.",
|
||||
_ => unreachable!(),
|
||||
}
|
||||
}
|
||||
|
||||
let mut toast = notify_rust::Notification::new();
|
||||
|
||||
match self.state {
|
||||
State::Inactive => {}
|
||||
State::Work => {
|
||||
toast
|
||||
.summary(work_sesh_num(self.count))
|
||||
.body("Remember to stay focused.")
|
||||
.show()?;
|
||||
}
|
||||
State::ShortBreak => {
|
||||
toast
|
||||
.summary("Time for a quick break.")
|
||||
.body("Sit back and relax.")
|
||||
.show()?;
|
||||
}
|
||||
State::LongBreak => {
|
||||
toast
|
||||
.summary("Enjoy your long break!")
|
||||
.body(&pmdr_cycle_count(self.count))
|
||||
.show()?;
|
||||
}
|
||||
};
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn poll(&mut self) -> Status {
|
||||
let status = self.check();
|
||||
|
||||
@@ -59,10 +115,13 @@ impl Pomodoro {
|
||||
State::Work | State::ShortBreak | State::LongBreak => Some(Instant::now()),
|
||||
};
|
||||
|
||||
let _ = self.notify();
|
||||
self.display_time();
|
||||
}
|
||||
Status::Complete => {
|
||||
println!("\rPomodoro Cycle Complete!");
|
||||
println!("\rPomodoro cycle complete!");
|
||||
|
||||
let _ = self.notify_complete();
|
||||
}
|
||||
Status::Inactive => {}
|
||||
};
|
||||
@@ -81,6 +140,10 @@ impl Pomodoro {
|
||||
fn print(text: &str) -> io::Result<()> {
|
||||
let out = io::stdout();
|
||||
let mut handle = out.lock();
|
||||
|
||||
// Empty String so that we can clear line before writing
|
||||
// from the mostleft side of the terminal again.
|
||||
handle.write_all(b"\r ")?;
|
||||
handle.write_all(text.as_bytes())?;
|
||||
handle.flush()?;
|
||||
Ok(())
|
||||
@@ -118,10 +181,10 @@ impl Pomodoro {
|
||||
}
|
||||
}
|
||||
None => {
|
||||
if self.count == 0 {
|
||||
Status::NextState
|
||||
} else {
|
||||
if self.count / 4 == POMODORO_CYCLES {
|
||||
Status::Complete
|
||||
} else {
|
||||
Status::NextState
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user