#pragma once #include #include #include #include "glibmm/main.h" #include "sigc++/signal.h" class TimerService { struct TimerData { uint64_t duration; uint64_t timerId; }; public: static std::shared_ptr getInstance() { if (!instance) { instance = std::make_shared(); // add a timer to tick every second Glib::signal_timeout().connect([]() { instance->tick(); return true; // continue calling every second }, 1000); } return instance; } void addTimer(uint64_t duration) { this->timerAddedSignal.emit(std::to_string(duration), timerIdCounter); this->activeTimers[timerIdCounter] = TimerData{.duration = duration, .timerId = timerIdCounter}; timerIdCounter++; } void expireTimer(uint64_t timerId) { this->timerExpiredSignal.emit(timerId); } void removeTimer(uint64_t timerId) { this->activeTimers.erase(timerId); this->timerCancelledSignal.emit(timerId); } sigc::signal &getSignalTimerSet() { return this->timerAddedSignal; } sigc::signal &getSignalTimerExpired() { return this->timerExpiredSignal; } sigc::signal &getSignalTimerCancelled() { return this->timerCancelledSignal; } sigc::signal tickSignal; private: static inline uint64_t timerIdCounter = 0; sigc::signal timerAddedSignal; sigc::signal timerCancelledSignal; sigc::signal timerExpiredSignal; inline static std::shared_ptr instance = nullptr; std::map activeTimers; void tick() { for (auto &[id, timer] : activeTimers) { if (timer.duration > 0) { timer.duration--; } else if (timer.duration == 0) { expireTimer(timer.timerId); timer.duration = -1; // Mark as expired to prevent multiple expirations } } tickSignal.emit(); } };