First commit

This commit is contained in:
Vyn 2024-10-16 12:17:51 +02:00
commit 8585f5741f
13 changed files with 505 additions and 0 deletions

147
src/main.cpp Normal file
View file

@ -0,0 +1,147 @@
#include "app-window.h"
#include "slint_timer.h"
#include "slint.h"
#include <cstdlib>
class CountdownState {
public:
CountdownState(slint::ComponentHandle<ui::AppWindow> ui) : ui_(ui) {
ui_->global<ui::State>().set_break_countdown_duration(60 * 5);
ui_->global<ui::State>().set_focus_countdown_duration(60 * 25);
ui_->global<ui::State>().set_max_session_count(4);
reset();
}
ui::SessionStep sessionStep() const {
return ui_->global<ui::State>().get_sessions_step();
}
int currentSession() const {
return ui_->global<ui::State>().get_current_session();
}
void setCurrentSession(int newCurrentSession) const {
ui_->global<ui::State>().set_current_session(newCurrentSession);
}
int maxSessions() const {
return ui_->global<ui::State>().get_max_session_count();
}
void setSessionStep(ui::SessionStep newSessionStep) {
ui_->global<ui::State>().set_sessions_step(newSessionStep);
}
ui::CountdownStatus countdownStatus() const {
return ui_->global<ui::State>().get_countdown_status();
}
void setCountdownStatus(ui::CountdownStatus newCountdownStatus) {
ui_->global<ui::State>().set_countdown_status(newCountdownStatus);
}
void setCountdown(int newCountdownValue) {
ui_->global<ui::State>().set_countdown(newCountdownValue);
}
int countdown() const {
return ui_->global<ui::State>().get_countdown();
}
void toggleCountdown() {
if (countdownStatus() == ui::CountdownStatus::Running) {
pause();
} else if (countdownStatus() == ui::CountdownStatus::Paused || countdownStatus() == ui::CountdownStatus::NotStarted) {
start();
}
}
void goNextStep() {
if (sessionStep() == ui::SessionStep::Setup) {
setSessionStep(ui::SessionStep::Focus);
setCountdownStatus(ui::CountdownStatus::NotStarted);
setCountdown(ui_->global<ui::State>().get_focus_countdown_duration());
setCurrentSession(currentSession() + 1);
} else if (sessionStep() == ui::SessionStep::Focus) {
setSessionStep(ui::SessionStep::Break);
setCountdownStatus(ui::CountdownStatus::NotStarted);
setCountdown(ui_->global<ui::State>().get_break_countdown_duration());
} else if (sessionStep() == ui::SessionStep::Break) {
setCurrentSession(currentSession() + 1);
if (currentSession() < maxSessions()) {
setSessionStep(ui::SessionStep::Focus);
setCountdownStatus(ui::CountdownStatus::NotStarted);
setCountdown(ui_->global<ui::State>().get_focus_countdown_duration());
} else {
setSessionStep(ui::SessionStep::Finished);
}
}
}
void start() {
setCountdownStatus(ui::CountdownStatus::Running);
timer_.start(slint::TimerMode::Repeated, std::chrono::milliseconds(1000), [&]{
onTimerTick(&timer_, ui_);
});
}
void pause() {
setCountdownStatus(ui::CountdownStatus::Paused);
timer_.stop();
}
void reset() {
timer_.stop();
setSessionStep(ui::SessionStep::Setup);
setCountdownStatus(ui::CountdownStatus::NotStarted);
setCountdown(ui_->global<ui::State>().get_focus_countdown_duration());
setCurrentSession(0);
}
void onTimerTick(slint::Timer* timer, slint::ComponentHandle<ui::AppWindow> ui) {
int countdown = ui->global<ui::State>().get_countdown();
countdown--;
ui->global<ui::State>().set_countdown(countdown);
if (countdown == 0) {
timer->stop();
ui->global<ui::State>().set_countdown_status(ui::CountdownStatus::NotStarted);
// TODO make it customizable
system("notify-send -t 0 \"Pomodoro\" \"task\" &");
system("paplay /usr/share/sounds/freedesktop/stereo/complete.oga &");
goNextStep();
}
}
private:
slint::ComponentHandle<ui::AppWindow> ui_;
slint::Timer timer_;
};
int main(int argc, char **argv)
{
slint::ComponentHandle<ui::AppWindow> ui = ui::AppWindow::create();
CountdownState countdown(ui);
ui->on_start_stop([&]{
if (countdown.sessionStep() == ui::SessionStep::Setup || countdown.sessionStep() == ui::SessionStep::Finished) {
countdown.reset();
countdown.goNextStep();
countdown.start();
} else if (countdown.sessionStep() == ui::SessionStep::Focus || countdown.sessionStep() == ui::SessionStep::Break) {
countdown.toggleCountdown();
}
});
ui->global<ui::State>().on_config_changed([&] {
countdown.reset();
});
ui->run();
return 0;
}