#pragma once #include "app_framework.hpp" #include #include #include #include class AppSystem { public: explicit AppSystem(AppContext context); void registerApp(std::unique_ptr factory); bool startApp(const std::string& name); bool startAppByIndex(std::size_t index); void run(); [[nodiscard]] std::size_t appCount() const { return factories.size(); } [[nodiscard]] const IAppFactory* factoryAt(std::size_t index) const; [[nodiscard]] std::size_t indexOfFactory(const IAppFactory* factory) const; [[nodiscard]] std::size_t currentFactoryIndex() const { return activeIndex; } [[nodiscard]] const IApp* currentApp() const { return current.get(); } [[nodiscard]] const IAppFactory* currentFactory() const { return activeFactory; } private: template friend struct BasicAppContext; struct TimerRecord { AppTimerHandle id = kInvalidAppTimer; std::uint32_t generation = 0; std::uint32_t due_ms = 0; std::uint32_t interval_ms = 0; bool repeat = false; bool active = false; }; AppTimerHandle scheduleTimer(uint32_t delay_ms, bool repeat); void cancelTimer(AppTimerHandle handle); void cancelAllTimers(); void dispatchEvent(const AppEvent& event); void processDueTimers(std::uint32_t now, std::vector& outEvents); std::uint32_t nextTimerDueMs(std::uint32_t now) const; void clearTimersForCurrentApp(); TimerRecord* findTimer(AppTimerHandle handle); bool handlePendingSwitchRequest(); AppContext context; std::vector> factories; std::unique_ptr current; IAppFactory* activeFactory = nullptr; std::size_t activeIndex = static_cast(-1); std::vector timers; AppTimerHandle nextTimerId = 1; std::uint32_t currentGeneration = 0; InputState lastInputState{}; }; template AppTimerHandle BasicAppContext::scheduleTimerInternal(uint32_t delay_ms, bool repeat) { return system ? system->scheduleTimer(delay_ms, repeat) : kInvalidAppTimer; } template void BasicAppContext::cancelTimerInternal(AppTimerHandle handle) { if (system) system->cancelTimer(handle); } template void BasicAppContext::cancelAllTimersInternal() { if (system) system->cancelAllTimers(); }