Implement status window to resolve #2

A status window to tell the user the next steps.
Right now only provides warnings about missing
intention and invalid session duration.
This commit is contained in:
2024-07-06 09:30:03 -04:00
parent 860fe615ab
commit 49bafa2567

View File

@@ -57,7 +57,7 @@ impl App {
App { App {
state: State::InputIntention, state: State::InputIntention,
user_intention: String::new(), user_intention: String::new(),
user_duration_str: String::new(), user_duration_str: "25".to_string(),
user_duration: Duration::new(0, 0), user_duration: Duration::new(0, 0),
current_window_title: window_title.into(), current_window_title: window_title.into(),
current_window_time: Instant::now(), current_window_time: Instant::now(),
@@ -81,12 +81,9 @@ impl App {
} }
fn to_in_progress(&mut self) { fn to_in_progress(&mut self) {
let Ok(user_duration) = self.user_duration_str.parse::<u64>() else { if self.user_intention.len() == 0 || self.user_duration == Duration::ZERO {
// TODO: Print error to the user
return; return;
}; }
self.user_duration = Duration::from_secs(user_duration * 60);
self.state = State::InProgress; self.state = State::InProgress;
self.current_window_time = Instant::now(); self.current_window_time = Instant::now();
self.session_start = self.current_window_time; self.session_start = self.current_window_time;
@@ -103,6 +100,12 @@ impl App {
fn tick_50ms(&mut self) { fn tick_50ms(&mut self) {
match self.state { match self.state {
State::InputIntention | State::InputDuration => { State::InputIntention | State::InputDuration => {
if let Ok(user_duration_mins) = self.user_duration_str.parse::<u64>() {
self.user_duration = Duration::from_secs(user_duration_mins * 60);
} else {
self.user_duration = Duration::ZERO;
}
window::minimize_other("AntiDrift"); window::minimize_other("AntiDrift");
} }
State::InProgress => { State::InProgress => {
@@ -115,7 +118,9 @@ impl App {
} }
} }
State::ShouldQuit => {} State::ShouldQuit => {}
State::End => {} State::End => {
window::minimize_other("AntiDrift");
}
} }
self.last_tick_50ms = Instant::now(); self.last_tick_50ms = Instant::now();
@@ -293,15 +298,16 @@ fn ui(frame: &mut Frame, app: &App) {
Constraint::Min(3), Constraint::Min(3),
Constraint::Min(3), Constraint::Min(3),
Constraint::Percentage(100), Constraint::Percentage(100),
Constraint::Min(3),
]); ]);
let [layout_intention, layout_duration, layout_titles] = layout.areas(frame.size()); let [layout_intention, layout_duration, layout_titles, layout_status] = layout.areas(frame.size());
let border_type_intention = if app.state == State::InputIntention { let border_type_intention = if app.state == State::InputIntention {
BorderType::Thick BorderType::Thick
} else { } else {
BorderType::Plain BorderType::Plain
}; };
let input_intention: Vec<Line> = vec![Line::from(Span::raw(&app.user_intention))]; let input_intention = Line::from(Span::raw(&app.user_intention));
frame.render_widget( frame.render_widget(
Paragraph::new(input_intention).block( Paragraph::new(input_intention).block(
Block::bordered() Block::bordered()
@@ -336,4 +342,28 @@ fn ui(frame: &mut Frame, app: &App) {
Paragraph::new(stats).block(Block::bordered().title("Session")), Paragraph::new(stats).block(Block::bordered().title("Session")),
layout_titles, layout_titles,
); );
let mut spans: Vec<Span> = Vec::new();
if app.user_intention.len() == 0 {
let span = Span::styled("Provide intention! ", Style::new().fg(Color::LightRed));
spans.push(span);
}
if app.user_duration == Duration::ZERO {
let span = Span::styled("Provide valid duration in minutes! ", Style::new().fg(Color::LightRed));
spans.push(span);
}
if app.state == State::InProgress {
let span = Span::styled("Session In-Progress", Style::new().fg(Color::LightGreen));
spans.push(span);
}
let input_status: Vec<Line> = vec![Line::from(spans)];
frame.render_widget(
Paragraph::new(input_status).block(
Block::bordered().title("Status"),
),
layout_status,
);
} }